Elasticsearch 条件排序

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

我有一个包含字段part1、part2、part3、part4、part5的文档,它们是由字符和数字组成的整个文档业务ID的一部分。有时仅出现第 1-3 部分,有时出现第 4-5 部分,有时出现所有部分。例如,文档可以有业务 ID:

  • 12 AR 1023 其中有三个部分:数字(part1)、字符串(part2)、数字(part3)
  • XX 421 有两部分:字符串(第 4 部分)、数字(第 5 部分)

总之,这个 id 可以有不同的格式,我必须对这些文档进行排序。算法是:如果存在part4和part5,则按part4、part5排序,否则按part1、part2、part3排序。

是否可以创建一个查询来以这种条件方式对所有文档进行排序?或者我需要按第 1 部分、第 2 部分、第 3 部分、第 4 部分、第 5 部分对它们进行排序。在这种方法中,我会在开始时按第 1-3 部分进行排序,这是错误的,因为如果存在第 4-5 部分,我需要按第 4-5 部分进行排序,并忽略其他部分。但是,当第 4-5 部分保存到文档中时,我可以删除其他部分,这样它们对于仅包含第 4-5 部分的所有文档都是透明的(如果第 4-5 部分存在,第 1-3 部分将失去其重要性,如果存在,可以将其删除)

我可以使用什么方法?

elasticsearch spring-data-elasticsearch
1个回答
0
投票

在Elasticsearch中,您可以使用基于脚本的排序方法来实现条件排序。

创建一个脚本来评估每个文档中是否存在第 4 部分和第 5 部分,并根据脚本的结果对文档进行排序。如果存在part4和part5,则按part4和part5排序;否则,按第 1 部分、第 2 部分和第 3 部分排序。

{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "source": "if (doc['part4.keyword'].size() > 0 && doc['part5.keyword'].size() > 0) { return [doc['part4.keyword'].value, doc['part5.keyword'].value]; } else { return [doc['part1.keyword'].value, doc['part2.keyword'].value, doc['part3.keyword'].value]; }"
        },
        "order": "asc"
      }
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.