【发布时间】:2019-08-19 19:27:32
【问题描述】:
我有一个索引,其文档包含嵌套对象列表。映射的简化版本如下:
{
"_doc": {
"dynamic": "strict",
"properties": {
"things": {
"type": "nested",
"dynamic": "strict",
"properties": {
"name": {
"type": "keyword"
},
"version": {
"type": "keyword"
}
}
}
}
}
}
我想获取所有没有的文档具有任何具有特定值集的嵌套事物对象。类似的查询
{
"query": {
"nested": {
"path": "things",
"query": {
"bool": {
"must_not": [
{
"term": {
"name": "thing1"
}
},
{
"term": {
"version": "1.0.0"
}
}
]
}
}
}
}
}
似乎只返回所有包含 一些 不匹配的嵌套文档的文档...这意味着它仍然返回所有文档,即使是那些 也有 的文档匹配的嵌套对象。那么,我该如何正确过滤掉它们呢?
编辑:像这样的查询
{
"query": {
"bool": {
"must_not": [
{
"nested": {
"path": "things",
"query": {
"bool": {
"must": [
{
"term": {
"name": "thing1"
}
},
{
"term": {
"version": "1.0.0"
}
}
]
}
}
}
}
]
}
}
}
将嵌套对象查询嵌套在 must_not 中也不起作用,仍然只是返回所有内容。
【问题讨论】:
-
据我所知:您的嵌套查询将适用于找到的内容,但适用于该嵌套类型。您可能想要的是一个包装函数,使您的查询嵌套查询本身成为
must,但您的实际查询:query: { bool: { must_not: [ nestedQuery - that does find things ] } }这并不理想,但我发现了一种解决方法 -
@Tessmore 遗憾的是,这似乎也不起作用。 :(
-
Oki,我可能不完全理解:如果您不想将
thing1作为名称或version = 1.0.0,那么嵌套的东西可以是should,现在我又读了一遍,我想这就是你的意思?所以嵌套查询中的布尔查询可以是should。如果您的用例不同,可能会显示一个匹配的示例文档和一个不应该匹配的示例文档(但现在正在返回)
标签: elasticsearch