将布尔条件的任意列表合并到Nest查询中

本文关键字:Nest 查询 合并 列表 布尔 条件 任意 | 更新日期: 2023-09-27 18:04:31

我正在寻找一种好方法,通过弹性NEST API提供任意数量的布尔条件,方法是循环遍历一个条件列表并累积它——一个列表项是一个布尔条件——以便包含在NEST API查询调用中。

下面是一个不完整的代码示例,说明我要做什么,但是我正在了解流畅的接口以及如何最好地执行它。

这个例子是基于一个虚构的酒店文档的例子。

Func<BoolQueryDescriptor<Hotel>, IBoolQuery> fnBool; // ... 
foreach (var someCriteriaObject in listOfCriteriaObjectsOneForEachBoolConditionIWantToAdd)
{
    // Idea is to build up fnBool or a similar construct for passing to the elastic query later on... 
    // Use .Must() for each item. 
}
// Finally execute the elastic Nest query with all the conditions included - 
ISearchResponse<Hotel> elasticResponse = this.Client.Search<Hotel>(s => s
    .Query(q => q
        .Bool(fnBool) // << pass the constructed boolean (all conditions)
    )
);
var results = elasticResponse.Hits; //... etc ... 

以上是我的第一个伪代码方法,但我愿意接受建议。

实际的弹性索引将具有像http://localhost:9200/my-index/hotel/_mapping这样的Hotel映射。

将布尔条件的任意列表合并到Nest查询中

声明查询容器:

List<QueryContainer> lst = new List<QueryContainer>();

然后添加您的查询:

lst.Add(Query<xxx>.Term(t => t.Field(f => f.zipCode).Value(zip)));
最后,运行完整的查询:
            ISearchResponse<xxx> results = elastic.Search<xxx>(s => s
                .Query(q => q
                    .ConstantScore(cs => cs
                        .Filter(ff => ff
                            .Bool(b => b.Must(lst.ToArray())))))

你可以根据自己的需要进行调整,但这是最基本的。注意ToArray()调用的最后一行,这是您传入查询容器的地方。