对嵌套字段的查询返回的结果就像没有嵌套映射一样



我很难理解为什么跨嵌套字段的查询会返回意外结果。

我的索引有以下模板

PUT /_template/nested_test
{
"index_patterns": [ "nested-*" ],
"settings": { "index.mapping.coerce": false },
"mappings": { 
"dynamic": "strict",
"properties" {
"vNested": {
"type": "nested",
"properties": {
"v1": { "type": "keyword" },
"v2": {
"properties": {
"v21": {
"type": long"
}
}
}
}
}
} 
}
}

我将把两个文档发布到与模板匹配的索引中。

POST /nested-example/_doc
{
"vNested": [
{
"v1": "User1",
"v2": {
"v21": 1
}
},
{
"v1": "User3",
"v2": {
"v21": 3
}
}
]
}
POST /nested-example/_doc
{
"vNested": [
{
"v1": "User1",
"v2": {
"v21": 3
}
},
{
"v1": "User2",
"v2": {
"v21": 2
}
}
]
}

现在,我将创建一个查询,目的是只获取这些文档的结果,其中存在对应v21值为3的User1。据我所知,我的嵌套映射应该确保我只得到第二个文档作为查询结果。

以下查询:

GET /nested-example/_search
{
"query" : {
"bool": {
"filter": {
"bool": {
"must": [
{
"nested: {
"path": "vNested",
"query": {
"match": {
"vNested.v1": "User1"
}
}
}
},
{
"nested: {
"path": "vNested",
"query": {
"match": {
"vNested.v2.v21": "3"
}
}
}
}
]
}
}
} 
}
}

返回两个文档,而不仅仅是我期望的的单个文档

我知道查询字符串并不是最优雅的——这是由于一些业务逻辑+前端框架逻辑用于根据用户输入创建查询字符串,并且欢迎关于如何消除冗余的任何建议。

然而,我很难理解为什么这个查询同时返回两个文档,其中包括vNested对象v1=User1和v21=1的文档。vNested字段的嵌套映射难道不应该防止这个问题吗?

您需要在嵌套查询中使用bool/must查询,因为您查询的是单个对象,而不是多个对象。将您的查询修改为

{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"nested": {
"path": "vNested",
"query": {
"bool": {
"must": [
{
"match": {
"vNested.v1": "User1"
}
},
{
"match": {
"vNested.v2.v21": "3"
}
}
]
}
},
"inner_hits":{}
}
}
]
}
}
}
}
}

搜索结果为

"hits": [
{
"_index": "nested-example",
"_type": "_doc",
"_id": "AAu0IXkBKyWl6Va6kmTU",
"_score": 0.0,
"_source": {
"vNested": [
{
"v1": "User1",
"v2": {
"v21": 3
}
},
{
"v1": "User2",
"v2": {
"v21": 2
}
}
]
},
"inner_hits": {
"vNested": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.6931472,
"hits": [
{
"_index": "nested-example",
"_type": "_doc",
"_id": "AAu0IXkBKyWl6Va6kmTU",
"_nested": {
"field": "vNested",
"offset": 0
},
"_score": 1.6931472,
"_source": {
"v1": "User1",
"v2": {
"v21": 3
}
}
}
]
}
}
}
}
]

最新更新