如何有条件地在ElasticSearch中添加多个条件?

时间:2016-01-12 17:30:02

标签: elasticsearch nest

对以下过滤器查询:

 var searchResults = _client.Search<MyIndexable>(s => s
        .Query(q => q
            .Bool(b => b
                .Must(
                    subQuery => subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")),
                    subQuery => subQuery.Term(f => f.field1, "some string"),
                    subQuery => subQuery.Term(f => f.field2 , "some Guid")))));

我想在Must下添加下面的每个过滤器。像

 if (request.field2)
     ubQuery.Term(f => f.field1, "some string"

任何人都可以帮我这样做吗?。

2 个答案:

答案 0 :(得分:1)

可以在Nest中完成。请参阅以下代码:

var funcs = new List<Func<QueryDescriptor<MyIndexable>, QueryContainer>>();
funcs.Add(subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")));

if (request.field2) // I believe this is some bool variable
{
    funcs.Add(subQuery => subQuery.Term(f => f.field1, "some string"));
}

funcs.Add(subQuery => subQuery => subQuery.Term(f => f.field2 , "some Guid"));

var searchResults = _client.Search<MyIndexable>(s => s
    .Query(q => q
        .Bool(b => b
            .Must(funcs.ToArray()))));

答案 1 :(得分:0)

因为方法链而对你来说很难。

在json中设置配置更方便。因为json是一个字符串,所以打破它并插入条件等很简单。

示例:

$config = '{
    "query":
    {';

if (condition) {
    $config .= '"match":
    {
        "foo": "bar"
    }';   
}

$config .= '
    }
}';

当然,您可以自由选择构建json字符串的方式。