ElasticSearch 按数组中的 id 排序

问题描述 投票:0回答:2

有没有办法以相同的方向对一些elasticsearch响应进行排序,我正在发布一个带有ids的数组?

示例:数组[23,45,67],结果应该以与 ID 相同的方式排序:首先是 ID 为 23 的所有行,然后是 ID 为 45 的所有行,最后是 ID 为 67 的所有行?

谢谢 尼克

sorting elasticsearch
2个回答
0
投票

您可以在排序中使用脚本,或者其他选项是使用 bool - 应该查询使用这些值增强文档的位置。


0
投票

您可以使用无痛代码来解决这种情况:

假设一个基本查询:

{
   "_source": ["*"],
   "query": {...},
   "sort": [...]

}

您可以在排序子句中添加此脚本:

[
            {
                "_script": {
                    "type": "number",
                    "script": {
                        "lang": "painless",
                        "params": {
                            "docIds":[23,45,67]
                        },
                        "source":
                            "def docId = doc['original_id'].value; "
                            "def rank = params.docIds.indexOf(docId); "
                            "if (rank == -1) "
                            "   { rank = params.docIds.size(); } "
                            "else "
                            "   { rank += 1; } "
                            "return rank;"
                    }
                }
            }
        ]

这将为数组中的三个元素分配分数 1、2、3,并为所有其余元素分配分数 4。

这是一个例子:

{
  "from": 1,
  "size": 20,
  "_source": {
    "includes": ["*"]
  },
  "query": {
    "bool": {
      match_all:{}
    }
  },
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "lang": "painless",
          "params": {
            "docIds": [23,45,67]
          },
          "source": "def docId = doc['original_id'].value; def rank = params.docIds.indexOf(docId); if (rank == -1)    { rank = params.docIds.size(); } else    { rank += 1; } return rank;"
        }
      }
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.