【问题标题】:Keep id order as in query保持 id 顺序如查询
【发布时间】:2013-01-09 14:29:14
【问题描述】:

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

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

【问题讨论】:

    标签: elasticsearch tire


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢,我猜轮胎还不支持Multi-Get。在那之前我会坚持我简单的基于红宝石的解决方案......
    【解决方案2】:

    一种选择是使用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'}] 
    

    【讨论】:

      【解决方案3】:

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

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

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

      它将保持输入的顺序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 2022-08-14
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 2015-10-31
        相关资源
        最近更新 更多