2016-01-12 70 views
1

以下过滤查询:如何有条件地在ElasticSearch中添加多个条件?

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"))))); 

我想每个过滤器添加下面conditinally下的必然选择。像

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

任何人都可以帮助我做到这一点?

回答

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())))); 
+0

bittusarkar,我如何获得subQuery实例添加过滤器在BoolFilterDescriptor(必须)上面的情况下?像我需要添加ExistFilter而不是QueryString,然后有条件地过滤条件? – Sasi

+0

“过滤器”:{ “布尔”:{ “必须”:[ { “存在”:{ “场”: “CID” } }, { “存在”:{ “字段“: “PRF” }} , { “术语”:{ “IsActive”:真 }} , – Sasi

+0

你不需要在任何地方定义子查询。它是'Func'定义的一部分。我粘贴的代码在语法上是正确的。你可以用你想实现的任何其他查询替换QueryString。 – bittusarkar

0

由于方法链接,您很难。

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

例子:

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

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

$config .= ' 
    } 
}'; 

当然,你可以自由选择建立一个JSON字符串的方式。