如何通过Nest向Elasticsearch传递无需手动拼接AND的查询条件列表?
方案1:最小改动,直接拼接查询条件
你只需要重载原有的查询方法,内部自动过滤有效条件后用AND拼接即可,完全兼容你现有的查询逻辑:
public async Task<IEnumerable<T>> GetQueryStringData<T>(string index, IEnumerable<string> queryList) where T : class { // 过滤空/空白的无效条件 var validQueries = queryList?.Where(q => !string.IsNullOrWhiteSpace(q)).ToList() ?? new List<string>(); if (!validQueries.Any()) { // 没有有效条件时可自定义返回逻辑,比如返回空或查全量 return Enumerable.Empty<T>(); } // 自动拼接完整查询字符串 string fullQuery = string.Join(" AND ", validQueries); var client = GetClient(); var response = await client.SearchAsync<T>(s => s .Index(index) .Query(x => x.QueryString(a => a.Query(fullQuery))) .Size(DefaultResultsSize)); return response?.Documents ?? Enumerable.Empty<T>(); }
调用示例和你预期的入参形式完全一致:
var queryList = new List<string>(); queryList.Add("module : ('mod45')"); queryList.Add("code : ('667', '456')"); queryList.Add("startTime:[2020-10-18T13:42:17 TO 2021-10-18T13:42:17]"); queryList.Add("endTime:[2021-02-18T13:42:17 TO 2021-09-18T13:42:17]"); // 直接传入条件列表调用即可 var result = await GetQueryStringData<你的文档类型>("你的索引名", queryList);
该方案改动极小,完全复用现有逻辑,不需要调整你构造条件的方式,哪怕上百条条件也能正常处理。
方案2:更稳妥的Bool查询构建方式(避免字符串拼接风险)
如果你担心拼接字符串时出现语法错误(比如某条子条件本身带未转义的特殊符号),可以用Nest的动态Bool查询构建,把每个条件作为独立的must子句添加,不需要手动拼接字符串:
public async Task<IEnumerable<T>> GetQueryStringData<T>(string index, IEnumerable<string> queryList) where T : class { var validQueries = queryList?.Where(q => !string.IsNullOrWhiteSpace(q)).ToList() ?? new List<string>(); if (!validQueries.Any()) { return Enumerable.Empty<T>(); } var client = GetClient(); var response = await client.SearchAsync<T>(s => s .Index(index) .Query(q => q.Bool(b => // 遍历所有条件动态添加must子句,不需要手动写100个lambda b.Must(validQueries.Select(subQuery => new QueryStringQuery { Query = subQuery })) )) .Size(DefaultResultsSize)); return response?.Documents ?? Enumerable.Empty<T>(); }
该方案每个子条件独立解析,不会因为某条的语法问题影响整体拼接结果,排查错误更方便,性能和第一种方案基本一致。
注意:两种方案都默认所有添加到
queryList的子条件本身是符合Elasticsearch Query String语法的合法片段,如果你需要在条件中插入用户输入的内容,建议提前做特殊字符转义,避免查询语法报错。
内容的提问来源于stack exchange,提问作者SzymiLeeDżons
相关产品推荐
相关产品推荐

