使用elasticsearch

时间:2015-07-01 08:21:31

标签: arrays elasticsearch intersection

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

"arr":[
["1","2","10"],
["4","5"],
["8","9","11"]
]

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

1 个答案:

答案 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并重新启动群集。