在查询中保持id顺序

时间:2013-01-09 14:29:14

标签: elasticsearch tire

我使用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 ......

你知道我怎么能做到这一点吗?

2 个答案:

答案 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'}]