首页 > 解决方案 > Elasticsearch 查询具有多个值的字段

问题描述

是否可以编写一个 Elasticsearch 查询,只返回在给定字段中具有多个值的文档?我不在乎这些值是什么,只是一个字段有多个,而不是 1。

我希望查询匹配:

{
  "color": ["red", "blue"]
},
{
  "color": ["green", "yellow", "orange"]
}

但不是

{
  "color": "red"
}

理想情况下,我宁愿避免在查询中使用脚本;它们在我的集群上被禁用。

标签: elasticsearch

解决方案


我不知道不使用脚本就可以工作的解决方案。但你有选择:

准备工作:索引一些示例文档

POST my_index/_bulk
{"index": {"_id": 1}}
{"color": ["red", "blue"]}
{"index": {"_id": 2}}
{"color": ["green", "yellow", "orange"]}
{"index": {"_id": 3}}
{"color": ["grey"]}

选项 1:在查询时使用脚本(“昂贵”)

GET my_index/_search
{
  "query": {
    "script": {
      "script": "doc.color.size() > 1"
    }
  }
}

选项 2:在索引时使用脚本(“便宜”)

(首选方法,因为脚本在每次文档写入时只执行一次)

PUT _ingest/pipeline/set_number_of_colors
{
  "processors": [
    {
      "script": {
        "lang": "painless",
        "source": "ctx.number_of_colors = ctx.color.size()"
      }
    }
  ]
}

POST my_index/_update_by_query?pipeline=set_number_of_colors

GET my_index/_search
{
  "query": {
    "range": {
      "number_of_colors": {"gt": 1}
    }
  }
}

您还可以将管道配置为索引的默认管道,因此您无需更改索引应用程序逻辑中的任何内容。


推荐阅读