在弹性搜索中排除空数组字段 - 但包括缺少字段的文档

时间:2014-10-01 14:56:41

标签: elasticsearch

我正在尝试针对弹性搜索运行查询,该搜索将找到符合以下条件之一的文档:

  • 文档缺少给定字段(tags)或
  • 文档的值footags数组
  • 的元素

问题是我当前的查询将返回具有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"
            }
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

我认为你不能轻易地实现这一目标,并且开箱即用#34;由于你已经提到的原因:空数组和一个没有值的字段(对应于那个数组)之间没有区别。

您唯一的选择可能是使用" null_value"对于那个"标签"字段,如果您对进入文档的数据有任何控制权,则可以处理" []"数组为' [" _your_null_value_of_choice _"]'。并在您的查询中将"null_value": false更改为true