如何将ES高版本intervals查询转换为6.x版本兼容的可运行查询语句
ES 6.x 兼容intervals查询改写方案
原方案问题分析
你写的query_string语法里的"title phrase in en"~3对应的是短语查询的slop参数为3,仅允许匹配的短语词之间最多有3个间隔/词的位置移动,和原intervals查询的max_gaps: -1(无间隔限制)逻辑完全不符,因此无法实现相同效果。
原intervals查询的核心匹配规则:
ordered: true:要求匹配的词和查询短语的词序完全一致max_gaps: -1:匹配的相邻词之间允许存在任意数量的其他词,无间隔上限
正确改写实现
ES 6.x 可以用原生支持的span_near查询完全对齐上述规则,改写后的完整查询如下:
GET /myindex/_search { "query": { "bool": { "should": [ { "span_near": { "clauses": [ {"span_term": {"title_en": "title"}}, {"span_term": {"title_en": "phrase"}}, {"span_term": {"title_en": "in"}}, {"span_term": {"title_en": "en"}} ], "slop": 2147483647, "in_order": true } }, { "span_near": { "clauses": [ {"span_term": {"title_de": "title"}}, {"span_term": {"title_de": "phrase"}}, {"span_term": {"title_de": "in"}}, {"span_term": {"title_de": "de"}} ], "slop": 2147483647, "in_order": true } } ], "minimum_should_match": 1, "filter": [ { "terms": {"status.id": [1,2]} } ] } } }
参数对应说明
span_near.in_order: true完全对应原intervals.ordered: true的词序要求slop: 2147483647是ES支持的最大slop值,可模拟max_gaps: -1的无间隔限制效果
可选优化方案
如果你实际需求是严格匹配连续的短语(中间不允许插入其他词),可以直接用性能更优的match_phrase查询:
{ "match_phrase": { "title_en": "title phrase in en" } }
该查询默认slop为0,对应max_gaps: 0、ordered: true的intervals效果。
内容的提问来源于stack exchange,提问作者hamid reza
相关产品推荐
相关产品推荐

