我正在尝试使用elasticsearch来匹配嵌套数组中的所有值。例如。我的搜索数组是["1","2","3","4","5","6","7","8","9"]
我的文档包含一系列数组,如
"arr":[
["1","2","10"],
["4","5"],
["8","9","11"]
]
我需要匹配嵌套数组中的所有值,但只有一个嵌套数组需要匹配文档才能匹配。因此,在此示例中,只有第二个嵌套数组匹配,因为"4"
和"5"
都存在于搜索数组中(因此我的文档是匹配的)。我应该用什么样的查询来实现这个目标?
答案 0 :(得分:5)
你可以使用像这样的简单Groovy script
:
def match = false;
for (sub_array in _source.arr) {
match = match || (search_array.intersect(sub_array).size() == sub_array.size())
}
return match;
我们的想法是迭代所有arr
子数组,并检查与搜索数组的交集是否与子数组本身的大小相同。
将其包含在script
过滤器中,查询将如下所示:
POST index/type/_search
{
"query": {
"filtered": {
"filter": {
"script": {
"script": "def match = false; for (sub_array in _source.arr) {match = match || (search_array.intersect(sub_array).size() == sub_array.size())}; return match;",
"params": {
"search_array": [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
}
}
}
}
}
}
您还需要确保启用动态脚本以使其正常工作,即在elasticsearch.yml
文件中添加script.inline: on
并重新启动群集。