Elasticsearch查询与Phrase Suggester结合的执行逻辑及触发问询
Phrase Suggester 与查询的执行关系及需求实现方案
一、Suggester 和查询的执行逻辑
Suggester 是独立于查询执行的,不会等待查询完成后再判断是否运行。默认的missing模式,判断依据是索引中是否存在输入的短语,而非当前查询是否命中结果。
举两个典型场景:
- 若索引里存在你输入的短语,哪怕你的查询因过滤条件未命中任何文档,Suggester 也不会返回建议;
- 若索引里没有该短语,哪怕你的查询碰巧命中了其他相关文档,Suggester 仍会生成建议。
二、实现“查询找到结果时不触发 Suggester”的方案
你的核心需求是“查询有命中就不给建议,无命中才生成建议”,默认的missing模式无法满足,推荐两种可行做法:
1. 应用层分两次请求(最简单直接)
先执行查询,拿到返回结果后查看hits.total.value:
- 若数值大于 0,说明有命中,无需再发起 Suggester 请求;
- 若数值等于 0,再发起带有 Suggester 的请求。
2. 用 ES 搜索模板动态控制
可以借助 ES 的search_template功能,结合 Mustache 模板语法,在请求内判断查询命中数,仅当命中数为 0 时才返回 Suggester 结果。示例模板如下:
{ "script": { "lang": "mustache", "source": """ { "query": {{#toJson}}query{{/toJson}}, {{#if hits.total.value '===' 0}} "suggest": {{#toJson}}suggest{{/toJson}} {{/if}} } """ }, "params": { "query": { "match": { "title": "你的输入文本" } }, "suggest": { "my-suggestion": { "text": "你的输入文本", "phrase": { "field": "title.trigram" } } } } }
不过这种方式需要提前创建模板,复杂度高于第一种方案,一般优先推荐前者。
内容的提问来源于stack exchange,提问作者carryall
相关产品推荐
相关产品推荐

