将任意布尔条件列表合并到 Nest 查询中
Incorporating an arbitrary List of Boolean conditions into a Nest query
我正在寻找一种通过弹性 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
这样的酒店映射。
声明一个查询容器:
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() 调用的最后一行,这是您传入查询容器的地方。
我正在寻找一种通过弹性 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
这样的酒店映射。
声明一个查询容器:
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() 调用的最后一行,这是您传入查询容器的地方。