在Elasticsearch中按数组长度排序

9

有一个包含数组的字段,我想根据该字段的数组长度对文档进行排序。

示例文档:

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

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

因此,在排序上,结果应该首先显示文档2,然后再显示文档1。
5个回答

5
这里有两个选项。
1. 在映射中将令牌计数类型用作多字段 - 这样,另一个字段将被存储为多字段,其长度为数组的长度。您可以在此处了解更多信息:这里
2. 脚本 - 同样可以使用脚本来实现相同的效果。
``` { "sort": { "_script": { "script": "doc['countryCodes'].values.size()" } } } ```

3

对于Elasticsearch 5.6.7,查询应如下所示:

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

2
这样做的最简单方法是同时索引另一个包含数组长度的字段,然后根据该字段进行排序。
另一种方法是使用基于脚本的排序,并使用Groovy返回数组的长度。
{
  "query": {
    "match_all": {}
  },
  "sort": {
    "_script": {
      "script": "doc.countryCodes.values.size()"
    }
  }
}

还要确保启用动态脚本,才能使其正常工作。

2
对于 Elasticsearch 6.8,查询应该如下所示:
{
   "query": {
      "match_all": {}
   },
   "sort": {
      "_script": {
         "type": "number",
         "script": "doc.countryCodes.size()",
         "order": "desc"
      }
   }
}

1
对于Elasticsearch 7.6,对我有效的唯一方法是结合Kamel Mili的回答Vineeth Mohan的回答
POST /test/_search
{
  "sort": {
    "_script": {
      "type": "number",
      "script": "doc['countryCodes'].size()",
      "order": "desc"
    }
  },
  "query": {
    "match_all": {}
  }
}

如果countryCodes是一个普通的文本字段,您将需要
      "script": "doc['countryCodes.keyword'].size()",

相反。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接