Elasticsearch 6.6.4如何设置搜索索引优先级,让指定索引结果靠前?
如何在Elasticsearch 6.6.4中实现跨索引搜索优先级
你说得没错,Elasticsearch官方文档里的priority参数确实是和索引恢复、分片分配相关的,和搜索结果排序优先级不沾边。不过针对你想让user索引内容优先返回的需求,有两个非常实用的办法,都是6.6.4版本完全支持的:
方法1:查询时直接给目标索引加Boost值
这是最简单直接的方式,在指定搜索索引的时候,给user索引加上一个大于1的boost系数(数值越高,权重越大),这样匹配到user索引的文档得分会被放大,自然排在前面。
举个例子,假设你要搜索关键词"john",可以这么写查询:
GET /user^5,expert,admin,support,superadmin/_search { "query": { "match": { "username": "john" } } }
这里的^5就是给user索引设置了5倍的权重,其他索引默认权重是1。你可以根据实际搜索效果调整这个数值,比如改成3或者10,直到达到你想要的排序效果。
方法2:用function_score自定义索引权重(更灵活)
如果你的需求更复杂——比如不仅要优先user,还想给expert、admin这类索引设置中等权重,support、superadmin权重最低——那function_score查询会更适合你。它允许你针对不同索引的文档设置不同的权重规则。
示例代码如下:
GET /user,expert,admin,support,superadmin/_search { "query": { "function_score": { "query": { "match": { "username": "john" } }, "functions": [ // 给user索引的匹配文档加5倍权重 { "filter": { "indices": { "indices": ["user"] } }, "weight": 5 }, // 给expert和admin索引加2倍权重 { "filter": { "indices": { "indices": ["expert", "admin"] } }, "weight": 2 } // 剩下的support、superadmin索引默认权重为1,无需额外配置 ], "score_mode": "sum" } } }
score_mode这里用sum表示将原始查询得分和权重得分相加,你也可以根据需求换成multiply(相乘)等其他模式。
小提示
- Boost值是相对概念,不用纠结绝对数字,只要保证
user的权重比其他索引高就行 - 如果这种优先级搜索是你的常用场景,可以把查询封装成搜索模板,避免每次重复写相同的权重逻辑
内容的提问来源于stack exchange,提问作者Vatsal Rahul
相关产品推荐
相关产品推荐

