ElasticSearch布尔查询中nGram多字段自动补全失效问题求助
解决布尔查询中match查询失效的问题
首先咱们先揪出最可能的核心原因——时间范围不匹配!我算了下你给出的示例文档的@timestamp:2018-01-23T10:22:46.689Z转换成毫秒级时间戳是1516707766689,但你布尔查询里的range条件是from: 1516881600000到to: 1516882500000,这个时间段对应的是2018-01-25 02:00:00 UTC到2018-01-25 02:15:00 UTC,和示例文档的日期差了整整两天!这就是为啥布尔查询没命中的关键——示例文档根本不在你指定的时间范围内。
如果你的时间范围是笔误,修正后还是没结果,可以试试下面的方案:
调整布尔查询的结构
把match查询从filter移到must里,虽然filter和must都要求条件满足,但有时候在复杂查询中,把所有匹配条件放在must里更直观,也能避免一些潜在的上下文差异问题:
{ "query": { "bool": { "must": [ { "range": { "@timestamp": { "from": 1516707000000, "to": 1516708000000, "include_lower": true, "include_upper": true, "format": "epoch_millis", "boost": 1.0 } } }, { "match": { "_all": { "query": "shop mi", "operator": "and", "boost": 1.0 } } } ], "boost": 1.0 } } }
排查其他潜在问题
- 用
_explainAPI分析查询:针对示例文档的ID,调用GET /your_index/_doc/your_doc_id/_explain,传入你的布尔查询,看看Elasticsearch具体是怎么判断不匹配的,能帮你精准定位到哪个条件没满足。 - 确认
_all字段的配置:如果你的索引里_all字段被禁用或者自定义了分析器,可能会导致查询行为不一致,检查一下索引的mapping确保_all字段是启用且使用了你配置的nGram分析器。
内容的提问来源于stack exchange,提问作者Hrachya Yeghishyan
相关产品推荐
相关产品推荐

