如何使用复杂条件限制Elasticsearch建议?
如何用复杂多字段条件限制Elasticsearch建议?
当然可以用collate来实现这类复杂条件过滤,而且它完全支持包含match、must/should/must_not的Bool查询逻辑——这正是给建议结果加上多字段复杂限制的标准方案。
核心逻辑说明
Elasticsearch的建议(suggest)默认只基于分词、前缀等规则生成候选结果,collate的作用就是对每个生成的候选执行你指定的查询,仅保留能命中该查询的建议,相当于给建议加了一层精准的业务过滤。
完整示例代码
下面是把你提供的复杂Bool查询整合到Completion Suggest中的示例:
{ "suggest": { "product_suggest": { "prefix": "sa", "completion": { "field": "product_name.completion", "collate": { "query": { "bool": { "must": [ {"terms": {"brand": ["micromax", "samsung"]}}, { "bool": { "should": [ {"range": {"price": {"gte": 6000, "lte": 10000}}}, {"range": {"price": {"gte": 16000, "lte": 30000}}} ], "minimum_should_match": 1 } } ] } }, "prune": true } } } } }
关键细节解释
prune: true:开启后会自动剔除不满足collate查询的建议候选,不用手动处理结果。- collate内部的
query:可以是任何合法的Elasticsearch查询,支持嵌套Bool、match全文匹配、range范围过滤、terms枚举匹配等所有你需要的逻辑,完全兼容must/should/must_not的组合。 - 如果你需要复用参数,可以把变量放在
params字段里,在query中用{{变量名}}引用,方便动态调整过滤条件。
另外,除了Completion Suggest,Term Suggest和Phrase Suggest也同样支持collate逻辑,用法完全一致。
内容的提问来源于stack exchange,提问作者hesamodin monfared
相关产品推荐
相关产品推荐

