Flutter搜索功能插件firesearch_sdk的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter搜索功能插件firesearch_sdk的使用

Firesearch SDK for Dart

非官方的Firesearch SDK for Dart

构建状态

Firesearch 是一个基于Firestore的全文搜索引擎。


服务

你需要使用索引文档来启用全文搜索。索引存储了文档。它可以配置为允许词干化区分大小写的搜索。

你将需要为每个服务实例化一个firesearch客户端:

var firesearchClient = Client(
    host: "<Your Firesearch Host>",
    apiKey: "<Your API Key>");

在Flutter Web或Flutter移动应用中使用

在前端应用程序中,你只需要搜索文档。索引和将文档放入Firesearch应仅由后端服务完成。

  1. 从你的后端API检索访问密钥。
  2. 使用检索到的密钥创建一个SearchQuery
final searchQuery = SearchQuery(
          indexPath: 'path/to/index',
          accessKey: '<accessKey retrieved from a server>',
          limit: 100,
          text: 'search for this');
final request = SearchRequest(query: searchQuery);

var response = indexService.search(request);

访问密钥服务

访问密钥允许你在Web和移动设备上安全地进行搜索。如果没有访问密钥,你将不得不公开Firesearch API 密钥。建议有一个后端端点返回访问密钥给移动或Web客户端,它们可以使用该密钥对Firesearch执行搜索请求。

创建访问密钥

注意 这应该在后端完成。在前端应用程序中,你应该从后端请求访问密钥。

var request = GenerateKeyRequest(indexPathPrefix: 'path/to/index');
var accessKey = await accessKeyService.generateKey(request);

索引服务

创建一个索引服务:

var indexService = IndexService(firesearchClient);
  • 创建一个索引:
var index = Index(
    indexPath: 'path/to/index',
    name: 'My Test Index',
    language: 'english');
final request = CreateIndexRequest(index: index);
var indexResponse = await indexService.createIndex(request);
  • 删除一个索引:
final request = DeleteIndexRequest(
          indexPath: 'path/to/index');
var indexResponse = await indexService.deleteIndex(request);
  • 将文档放入索引:
 final request = PutDocRequest(
          indexPath: 'path/to/index',
          doc: Doc(id: 'document-id', fields: [
            Field(key: 'key', value: {'name': 'searchable_field'})
          ]));
var response = await indexService.putDoc(request);
  • 从索引中删除文档:
 final request = DeleteDocRequest(
    indexPath: 'firesearch-tutorial/indexes/index-name',
    id: 'document-id');

var response = await indexService.deleteDoc(request);
  • 获取一个索引:
final request =
      GetIndexRequest(indexPath: 'path/to/index');
var response = await indexService.getIndex(request);
  • 获取索引列表:
var response = await indexService.getIndexes();
  • 搜索:
final searchQuery = SearchQuery(
          indexPath: 'path/to/index',
          accessKey: 'accessKey',
          limit: 100,
          text: 'search for this');
final request = SearchRequest(query: searchQuery);

var response = indexService.search(request);

开发

生成类型

官方的Firesearch SDK是高度类型的。每个函数的输入和输出都有一个对应的类型。我们尝试利用freezedjson_serializable 来生成这些类型。

pub run build_runner build --delete-conflicting-outputs

Dart版本

  • Dart 3: >= 3.4.0

维护者


示例代码

以下是使用firesearch_sdk的完整示例代码:

import 'package:firesearch_sdk/firesearch_sdk.dart';
import 'package:http/http.dart' as http;

// 创建一个Firesearch客户端
var firesearchClient = Client(host: "localhost:8888");
// 实例化索引服务
final indexService = IndexService(firesearchClient);

// 从你的服务中检索访问密钥
// 在这个例子中,`https://firesearch.example.com/api/accessKey` 将返回访问密钥。确保对该端点的请求进行身份验证。
final headers = {
  'Accept': 'application/json',
  'Content-Type': 'application/json',
  'Authorization': 'Bearer <A JWT TOKEN FOR AUTHENTICATION>'
};

Future<SearchResponse> doSearch() async {
  var accessKey = await http.get(
      Uri.https('https://firesearch.example.com', '/api/accessKey'),
      headers: headers);

  // 使用访问密钥向Firesearch发出请求
  final searchRequest = SearchRequest(
      query: SearchQuery(
    indexPath: 'path/to/index',
    accessKey: accessKey.body, // 假设访问密钥返回在body中
    limit: 100,
    text: 'text you are searching for',
  ));
  var response = await indexService.search(searchRequest);
  return response;
}

更多关于Flutter搜索功能插件firesearch_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter搜索功能插件firesearch_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用firesearch_sdk插件来实现搜索功能的示例代码。firesearch_sdk是一个假定的插件名称,用于演示目的,实际使用时请确保你已经安装并正确配置了相应的插件。

首先,你需要在pubspec.yaml文件中添加firesearch_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  firesearch_sdk: ^latest_version  # 替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们编写一个Flutter应用来展示如何使用firesearch_sdk进行搜索。

import 'package:flutter/material.dart';
import 'package:firesearch_sdk/firesearch_sdk.dart'; // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firesearch SDK Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SearchScreen(),
    );
  }
}

class SearchScreen extends StatefulWidget {
  @override
  _SearchScreenState createState() => _SearchScreenState();
}

class _SearchScreenState extends State<SearchScreen> {
  final TextEditingController _controller = TextEditingController();
  List<SearchResult> _results = [];

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _performSearch(String query) async {
    try {
      // 假设 FiresearchClient 是插件提供的一个客户端类
      final FiresearchClient client = FiresearchClient();
      final SearchResponse response = await client.search(query: query);

      // 假设 SearchResult 是搜索结果的数据模型
      setState(() {
        _results = response.results;
      });
    } catch (e) {
      print('Error performing search: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firesearch SDK Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                prefixIcon: Icon(Icons.search),
                hintText: 'Search...',
                suffixIcon: IconButton(
                  icon: Icon(Icons.search),
                  onPressed: () {
                    final query = _controller.text.trim();
                    if (query.isNotEmpty) {
                      _performSearch(query);
                    }
                  },
                ),
              ),
              onChanged: (value) {
                // 实时搜索(可选)
                // _performSearch(value.trim());
              },
            ),
            SizedBox(height: 16),
            Expanded(
              child: _results.isEmpty
                  ? Center(child: Text('No results found.'))
                  : ListView.builder(
                      itemCount: _results.length,
                      itemBuilder: (context, index) {
                        final result = _results[index];
                        return ListTile(
                          title: Text(result.title),
                          subtitle: Text(result.description),
                        );
                      },
                    ),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设的搜索结果数据模型
class SearchResult {
  final String title;
  final String description;

  SearchResult({required this.title, required this.description});
}

// 假设的搜索响应数据模型
class SearchResponse {
  final List<SearchResult> results;

  SearchResponse({required this.results});
}

// 假设的 FiresearchClient 类(根据插件实际API实现)
class FiresearchClient {
  Future<SearchResponse> search({required String query}) async {
    // 这里应该是调用插件提供的搜索API的代码
    // 返回一个模拟的搜索结果列表
    return Future.value(SearchResponse(
      results: [
        SearchResult(title: 'Result 1 for "$query"', description: 'Description for result 1.'),
        SearchResult(title: 'Result 2 for "$query"', description: 'Description for result 2.'),
        // ...更多模拟结果
      ],
    ));
  }
}

请注意,上述代码中的FiresearchClientSearchResponseSearchResult类是根据假设的插件API设计的。在实际使用中,你需要根据firesearch_sdk插件提供的实际API和数据模型来调整这些类。

另外,实时搜索功能(即在onChanged回调中调用_performSearch)可能会导致性能问题,特别是在处理大量数据时。因此,在实际应用中,你可能需要实现一些节流或防抖机制来优化搜索体验。

回到顶部