【问题标题】:ElasticSearch: Filter for documents where any value in an array field is not in a listElasticSearch:过滤数组字段中的任何值不在列表中的文档
【发布时间】:2017-04-05 18:01:06
【问题描述】:

我有一个包含整数数组的字段。我需要能够实现一个查询,过滤掉包含该数组中特定值集的文档。

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

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?

【问题讨论】:

  • 所以你想要 [2,4] 的结果类似于“或”搜索(析取)与字段 'foo' 的所有其他值?
  • 我希望结果包含 foo 包含任何不是 2 或 4 的值的文档。2 或 4 也可以存在,但必须至少存在一个其他值。

标签: elasticsearch


【解决方案1】:

这可以通过脚本查询来实现,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]}
                            }
                        }
                    }

                }
            }
        }
    }
}

【讨论】:

  • @alex 如何在 python elasticsearch 中应用该解决方案?
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 2013-10-26
  • 2022-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
相关资源
最近更新 更多