嵌套查询中的行为不一致

时间:2019-01-15 11:22:08

标签: python elasticsearch elasticsearch-py

我在Elasticsearch中使用了嵌套元素,而我碰巧有空的元素想要摆脱。我正在使用以下查询:

q = {
"query": {
    "nested": {
        "path": "items",
        "query": {
            "bool": {
                "must_not": [{
                     "exists": {
                            "field": "items.suggestionScore"
                      }
                 }]
            }
        }
    }
  }
}
es.search(index=indexout, body=q) 

我得到以下答复:

{'took': 0,
'timed_out': False,
'_shards': {'total': 2, 'successful': 2, 'failed': 0},
'hits': {'total': 0, 'max_score': None, 'hits': []}}

这很奇怪,因为我有50个带有 items.suggestionScore 的文档和17个带有空的 items 的文档。除此之外,如果我使用 must 参数而不是 must_not 进行相同的查询,则表示:

 q = {
 "query": {
   "nested": {
    "path": "items",
    "query": {
        "bool": {
            "must": [{
                 "exists": {
                        "field": "items.suggestionScore"
                  }
             }]
        }
    }
  }
 }
}
es.search(index=indexout, body=q) 

我收到此回复:

{'took': 1,
'timed_out': False,
'_shards': {'total': 2, 'successful': 2, 'failed': 0},
'hits': {'total': 50,
'max_score': 1.0,
'hits': [{...

意味着它确实正确检索了我的50个非空文档。我不明白为什么 must 查询的行为与 must_not 相反。为什么我会得到不一致的结果?

更新

这是我的空物品的样子:

{
"_index": "preprod_analytics_suggestions",
"_type": "myType",
"_id": "myId",
"_version": 3,
"_score": 1,
"_source": {
"dataTypeName": "myDataTypeName",
"displayName": "myDisplayName",
"items": []
  }
}

1 个答案:

答案 0 :(得分:0)

您需要将must_not放在nested查询之外,而不要放在内部-您的意思是“给我一个文档,其中有一个nested文档与此不匹配嵌套查询”,我想你想说的是“给我一个没有nested文档与此查询匹配的文档。”