【发布时间】:2021-07-23 13:32:12
【问题描述】:
我很难理解,为什么跨嵌套字段的查询会返回意外结果。
我的索引有以下模板
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
}
}
]
}
现在我将创建一个查询,目标是仅获取那些文档的结果,其中存在 User1 对应的 v21 值为 3。据我了解,我的嵌套映射应该确保我只会得到第二个文档作为查询结果。
以下查询:
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"
}
}
}
}
]
}
}
}
}
}
返回两个文档,而不仅仅是我期望的单个文档
我知道查询字符串不是最优雅的 - 这是由于一些业务逻辑 + 前端框架逻辑用于根据用户输入创建查询字符串以及有关如何删除冗余的任何建议欢迎也是。
但是,我很难理解为什么这个查询会返回两个文档,包括 v1=User1 和 v21=1 的 vNested 对象的文档。 vNested 字段的嵌套映射不应该防止这个问题吗?
【问题讨论】:
标签: elasticsearch nested mapping