我有一个布尔查询,我想动态添加到使用对象intializer语法但我无法这样做。基本上,我有5个阶段的检查参数,如果它们存在,它们会被添加到boolquery中。这就是我想要做的事情(显然不起作用):
SomeBoolQuery.Must.ToList().Add(someQueryContainer);
如何进行上述工作以便我可以动态地向BoolQuery添加查询?不,我不能通过这个来做到这一点:
SomeBoolQuery.Must = new QueryContainer[] {query1, query2};
因为我不知道我将要查询多少查询,而且我无法一次性添加所有查询。我需要一个动态的解决方案。
我在想这个:
SomeBoolQueryContainer &= someQuery;
然后在最后:
SomeBoolQuery.Must = new QueryContainer[] {someBoolQueryContainer};
但至少可以说这似乎有点多余。有什么想法吗?
编辑:上面尝试的最后一个选项似乎不起作用。没有返回任何结果。
答案 0 :(得分:1)
使用Fluent API动态添加bool查询:
ElasticQueryContainer elasticQueryContainer = GetSearchQuery(searchRequest);
var response = client.Search<IDocument>(s1 => s1
.Query(q => q
.Bool(bq => bq
.Should(elasticQueryContainer.orQuery.ToArray())
.Must(elasticQueryContainer.andQuery.ToArray())
.MustNot(elasticQueryContainer.notQuery.ToArray())
)));
public class ElasticQueryContainer
{
public List<QueryContainer> orQuery { get; set; }
public List<QueryContainer> andQuery { get; set; }
public List<QueryContainer> notQuery { get; set; }
public ElasticQueryContainer()
{
orQuery = new List<QueryContainer>();
andQuery = new List<QueryContainer>();
notQuery = new List<QueryContainer>();
}
}
public ElasticQueryContainer GetSearchQuery(SearchRequest searchRequest )
{
//...Populate ElasticQueryContainer : orQuery, andQuery, notQuery dynamically
var elasticQueryContainer = new ElasticQueryContainer();
if (!String.IsNullOrEmpty(searchRequest.FullTextSearch))
{
elasticQueryContainer.andQuery.Add(new QueryStringQuery
{
Query = searchRequest.FullTextSearch.ToLower(),
DefaultOperator = searchRequest.FullTextOperator == SearchEnums.FullTextSearchOperator.AND ? Operator.And : Operator.Or
});
}
}
SearchRequest是一个具有必须搜索的属性的类。
public class SearchRequest
{
public String FullTextSearch { get; set; }
public SearchEnums.FullTextSearchOperator FullTextOperator { get; set; }
}
对于Object intializer语法,您可以这样使用它:
new BoolQuery()
{
MustNot = elasticQueryContainer.notQuery.ToArray(),
Should = elasticQueryContainer.orQuery.ToArray(),
Must = elasticQueryContainer.andQuery.ToArray()
};
您还可以参考:https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/bool-query-usage.html