elasticsearch nest 2动态添加到bool查询

时间:2016-11-10 21:38:56

标签: c#-4.0 elasticsearch nest

我有一个布尔查询,我想动态添加到使用对象intializer语法但我无法这样做。基本上,我有5个阶段的检查参数,如果它们存在,它们会被添加到boolquery中。这就是我想要做的事情(显然不起作用):

SomeBoolQuery.Must.ToList().Add(someQueryContainer);

如何进行上述工作以便我可以动态地向BoolQuery添加查询?不,我不能通过这个来做到这一点:

SomeBoolQuery.Must = new QueryContainer[] {query1, query2};

因为我不知道我将要查询多少查询,而且我无法一次性添加所有查询。我需要一个动态的解决方案。

我在想这个:

SomeBoolQueryContainer &= someQuery;

然后在最后:

SomeBoolQuery.Must = new QueryContainer[] {someBoolQueryContainer};

但至少可以说这似乎有点多余。有什么想法吗?

编辑:上面尝试的最后一个选项似乎不起作用。没有返回任何结果。

1 个答案:

答案 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