c# - Elasticsearch 无法搜索字符串字段
问题描述
我正在尝试使用 NEST 根据用户的输入动态创建搜索查询。我想在带有 Term 的过滤器中添加多个过滤器,但无法搜索字符串字段,我找不到任何解决方案。
例如代码是,此代码尝试搜索字符串字段,但它不起作用
var response = await _elasticClient.SearchAsync<CustomerAddressInfo>(p => p
.Query(q => q
.Bool(b => b
.Filter(f => f.Term(t => t.Field(p => p.AccountAddressId).Value(type.AccountAddressId)))
)
)
);
另一个简单的搜索是使用整数字段,它正在成功
var response = await _elasticClient.SearchAsync<CustomerAddressInfo>(p => p
.Query(q => q
.Bool(b => b
.Filter(f => f.Term(t => t.Field(p => p.CreateUnitId).Value(type.CreateUnitId)))
)
)
);
但; 如果我使用 Match 关键字搜索字符串字段上的数据,则再次搜索成功
var response = await _elasticClient.SearchAsync<CustomerAddressInfo>(p => p
.Query(q => q
.Match(m => m
.Field(f => f.AccountAddressId)
.Query(type.AccountAddressId)
)
)
);
问题是,如何使用 Match 查询方法提供多个搜索条件,或者如何通过弹性上的 Term 查询方法搜索字符串字段
解决方案
我不熟悉 NEST,但要使用匹配查询或术语查询搜索多个字段,您可以参考以下示例:
布尔查询用于组合一个或多个子句,了解更多参考这里
避免对文本字段使用术语查询。
默认情况下,Elasticsearch 会在分析过程中更改文本字段的值。这会使查找文本字段值的精确匹配变得困难。
要搜索文本字段值,请改用匹配查询。
索引映射
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"cost": {
"type": "long"
}
}
}
}
指数数据:
{
"name":"apple",
"cost":"40"
}
{
"name":"apple",
"cost":"55"
}
搜索查询:匹配的多个搜索条件
{
"query": {
"bool": {
"must": [
{ "match": { "name": "apple" }},
{ "match": { "cost": 40 }}
]
}
}
}
按术语查询现场搜索
{
"query": {
"bool" : {
"must" :[
{"term" : { "name" : "apple" }},
{"term": { "cost":40 }}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "my-index",
"_type": "_doc",
"_id": "3",
"_score": 1.1823215,
"_source": {
"name": "apple",
"cost": "40"
}
}
]