在elasticsearch中基于数组长度排序

z8dt9xmd  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(5)|浏览(241)

有一个存储数组的字段。我想根据该字段的数组长度对文档进行排序。
样本文件

document 1 = {
"countryCodes" : ["US","UK","UA","IN"]
}

document 2 ={
"countryCodes" : ["FR","SU","UG","UK","US"]
}

因此,在排序时,结果应该首先显示文档2,然后显示文档1。

rnmwe5a2

rnmwe5a21#

这里有两个选择。
1.使用标记计数类型作为Map中的多字段-这样,另一个字段将被存储为具有数组长度的多字段。你可以了解更多关于here
1.脚本-使用脚本也可以实现相同的功能。
{“sort”:{“_script”:{“script”:“doc['countryCodes'].values.size()”} } }

lrl1mhuk

lrl1mhuk2#

对于Elasticsearch 5.6.7,查询应该是这样的:

GET index/_search
{
    "query": {
        "match_all": {}
    },
    "sort": {
        "_script": {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "doc.countryCodes.values.size()"
            },
            "order" : "desc"
        }
    }
}
disbfnqx

disbfnqx3#

最简单的方法是同时索引另一个包含数组长度的字段,然后对该字段进行排序。
另一种方法是使用基于脚本的排序,并使用groovy返回数组的长度。

{
  "query": {
    "match_all": {}
  },
  "sort": {
    "_script": {
      "script": "doc.countryCodes.values.size()"
    }
  }
}

还要确保启用动态脚本以使其工作。

iyr7buue

iyr7buue4#

对于Elasticsearch 6.8,查询应该是这样的:

{
   "query": {
      "match_all": {}
   },
   "sort": {
      "_script": {
         "type": "number",
         "script": "doc.countryCodes.size()",
         "order": "desc"
      }
   }
}
i1icjdpr

i1icjdpr5#

对于Elasticsearch 7.6,唯一对我有用的是Kamel Mili's answerVineeth Mohan's answer的组合:

POST /test/_search
{
  "sort": {
    "_script": {
      "type": "number",
      "script": "doc['countryCodes'].size()",
      "order": "desc"
    }
  },
  "query": {
    "match_all": {}
  }
}

如果countryCodes是常规文本字段,则需要

"script": "doc['countryCodes.keyword'].size()",

而是

相关问题