嵌套查询中的行为不一致



我在 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 个包含空项目的文档。除此之外,如果我使用 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_not相反。关于为什么我得到这些不一致的结果的任何提示?

更新

这是我的空项目的样子:

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

您需要将must_not放在nested查询之外而不是内部 - 您所说的是"给我一个包含与此嵌套查询不匹配的nested文档的文档",我相信您想说的是"给我一个没有与此查询匹配的nested文档的文档"。

相关内容

  • 没有找到相关文章

最新更新