ElasticSearch:过滤数组字段中任何值不在列表中的文档

时间:2017-04-05 18:01:06

标签: elasticsearch

我的情况是我有一个包含整数数组的字段。我需要能够实现一个查询,过滤掉在此数组中包含某些值的文档。

例如,假设我创建了以下索引:

PUT /test/stuff/1
{
    "foo": [1,2,3]
}

PUT /test/stuff/2
{
    "foo": [2]
}

PUT /test/stuff/3
{
    "foo": [1,3]
}

现在我想把所有文件都放在" foo"包含[2,4]中没有的任何值。我想要返回带有ID 1和3的文档。不是文档1包含值2,而是包含其他值。像这样的简单must_not将过滤掉文档1:

POST /test/stuff/_search
{
    "query": { 
        "bool": {
            "must" : {
                "match_all": {}
            },
            "filter" : {
                "bool": {
                    "must_not": [
                        {
                            "terms" : {"foo" : [2,4]}
                        }
                    ]
                }
            }
        }
    }
}

以上查询仅匹配文档3.是否有办法将其重写为包含文档1?

1 个答案:

答案 0 :(得分:2)

这适用于脚本查询,如painless所示,如下所示:

{
    "query": { 
        "bool": {
            "must" : {
                "match_all": {}
            },
            "filter" : {
                "bool": {
                    "must": {
                        "script" : {
                            "script" : {
                            "inline" : "for(int i: doc['foo']) { boolean matches = true; for(int j: params.param1){if(i==j) matches = false;} if(matches) return true;} ",
                            "lang"   : "painless",
                            "params" : { "param1": [2,4]}
                            }
                        }
                    }

                }
            }
        }
    }
}