搜索多个字段 query_string return 无结果 - ElasticSearch
Search multiple fields query_string return no result - ElasticSearch
我有这个 DSL 查询 return 在 ElasticSearch 控制台中产生结果。
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# 时,return 没有结果。
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")
)
)
)
)
);
但是当我像下面这样用 FirstName
测试它时,结果是 return。
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))
.Query("Pibba Fawsu")
)
)
)
)
);
- 查询字符串根据提供的查询字符串查询 returns 文档,使用具有严格语法的解析器。您的第一个 NEST c# 代码强调匹配所有字段,但没有结果。所以你应该添加 MinimumShouldMatch 限制。
- 您可以在 firstName、surName、middleName 上添加 should 条件。即使匹配到一个名字,它也想 return.
client.Search<Document>(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.middleName)
.Query(keyz)
),
sh => sh
.Match(c => c
.Field(p => p.surName)
.Query(keyz)
)
)
)
)
);
您的问题是使用了 Fields
错误。 .Fields().Fields().Fields()
只用到最后一个FieldMiddleName
,所以没有反应。
更改您的 C# Nest 代码:
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")
)
)
)
)
);
我有这个 DSL 查询 return 在 ElasticSearch 控制台中产生结果。
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# 时,return 没有结果。
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")
)
)
)
)
);
但是当我像下面这样用 FirstName
测试它时,结果是 return。
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))
.Query("Pibba Fawsu")
)
)
)
)
);
- 查询字符串根据提供的查询字符串查询 returns 文档,使用具有严格语法的解析器。您的第一个 NEST c# 代码强调匹配所有字段,但没有结果。所以你应该添加 MinimumShouldMatch 限制。
- 您可以在 firstName、surName、middleName 上添加 should 条件。即使匹配到一个名字,它也想 return.
client.Search<Document>(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.middleName)
.Query(keyz)
),
sh => sh
.Match(c => c
.Field(p => p.surName)
.Query(keyz)
)
)
)
)
);
您的问题是使用了 Fields
错误。 .Fields().Fields().Fields()
只用到最后一个FieldMiddleName
,所以没有反应。
更改您的 C# Nest 代码:
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")
)
)
)
)
);