我正在使用Elasticsearch为产品目录提供搜索功能。 要求能够手动销售给定搜索词的结果集。
例如,自然搜索结果可能会给出结果(1),(2),(3),(4),(5),(6),而商品化结果可能更适合作为(6), (4),(5),(1),(2),(3)
我们目前在排序时使用“ bestsellerRank”字段,该字段的值是在填充弹性搜索索引之前在业务逻辑中计算的,因此,我们可能有多个文档具有相同的bestsellerRank值。
我尝试将下面的脚本添加到查询中,该脚本最初是我发现的here
下面的示例将为匹配iD“ 1364352860”的文档提供6的排序值,同时为不匹配的文档提供与该文档的畅销书排名相匹配的排序值。
"sort": [{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "if(params.scores.containsKey(doc['iD'].value)) { return params.scores[doc['iD'].value];} return doc['bestsellerRank'].value;",
"params": {
"scores": {
"1364352860": 6
}
}
},
"order": "asc"
}
}]
此脚本原则上有效,直到没有排序顺序为1-5的文档,或者直到有超过1个排序顺序为5等的文档为止。顺序6不再位于位置6,但是它应该确实出现在位置6,即使其上方的5个文档的排序顺序都从6开始。
SwifType是在Elasticsearch的基础上构建的,最近被他们收购,它具有“结果排名”功能,该功能本质上允许您将特定结果固定在特定位置,因此,此功能必须是可通过Elasticsearch的脚本引擎使用的功能。但是,我在任何地方都找不到这种功能的参考。
有人有尝试将弹性搜索结果固定或固定到指定位置的经验吗?