我有一个包含字段part1、part2、part3、part4、part5的文档,它们是由字符和数字组成的整个文档业务ID的一部分。有时仅出现第 1-3 部分,有时出现第 4-5 部分,有时出现所有部分。例如,文档可以有业务 ID:
总之,这个 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中,您可以使用基于脚本的排序方法来实现条件排序。
创建一个脚本来评估每个文档中是否存在第 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"
}
}
]
}