是否可以编写Elasticsearch查询,该查询将仅返回给定字段中具有多个值的文档?我不在乎这些值是什么,只是一个字段有多个而不是1。
我希望查询匹配:
{
"color": ["red", "blue"]
},
{
"color": ["green", "yellow", "orange"]
}
但不是
{
"color": "red"
}
理想情况下,我宁愿避免在查询中使用脚本;它们在我的集群上被禁用。
答案 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}
}
}
}
您还可以将管道配置为索引的默认管道,因此您无需在索引应用程序逻辑中进行任何更改。