Flutter全文搜索插件elastic_app_search的使用
Flutter全文搜索插件elastic_app_search的使用
简介
elastic_app_search
是一个用于在Flutter应用中集成Elastic App Search服务的包。它提供了一个简单的API,可以轻松地进行查询并处理结果。要使用此服务,您需要有一个活跃的Elastic部署。
⚠️ 注意: 使用此服务前,请确保您已经在 Elastic Cloud 上拥有一个有效的部署。
快速开始
初始化ElasticAppSearch实例
在执行任何操作之前,您需要创建一个ElasticAppSearch
实例:
final service = ElasticAppSearch(
endPoint: "https://your-endpoint-url",
searchKey: "your-search-key",
);
提示:
endPoint
和searchKey
可以在您的Elastic部署中的“App Search”->“Credentials”页面找到。
创建引擎实例
所有查询都必须发送到一个引擎。创建引擎实例非常简单:
final engine = service.engine("engine_name");
执行查询
接下来,您可以创建一个查询,并添加各种过滤器和选项来细化搜索结果:
ElasticResponse response = await engine
.query("mountains")
.filter("states", isEqualTo: "California")
.filter("world_heritage_site", isEqualTo: true)
.resultField("title")
.resultField("description", snippetSize: 140)
.page(1, size: 50)
.get();
上述代码将搜索包含“mountains”的文档,同时根据特定条件(如位置在加利福尼亚州且为世界遗产)进行筛选,并仅返回标题及描述字段的部分内容。
完整示例:国家公园搜索应用
下面是一个完整的例子,展示了如何构建一个带有实时搜索、过滤功能的应用程序。该应用程序允许用户通过输入关键字来查找国家公园,并可以通过侧边栏选择不同的过滤条件来进一步缩小搜索范围。
主要功能
- 搜索框支持动态查询。
- 弹出菜单允许用户按是否是世界遗产地筛选公园。
- 显示地图上的距离范围。
示例代码
import 'package:flutter/material.dart';
import 'package:elastic_app_search/elastic_app_search.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'National Parks Search',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const ParkSearchPage(),
);
}
}
class ParkSearchPage extends StatefulWidget {
const ParkSearchPage({super.key});
@override
State<ParkSearchPage> createState() => _ParkSearchPageState();
}
class _ParkSearchPageState extends State<ParkSearchPage> {
final TextEditingController _controller = TextEditingController();
List<Map<String, dynamic>> _results = [];
bool _isLoading = false;
Future<void> _performSearch(String query) async {
setState(() {
_isLoading = true;
});
try {
final service = ElasticAppSearch(
endPoint: "https://host-2376rb.api.swiftype.com",
searchKey: "search-371auk61r2bwqtdzocdgutmg",
);
final response = await service
.engine("search-ui-examples")
.query(query)
.filter("states", isEqualTo: "California")
.filter("world_heritage_site", isEqualTo: true)
.resultField("title")
.resultField("description", snippetSize: 140)
.page(1, size: 50)
.get();
setState(() {
_results = response.results.map((result) => result.data!).toList();
});
} catch (e) {
print('Error performing search: $e');
} finally {
setState(() {
_isLoading = false;
});
}
}
@override
void initState() {
super.initState();
_controller.addListener(() {
if (_controller.text.isNotEmpty && _controller.text.length >= 3) {
_performSearch(_controller.text);
}
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('National Parks'),
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: _controller,
decoration: const InputDecoration(
labelText: 'Search parks...',
border: OutlineInputBorder(),
),
),
),
Expanded(
child: _isLoading
? const Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: _results.length,
itemBuilder: (context, index) {
final park = _results[index];
return ListTile(
title: Text(park['title']),
subtitle: Text(park['description']),
);
},
),
),
],
),
);
}
}
这个例子演示了如何结合文本输入框与elastic_app_search
库一起工作,实现基本的搜索功能。实际应用中还可以扩展更多特性,比如地理位置筛选、分页加载等。希望这能帮助您更好地理解和使用elastic_app_search
插件!
更多关于Flutter全文搜索插件elastic_app_search的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html