我在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": []
}
}
答案 0 :(得分:0)
您需要将must_not
放在nested
查询之外,而不要放在内部-您的意思是“给我一个文档,其中有一个nested
文档与此不匹配嵌套查询”,我想你想说的是“给我一个没有nested
文档与此查询匹配的文档。”