NEST的动态布尔查询(ElasticSearch)

时间:2018-07-06 08:05:57

标签: elasticsearch nest

美好的一天:

我正在尝试实现动态的布尔查询。例子...

        QueryContainer addressQuery = null;
        QueryContainer typeQuery = null;

        BoolQueryDescriptor <Facility> boolQuery = new BoolQueryDescriptor<Facility>();
        QueryContainerDescriptor<Facility> sh = new QueryContainerDescriptor<Facility>();
        SearchDescriptor<Facility> mainSh = new SearchDescriptor<Facility>();
        if (search.searchTerm != null)
        {
            addressQuery = sh.Term(f => f.Address, search.searchTerm) ||
                                            sh.Match(m => m.Field(f => f.Address).Query(search.searchTerm) ) ||
                                            sh.Term(f => f.ZipCode, search.searchTerm) ||
                                            sh.Match(m => m.Field(f => f.State).Query(search.searchTerm));
            boolQuery = boolQuery.Should(b => addressQuery);
        }
        if (search.type != null) {
            typeQuery = sh.Term(f => f.Types.First(), search.type);
            boolQuery = boolQuery.Must(b => typeQuery && addressQuery);
        }

        if (boolQuery != null)
        {
           mainSh = mainSh.Query(q => q.Bool(b => boolQuery));
           request = await this._elasticClient.SearchAsync<Facility>(s => mainSh.Size(search.size));
        }

此查询正在变成AddressQueryTypeQuery之间的OR,但是,我想在两个查询之间达到 And 条件。有效地使查询动态化。这可能吗?示例:动态addressQuery && typeQuery

谢谢。

1 个答案:

答案 0 :(得分:0)

将其发射出去。您可以&&||查询容器...排序器,例如:

 queryContainer1=queryContainer1 && queryContainer2

然后.bool(b => b(queryContainer1))