我正在尝试使用NEST根据用户的输入动态创建搜索查询。 我想在“带术语的过滤器”中添加多个过滤器,但是无法进行字符串字段搜索,并且找不到任何解决方案。
例如,该代码尝试在不起作用的字符串字段上搜索
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查询方法给出多个搜索条件,或者如何通过Elastic上的Term查询方法查找字符串字段
答案 0 :(得分:0)
我不熟悉NEST,但是要使用匹配查询或术语查询在多个字段上进行搜索,可以参考以下示例:
布尔查询用于组合一个或多个子句,以了解更多信息,请参考this
避免在文本字段中使用term query。
默认情况下,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"
}
}
]
答案 1 :(得分:0)
嘿,我没有得到您的全部要求。但是,如果要在过滤器上添加多个条件,则可以执行以下操作。
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) )
)
);