在.NET NEST Elasticsearch中如何有条件地追加Match查询条件
方案1:使用NEST原生条件重载(改动最小)
NEST的所有查询子句都内置了Condition配置项,只要传入的判断条件为false,该子句就会自动从最终生成的查询中剔除,不需要修改你现有的链式调用结构,改完的代码如下:
var response = esClient.Search<CustomDataModel>(s => s .Index(index) .Size(1000) .Query(q => q .Match(m => m // 只有Name不为空时才加这个查询条件 .Condition(!string.IsNullOrWhiteSpace(param.Name)) .Field(f => f.Name) .Query(param.Name)) && q .Match(m => m .Condition(!string.IsNullOrWhiteSpace(param.Type)) .Field(f => f.Type) .Query(param.Type)) && q .Match(m => m // 这里也可以加Countries非空的判断 .Condition(param.Countries?.Any() == true) .Field(f => f.Country) .Query(string.Join(" ", param.Countries)))) );
这种写法和你要的if逻辑完全等价,代码更简洁不需要额外声明变量。
方案2:显式构建QueryContainer(逻辑更直观,适合多条件场景)
如果你偏好显式的if判断写法,可以先声明QueryContainer对象逐步拼接条件,完全贴合你想要的写法逻辑:
// 初始化查询容器 QueryContainer query = new QueryContainer(); // 按需添加Name查询条件 if (!string.IsNullOrWhiteSpace(param.Name)) { query &= new MatchQuery { Field = Infer.Field<CustomDataModel>(f => f.Name), Query = param.Name }; } // 按需添加Type查询条件 if (!string.IsNullOrWhiteSpace(param.Type)) { query &= new MatchQuery { Field = Infer.Field<CustomDataModel>(f => f.Type), Query = param.Type }; } // 按需添加Country查询条件 if (param.Countries?.Any() == true) { query &= new MatchQuery { Field = Infer.Field<CustomDataModel>(f => f.Country), Query = string.Join(" ", param.Countries) }; } // 执行查询,直接传入构建好的query即可 var response = esClient.Search<CustomDataModel>(s => s .Index(index) .Size(1000) .Query(q => query) );
补充说明
- 多个条件用
&=拼接表示是AND关系,如果需要OR关系替换为|=即可 - 条件判断用
IsNullOrWhiteSpace可以同时过滤null、空字符串、全空格的异常情况,避免生成无效的查询条件
内容的提问来源于stack exchange,提问作者Sayed Uz Zaman
相关产品推荐
相关产品推荐

