Flutter搜索功能插件firesearch_sdk的使用
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应仅由后端服务完成。
- 从你的后端API检索访问密钥。
- 使用检索到的密钥创建一个
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是高度类型的。每个函数的输入和输出都有一个对应的类型。我们尝试利用freezed 和 json_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
更多关于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.'),
// ...更多模拟结果
],
));
}
}
请注意,上述代码中的FiresearchClient
、SearchResponse
和SearchResult
类是根据假设的插件API设计的。在实际使用中,你需要根据firesearch_sdk
插件提供的实际API和数据模型来调整这些类。
另外,实时搜索功能(即在onChanged
回调中调用_performSearch
)可能会导致性能问题,特别是在处理大量数据时。因此,在实际应用中,你可能需要实现一些节流或防抖机制来优化搜索体验。