在querycontainer中动态添加筛选子句

e37o9pze  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(440)

我已经有两个querydescriptor变量动态保存布尔查询构建,如:

QueryContainer should_container = new QueryContainer();
QueryContainer filter_container = new QueryContainer();

foreach (var parameter in should_parameters) {
    should_container |= constructClause(parameter);
}
foreach (var parameter in filter_parameters) {
    filter_container &= constructClause(parameter);
}

当我尝试合并这两个变量来构造查询时,如下所示:

var result = client.Search<ElasticSearchProject>(s=>s
    .From(0)
    .Size(10)
    .Query(qr => qr
        .Bool(b => b
            .Should(should_container)
            .Filter(filter_container)
        )
    )
);

调试返回的结果变量:

"query": {
    "bool": {
        "should" : [
            "bool": {
                "should": [
                    {...},
                    {...}
                ]
            }
        ],
        "filter": [
            "bool": {
                "must": [
                    {...},
                    {...}
                ]
            }
        ]

这是正确的!但我想知道是否有办法避免使用这两个 should 子句,并获得以下输出:

"query": {
    "bool": {
        "should" : [
            {...},
            {...}
        ],
        "filter": [
            "bool": {
                "must": [
                    {...},
                    {...}
                ]
            }
        ]

这给了我完全相同的结果。如何使用nest编写它来获得上述查询?我正在使用elasticsearch 6.8.0

eoxn13cs

eoxn13cs1#

所有布尔查询 should , must , filter , must_not 条款接受 params QueryContainer[] 对于每个子句,可以使用 List<QueryContainer> 收集子句的查询,然后 .ToArray() 名单

var client = new ElasticClient();

var should_container = new List<QueryContainer>();
var filter_container = new List<QueryContainer>();

// TODO: add queries to clause lists

var result = client.Search<ElasticSearchProject>(s => s
    .From(0)
    .Size(10)
    .Query(qr => qr
        .Bool(b => b
            .Should(should_container.ToArray())
            .Filter(filter_container.ToArray())
        )
    )
);

如果在子句中有大量查询,这将比使用重载运算符组合许多查询更快。

相关问题