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"
}
}
]
}
}
}
}
}