Elasticsearch查询具有多个值的字段

时间:2020-02-25 20:23:36

标签: elasticsearch

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

我希望查询匹配:

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

但不是

{
  "color": "red"
}

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

1 个答案:

答案 0 :(得分:2)

我不知道一种无需使用脚本即可运行的解决方案方法。但是您可以选择:

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

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}
    }
  }
}

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