C# 搜索多个字段查询字符串不返回结果-ElasticSearch
我有这个DSL查询,它在ElasticSearch控制台中返回结果C# 搜索多个字段查询字符串不返回结果-ElasticSearch,c#,nest,C#,Nest,我有这个DSL查询,它在ElasticSearch控制台中返回结果 GET /person/_search { "query": { "bool": { "must": [ { "query_string": { "fields": [ "nameDetails.name.na
GET /person/_search
{
"query": {
"bool": {
"must": [
{
"query_string": {
"fields": [
"nameDetails.name.nameValue.firstName",
"nameDetails.name.nameValue.surname",
"nameDetails.name.nameValue.middleName"
],
"query": "Pibba Fawsu~"
}
}
]
}
}
}
结果如下:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 10.335077,
"hits" : [
{
"_index" : "person",
"_type" : "_doc",
"_id" : "70002",
"_score" : 10.335077,
"_source" : {
"gender" : "Male",
"nameDetails" : {
"name" : [
{
"nameValue" : {
"firstName" : "Fawsu",
"middleName" : "L.",
"surname" : "Pibba"
},
"nameType" : "Primary Name"
},
{
"nameValue" : {
"firstName" : "Fausu",
"middleName" : "L.",
"surname" : "Pibba"
},
"nameType" : "Spelling Variation"
}
]
}
}
}
]
}
}
但是当我将查询转换为NEST C#时,它不会返回任何结果
var response = await _elasticClient.SearchAsync<Person>(s => s
.Index("person")
.Query(q => q
.Bool(b => b
.Must(
mu => mu
.QueryString(m => m
.Fields(f => f.Field(f => f.NameDetails.Name[0].NameValue.FirstName))
.Fields(f => f.Field(f => f.NameDetails.Name[0].NameValue.Surname))
.Fields(f => f.Field(f => f.NameDetails.Name[0].NameValue.MiddleName))
.Query("Pibba Fawsu")
)
)
)
)
);
- 查询字符串查询使用语法严格的解析器,基于提供的查询字符串返回文档。您的第一个嵌套c#代码强调匹配所有字段,但没有结果。因此,您应该添加MinimumShouldMatch限制
- 您可以在名字、姓氏、中间名上添加“应该”条件。即使有一个名称匹配,它也会返回
client.Search(s=>s
.Query(q=>q
.Bool(b=>b
.Should(sh=>sh
.Match(c=>c
.Field(p=>p.firstName)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.Field(p=>p.name)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.字段(p=>p.姓氏)
.Query(keyz)
)
)
)
)
);
- 查询字符串查询使用语法严格的解析器,基于提供的查询字符串返回文档。您的第一个嵌套c#代码强调匹配所有字段,但没有结果。因此,您应该添加MinimumShouldMatch限制
- 您可以在名字、姓氏、中间名上添加“应该”条件。即使有一个名称匹配,它也会返回
client.Search(s=>s
.Query(q=>q
.Bool(b=>b
.Should(sh=>sh
.Match(c=>c
.Field(p=>p.firstName)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.Field(p=>p.name)
.Query(keyz)
),
sh=>sh
.Match(c=>c
.字段(p=>p.姓氏)
.Query(keyz)
)
)
)
)
);
您的问题在于所使用的字段
错误。.Fields().Fields().Fields()
仅使用最后一个字段MiddleName
,因此没有响应。
更改您的C#嵌套代码:
var response = await client.SearchAsync<Person>(s => s.Index("person")
.Query(q => q
.Bool(b => b
.Must(
mu => mu
.QueryString(m => m
.Fields(f => f.Fields(f => f.NameDetails.Name[0].NameValue.FirstName, f => f.NameDetails.Name[0].NameValue.Surname, f => f.NameDetails.Name[0].NameValue.MiddleName))
.Query("Pibba Fawsu")
)
)
)
)
);
var response=wait client.SearchAsync(s=>s.Index(“person”)
.Query(q=>q
.Bool(b=>b
.必须(
mu=>mu
.QueryString(m=>m
.Fields(f=>f.Fields(f=>f.NameDetails.Name[0].NameValue.FirstName,f=>f.NameDetails.Name[0].NameValue.nameName,f=>f.NameDetails.Name[0].NameValue.MiddleName))
.Query(“Pibba Fawsu”)
)
)
)
)
);
您的问题在于所使用的字段
错误。.Fields().Fields().Fields()
仅使用最后一个字段MiddleName
,因此没有响应。
更改您的C#嵌套代码:
var response = await client.SearchAsync<Person>(s => s.Index("person")
.Query(q => q
.Bool(b => b
.Must(
mu => mu
.QueryString(m => m
.Fields(f => f.Fields(f => f.NameDetails.Name[0].NameValue.FirstName, f => f.NameDetails.Name[0].NameValue.Surname, f => f.NameDetails.Name[0].NameValue.MiddleName))
.Query("Pibba Fawsu")
)
)
)
)
);
var response=wait client.SearchAsync(s=>s.Index(“person”)
.Query(q=>q
.Bool(b=>b
.必须(
mu=>mu
.QueryString(m=>m
.Fields(f=>f.Fields(f=>f.NameDetails.Name[0].NameValue.FirstName,f=>f.NameDetails.Name[0].NameValue.nameName,f=>f.NameDetails.Name[0].NameValue.MiddleName))
.Query(“Pibba Fawsu”)
)
)
)
)
);
u知道您的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。正如KenTsu所说的,只是一个不同的查询表单。你知道你的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。正如KenTsu所说的,只是一个不同的查询表单。你知道你的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。@Steve我的答案只是一种不同形式的多文件查询。你知道你的解决方案与其他解决方案有什么不同吗?我尝试了这两种方法,得到了相同的正确结果。@Steve我的答案只是一种不同形式的多文件查询。
var response = await client.SearchAsync<Person>(s => s.Index("person")
.Query(q => q
.Bool(b => b
.Must(
mu => mu
.QueryString(m => m
.Fields(f => f.Fields(f => f.NameDetails.Name[0].NameValue.FirstName, f => f.NameDetails.Name[0].NameValue.Surname, f => f.NameDetails.Name[0].NameValue.MiddleName))
.Query("Pibba Fawsu")
)
)
)
)
);