使用elasticsearch匹配嵌套数组中的所有值

Moh*_*han 5 arrays intersection elasticsearch

我试图使用elasticsearch来匹配嵌套数组中的所有值.例如.我的搜索数组是["1","2","3","4","5","6","7","8","9"] ,我的文档包含一系列数组

"arr":[
["1","2","10"],
["4","5"],
["8","9","11"]
]
Run Code Online (Sandbox Code Playgroud)

我需要匹配嵌套数组中的所有值,但只有一个嵌套数组需要匹配文档才能匹配.所以,在这个例子中仅第二嵌套阵列是匹配,因为"4""5"都是本搜索数组中(因此我的文档是一个匹配).我应该使用什么样的查询来实现这一目标?

Val*_*Val 5

你可以使用script像这样的简单Groovy :

def match = false; 
for (sub_array in _source.arr) {
    match = match || (search_array.intersect(sub_array).size() == sub_array.size())
}
return match;
Run Code Online (Sandbox Code Playgroud)

我们的想法是迭代所有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" ]
               }
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

您还需要确保启用动态脚本以使其正常工作,即在您的elasticsearch.yml文件中添加script.inline: on并重新启动您的群集.