5

我正在使用 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... 的对象

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

4

3 回答 3

0

如果您需要使用搜索,您可以在将 id 发送到 elasticsearch 之前对它们进行排序并检索按 id 排序的结果,或者您可以创建一个自定义排序脚本,该脚本将返回当前文档在 id 数组中的位置。然而,一个更简单和更快的解决方案是简单地使用Multi-Get而不是搜索。

于 2013-01-09T14:49:55.723 回答
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'}] 
于 2019-08-06T19:47:00.300 回答
0

可能这个问题已经解决了,但是有人会帮助这个答案

我们可以将pinned_query用于 ES。不需要循环进行排序

**qs = {
      "size" => drug_ids.count,
      "query" => {
        "pinned" => {
          "ids" => drug_ids,
          "organic" => {
              "terms": {
                "id": drug_ids
              }
          }
        }
      }
    }**

它将保持输入的顺序

于 2022-03-02T09:01:45.080 回答