我正在尝试使用NEST根据用户的输入动态创建搜索查询。我想在filter with 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,但要使用匹配查询或术语查询搜索多个字段,可以参考以下示例:
Bool查询用于组合一个或多个子句,以了解更多引用此
避免在文本字段中使用"查询"一词。
默认情况下,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"
}
}
]
嘿,我不明白你的全部要求。但若你们想在过滤器上添加多个条件,那个么你们可以按照下面的操作。
QueryContainer qSs = null;
foreach(var query in queries) // let say queries is list of yours search item
{
qSs &= new TermQuery { Field = "your_field_name", Value = query };
}
var searchResults = await _elasticClient.SearchAsync<CustomerAddressInfo>(s => s
.Query(q => q
.Bool(b => b.Filter(qSs) )
)
);