我使用elasticsearch来获取id到某些值的映射,但是我必须按照id的顺序保持结果的顺序。
示例:
def term_mapping(ids)
ids = ids.split(',')
self.search do |s|
s.filter :terms, id: ids
end
end
res = term_mapping("4,2,3,1")
结果集合应包含具有id的对象,顺序为4,2,3,1 ......
你知道我怎么能做到这一点吗?
答案 0 :(得分:1)
如果您需要使用搜索,您可以在将id发送到elasticsearch之前对其进行排序,并按id排序结果,或者您可以创建一个自定义排序脚本,该脚本将返回当前文档在ID数组中的位置。但是,更简单,更快速的解决方案是简单地使用Multi-Get而不是搜索。
答案 1 :(得分:0)
一种选择是使用Multi GET API。如果这对您不起作用,则另一种解决方案是在从es中检索结果后对结果进行排序。在python中,这可以通过以下方式完成:
doc_ids = ["123", "333", "456"] # We want to keep this order
order = {v: i for i, v in enumerate(doc_ids)}
es_results = [{"_id": "333"}, {"_id": "456"}, {"_id": "123"}]
results = sorted(es_results, key=lambda x: order[x['_id']])
# Results:
# [{'_id': '123'}, {'_id': '333'}, {'_id': '456'}]