我在ElasticSearch中实现了一个自动完成索引,并遇到了排序/评分问题.假设我在索引中有以下字符串:
apple banana coconut donut apple banana donut durian apple donut coconut durian donut banana coconut durian
当我搜索"甜甜圈"时,我希望结果按照术语位置排序,如下所示:
donut banana coconut durian apple donut coconut durian apple banana donut durian apple banana coconut donut
我无法弄清楚如何实现这一目标.术语位置没有考虑到默认评分逻辑中,我找不到在那里获得它的方法.看起来像一个简单的问题,但其他人之前必须遇到这个问题.有人想出来了吗?
谢谢!
您可以进行自定义排序,如下所示:
{ "query": { "match": { "content": "donut" } }, "sort": { "_script": { "script": "termInfo=_index['content'].get('donut',_OFFSETS);for(pos in termInfo){return _score+pos.startOffset};", "type": "number", "order": "asc" } } }
在那里我刚刚回来了startOffset
.如果您需要其他东西,请使用这些价值观和原始评分,并根据您的需求提供舒适的价值.
或者你可以这样做:
{ "query": { "function_score": { "query": { "match": { "content": "donut" } }, "script_score": { "script": "termInfo=_index['content'].get('donut',_OFFSETS);for(pos in termInfo){return pos.startOffset};" }, "boost_mode": "replace" } }, "sort": [ { "_score": "asc" } ] }
在任何一种情况下,您需要在映射中为该特定字段指定:
"content": { "type": "string", "index_options": "offsets" }
意思index_options
需要设置为offsets
.这里有更多细节.