我想像这样做一个ElasticSearch查询:
{ "query" : { "bool" : { "filter" : [ { "terms" : { "name" : ["name1", "name2"] } }, { "terms" : { "color" : ["orange", "red"] } } ] } } }
我试图像这样在NEST中实现它:
_elasticClient .SearchAsync<MyDocument>(s => s.Index("myindex") .Query(q => q .Bool(bq => bq .Filter(fq => { QueryContainer query = null; if (nameList.Any()) { query &= fq.Terms(t => t.Field(f => f.Name).Terms(nameList)); } if (colorList.Any()) { query &= fq.Terms(t => t.Field(f => f.Color).Terms(colorList)); } return query; }) ) ) );
但这给了我这样的查询,其中的过滤器包装在 布尔值中 :
{ "query" : { "bool" : { "filter" : [ { "bool" : { "must" : [ { "terms" : { "name" : ["name1", "name2"] } }, { "terms" : { "color" : ["orange", "red"] } } ] } } ] } } }
我应该如何更改我的NEST代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer之外的 其他项目中?
如果要检查条件过滤器,可以在查询之前创建过滤器列表,如下所示:
var nameList = new[] {"a", "b"}; var colorList = new[] {1, 2}; var filters = new List<Func<QueryContainerDescriptor<MyDocument>, QueryContainer>>(); if (nameList.Any()) { filters.Add(fq=> fq.Terms(t => t.Field(f => f.Name).Terms(nameList))); } if (colorList.Any()) { filters.Add(fq => fq.Terms(t => t.Field(f => f.Color).Terms(colorList))); } ISearchResponse<Property> searchResponse = elasticClient.Search<MyDocument>(x => x.Query(q => q .Bool(bq => bq.Filter(filters))));
如果在进行过滤器查询之前不需要检查任何条件,则可以使用类似的方法:
ISearchResponse<MyDocument> searchResponse = elasticClient.Search<MyDocument>(x => x.Query(q => q .Bool(bq => bq .Filter( fq => fq.Terms(t => t.Field(f => f.Name).Terms(nameList)), fq => fq.Terms(t => t.Field(f => f.Color).Terms(colorList)) ))));