我在 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
文档的文档"。