【问题标题】:Exclude empty array fields - but include documents missing the field - in elasticsearch在弹性搜索中排除空数组字段 - 但包括缺少该字段的文档
【发布时间】:2014-10-02 00:01:35
【问题描述】:

我正在尝试针对 elasticsearch 运行查询,以查找满足以下条件之一的文档:

  • 文档缺少给定字段 (tags) 或
  • 文档具有值 foo 作为 tags 数组的元素

问题是我当前的查询将返回具有tags 字段的文档,该字段的值为空数组。这大概是因为 elasticsearch 将空数组视为与根本没有该字段相同的东西。这是我正在运行的返回错误结果的完整查询:

{
    "from": 0, 
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "exists": {
                                "field": "_rankings.public"
                            }
                        }, 
                        {
                            "or": [
                                {
                                    "missing": {
                                        "existence": true, 
                                        "field": "tags", 
                                        "null_value": false
                                    }
                                }, 
                                {
                                    "terms": {
                                        "execution": "or", 
                                        "tags": [
                                            "foo"
                                        ]
                                    }
                                }
                            ]
                        }
                    ]
                }
            }, 
            "query": {
                "match_all": {}
            }
        }
    }, 
    "size": 10000, 
    "sort": [
        {
            "_rankings.public": {
                "ignore_unmapped": true, 
                "order": "asc"
            }
        }
    ]
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    由于您已经提到的原因,我认为您不能如此轻松地“开箱即用”地实现这一点:空数组和没有值的字段(对应于该数组)之间没有区别它。

    您唯一的选择可能是对该“标签”字段使用“null_value”,如果您对进入文档的数据有任何控制权,则将“[]”数组视为“[”_your_null_value_of_choice_ “]”。并在您的查询中将"null_value": false 更改为true

    【讨论】:

    • 为什么不设置null_value: false 排除所有具有空值的文档,包括空数组?似乎应该来自缺少的过滤器文档:elasticsearch.org/guide/en/elasticsearch/reference/current/…
    • “缺失”过滤器的“null_value”属性是告诉 ES 考虑为字段(通过映射)设置的“null_value”字段被视为缺失字段。在我给出的示例中,如果您输入 "tags": ["_your_null_value_of_choice_"] 并设置 "null_value": true 将认为该文档有一个包含 null 的数组。如果你放"null_value": false,则不会考虑该文档,因为ES不知道你放在那里的值是null。因此,“null_value”属性不用于您认为应该使用的用途,它与为字段设置的“null_value”相关联。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多