NEST有多个条件的条件过滤器查询

我想像这样做一个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))

))));

以上是 NEST有多个条件的条件过滤器查询 的全部内容, 来源链接: utcz.com/qa/431403.html

回到顶部