Elasticsearch分词字段查询返回匹配唯一值的实现方案咨询
问题1:是否需要单独创建新索引?
不需要。仅当你有百万级以上的唯一brand值、同时查询QPS极高的极端场景下才需要单独建值索引,常规业务场景直接复用现有索引即可满足需求。
问题2:是否可以复用当前索引的分词能力实现需求?
完全可以,你可以通过匹配查询+Terms聚合的方案实现,不需要修改现有索引结构,直接复用已有分词配置。
具体实现方案
你只需要把查询返回的文档数设为0,通过聚合筛选出符合匹配条件的去重brand值,再按匹配评分排序即可,以前缀搜索wo为例的示例DSL如下:
{ "query": { "prefix": { "brand": "wo" } }, "size": 0, // 不返回原始文档,仅返回聚合结果 "aggs": { "matched_brands": { "terms": { "field": "brand", "include": "wo.*", // 仅聚合以搜索词开头的brand值,过滤命中文档里其他不匹配的value "order": { "max_score": "desc" // 按匹配度从高到低排序 }, "size": 10 // 按需调整返回的结果数量 }, "aggs": { "max_score": { "max": { "script": "_score" } } } } } }
结果说明
查询返回的aggregations.matched_brands.buckets列表中,每个bucket的key就是你需要的按匹配度排序的去重brand值,完全符合你输入wo返回word1、word2、word3的需求。
如果你需要的是分词模糊匹配而不是前缀匹配,只需要把query部分替换为对应的match/match_phrase查询,同步调整include的正则过滤规则即可。
注意事项
如果你的brand字段是text类型,需要提前开启fielddata,或者给brand字段配置keyword类型的子字段,聚合时使用keyword子字段即可,避免Elasticsearch抛出异常。
内容的提问来源于stack exchange,提问作者mmoreram
相关产品推荐
相关产品推荐

