elasticsearch 使用弹性搜索匹配完整的复杂嵌套集合项,而不是单独的成员,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 使用弹性搜索匹配完整的复杂嵌套集合项,而不是单独的成员,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch 使用弹性搜索匹配完整的复杂嵌套集合项,而不是单独的成员

elasticsearch 使用弹性搜索匹配完整的复杂嵌套集合项,而不是单独的成员,elasticsearch,nest,elasticsearch,Nest,我有一个索引,其中包含我想要点击的项目的嵌套集合。集合项包含多个属性,所有属性都必须匹配某个查询,而不仅仅是其中任何一个。模型如下: 公共类索引entry1 { 公共IEnumerable NestedProperty1{get;set;} } 公共类嵌套类型1 { 公共字符串Member1{get;set;} 公共字符串Member2{get;set;} } 因此,我只想点击在索引entry1.NestedProperty1集合中具有特定组合的Member1和Member2值的文档 我想我必

我有一个索引,其中包含我想要点击的项目的嵌套集合。集合项包含多个属性,所有属性都必须匹配某个查询,而不仅仅是其中任何一个。模型如下:

公共类索引entry1
{
公共IEnumerable NestedProperty1{get;set;}
}
公共类嵌套类型1
{
公共字符串Member1{get;set;}
公共字符串Member2{get;set;}
}
因此,我只想点击在
索引entry1.NestedProperty1
集合中具有特定组合的
Member1
Member2
值的文档

我想我必须将集合映射为嵌套的

以下是映射:

index: {
    properties: {
        nestedProperty1: {
            type: "nested",
            properties: {
                member1: {
                    type: "string",
                    index_analyzer: "my_index_analyzer_1",
                    search_analyzer: "my_search_analyzer_1"
                },
                member2: {
                    type: "string",
                    analyzer: "keyword"
                }
            }
        }
    },
    analysis: {
        tokenizer: {
            my_ngram: {
                type: "nGram",
                min_gram: "1",
                max_gram: "15"
            }
        },
        analyzer: {
            my_index_analyzer_1: {
                type: "custom",
                tokenizer: "my_ngram",
                filters: ["lowercase"]
            },
            my_search_analyzer_1: {
                type: "custom",
                tokenizer: "whitespace",
                filters: ["lowercase"]
            }
        }
    }
}
并使用如下查询:

client.Search(d=>d
.Query(Query=>Query
.Nested(n=>n
.Path(p=>p.NestedProperty1)
.Query(q=>q
.Bool(b=>b
.必须(
m=>m.Term(“成员1”、“价值1”),
m=>m.QueryString(s=>s.OnField(“member2”)
.Query(“value2”()()()));;

但是,,我仍然会找到任何具有
value1
值或
value2
值的文档,而我只希望找到具有相同
NestedProperty1
集合项上两个值的文档。

您是正确的,它应该只查找嵌套文档具有value1和value2的文档

通过在中运行以下命令,可以观察elasticsearch的行为:

上一次查询将只查找文档
1
,但一旦您将
nestedcollection.prop2
的术语查询更改为查找
B
,而不是
A
,您将不再得到预期的任何响应

如果我对示例进行更新,使其更符合您的映射和查询,我将无法再现您亲眼目睹的行为:

PUT http://localhost:9200/nested_example
{
   "settings": {
      "analysis": {
         "tokenizer": {
            "my_ngram": {
               "type": "nGram",
               "min_gram": "1",
               "max_gram": "15"
            }
         },
         "analyzer": {
            "my_index_analyzer_1": {
               "type": "custom",
               "tokenizer": "my_ngram",
               "filters": [
                  "lowercase"
               ]
            },
            "my_search_analyzer_1": {
               "type": "custom",
               "tokenizer": "whitespace",
               "filters": [
                  "lowercase"
               ]
            }
         }
      }
   },
   "mappings": {
      "indexentry": {
         "properties": {
            "nestedCollection": {
               "type": "nested",
               "properties": {
                  "prop1": {
                     "type": "string",
                     "index_analyzer": "my_index_analyzer_1",
                     "search_analyzer": "my_search_analyzer_1"
                  },
                  "prop2": {
                     "type": "string",
                     "analyzer": "keyword"
                  }
               }
            }
         }
      }
   }
}
POST http://localhost:9200/nested_example/indexentry/1
{
    "nestedCollection": [
        { "prop1" : "value1", "prop2" : "value1" },
        { "prop1" : "value2", "prop2" : "value2" }
    ]
}
POST http://localhost:9200/nested_example/indexentry/2
{
    "nestedCollection": [
        { "prop1" : "value3", "prop2" : "value3" },
        { "prop1" : "value4", "prop2" : "value4" }
    ]
}

POST http://localhost:9200/nested_example/indexentry/_search
{
    "query": {
        "nested": {
           "path": "nestedCollection",
           "query": {
                "bool": {
                    "must": [
                       {
                           "term": {
                              "prop1": {
                                 "value": "value1"
                              }
                           }
                       },
                       {
                           "query_string": {
                               "fields": [
                                  "prop2"
                               ],
                               "query": "value1"

                           }
                       }

                    ]
                }
           }
        }
    }
}
您能否更新上一个示例以更好地再现您的情况

最后一点注意:在NEST中,您可以将查询重写为:

client.Search(d=>d
.Query(Query=>Query
.Nested(n=>n
.Path(p=>p.NestedProperty1)
.Query(q=>
q、 术语(p=>p.NestedProperty1.First().Member1,“value1”)
&&q.QueryString(s=>s)
.OnField(p=>p.nestedProperty1.First().Member2)
.Query(“value2”)
)
)
)
);

强类型,嵌套更少。

谢谢!用你的查询替换我的查询就可以了。我不知道到底发生了什么。我真的应该在嵌套中启用跟踪日志来检查HTTP流量。
PUT http://localhost:9200/nested_example
{
   "settings": {
      "analysis": {
         "tokenizer": {
            "my_ngram": {
               "type": "nGram",
               "min_gram": "1",
               "max_gram": "15"
            }
         },
         "analyzer": {
            "my_index_analyzer_1": {
               "type": "custom",
               "tokenizer": "my_ngram",
               "filters": [
                  "lowercase"
               ]
            },
            "my_search_analyzer_1": {
               "type": "custom",
               "tokenizer": "whitespace",
               "filters": [
                  "lowercase"
               ]
            }
         }
      }
   },
   "mappings": {
      "indexentry": {
         "properties": {
            "nestedCollection": {
               "type": "nested",
               "properties": {
                  "prop1": {
                     "type": "string",
                     "index_analyzer": "my_index_analyzer_1",
                     "search_analyzer": "my_search_analyzer_1"
                  },
                  "prop2": {
                     "type": "string",
                     "analyzer": "keyword"
                  }
               }
            }
         }
      }
   }
}
POST http://localhost:9200/nested_example/indexentry/1
{
    "nestedCollection": [
        { "prop1" : "value1", "prop2" : "value1" },
        { "prop1" : "value2", "prop2" : "value2" }
    ]
}
POST http://localhost:9200/nested_example/indexentry/2
{
    "nestedCollection": [
        { "prop1" : "value3", "prop2" : "value3" },
        { "prop1" : "value4", "prop2" : "value4" }
    ]
}

POST http://localhost:9200/nested_example/indexentry/_search
{
    "query": {
        "nested": {
           "path": "nestedCollection",
           "query": {
                "bool": {
                    "must": [
                       {
                           "term": {
                              "prop1": {
                                 "value": "value1"
                              }
                           }
                       },
                       {
                           "query_string": {
                               "fields": [
                                  "prop2"
                               ],
                               "query": "value1"

                           }
                       }

                    ]
                }
           }
        }
    }
}