Flutter中elastic_client的Query.range时间范围查询用法求助
使用elastic_client实现Elasticsearch时间范围查询
一、elastic_client的Query.range实现
根据你提供的curl请求,对应的Query.range实现如下,完全映射原请求的参数逻辑:
import 'package:elastic_client/elastic_client.dart'; import 'package:elastic_client/transport.dart'; Future<void> _callElastic() async { // 初始化Elasticsearch HTTP传输客户端 final transport = HttpTransport(Uri.parse('http://localhost:9200')); final client = ElasticClient(transport); try { // 构建时间范围查询 final query = Query.range( '@timestamp', gte: '2022-08-16T16:18:00+09:00', lte: 'now', format: 'date_time_no_millis', ); // 执行搜索请求 final response = await client.search( index: 'index', query: query, ); // 处理返回结果 print('匹配总数: ${response.hits.total}'); for (var hit in response.hits.hits) { print(hit.source); } } catch (e) { print('查询失败: $e'); } finally { // 关闭客户端释放资源 client.close(); } }
参数对应说明:
'@timestamp':指定要筛选的时间字段,与curl请求中的字段名完全一致gte:对应curl的"gte"参数,设置时间范围的起始值lte:对应curl的"lte"参数,传入'now'让Elasticsearch自动解析为当前时间format:对应curl的"format"参数,指定时间字符串的解析格式
二、替代方案:直接用http包发送请求
如果觉得elastic_client的API不够直观,也可以直接用Flutter自带的http包手动构造JSON请求,完全复用你熟悉的curl请求结构:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<void> _callElasticWithHttp() async { final url = Uri.parse('http://localhost:9200/index/_search'); final requestBody = jsonEncode({ "query": { "range": { "@timestamp": { "gte": "2022-08-16T16:18:00+09:00", "lte": "now", "format": "date_time_no_millis" } } } }); try { final response = await http.get( url, headers: {'Content-Type': 'application/json'}, body: requestBody, ); if (response.statusCode == 200) { final data = jsonDecode(response.body); print('匹配总数: ${data['hits']['total']}'); for (var hit in data['hits']['hits']) { print(hit['_source']); } } else { print('请求失败: 状态码 ${response.statusCode}'); } } catch (e) { print('请求异常: $e'); } }
这种方式无需依赖第三方Elasticsearch客户端包,直接复用已有curl请求的JSON结构,学习成本更低。
内容的提问来源于stack exchange,提问作者Syukun MiMis_
相关产品推荐
相关产品推荐

