2017-02-16 8 views
0

Я хочу сделать фильтр в фильтре для получения результата, если он соответствует условию или другому условию.Как обернуть запрос запроса bool в предложение фильтра запроса bool с синтаксисом инициализатора объекта?

В elasticsearch было бы:

POST /my_index/_search 
{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "type1_title": "searched match" 
       } 
      }, 
      { 
       "match": { 
       "type2_title": "searched match" 
       } 
      } 
      ] 
     } 
     } 
     ] 
    } 
    } 
} 

Я пытался войти ан boolQuery в другом boolQuery в гнезде:

var shouldForFilter = new List<QueryContainer>(); 
    shouldForFilter.Add(new TermQuery() 
    { 
      Field = "type1Title", Value = "searched match", 
    }); 
    shouldForFilter.Add(new TermQuery() 
    { 
      Field = "type2Title", Value = "searched match", 
    }); 

     var shouldContainer = new List<QueryContainer> { 
     .... 

    } 
    ... 
    var innerFilterQuery = new BoolQuery 
    { 
      Should = shouldForFilter 
    }; 

    var searchQuery = new BoolQuery 
    {  
     Filter = innerFilterQuery, //does not work 
     Should = shouldContainer, 
     Must = mustContainer, 
     From = 10, 
     Size = 20 
     Minscore = 1 
    }; 

явно типы не не совпадают.

Вы знаете, как это сделать?

+0

запрос не правильно, вы должны принять тот, который вы приняли здесь: http://stackoverflow.com/questions/42276927/elasticsearch-make-a-should- в-a-filter ;-) – Val

+0

да, спасибо, я исправил его –

+0

Но вам не хватает окружающего bool/filter сейчас :-) – Val

ответ

2

С оператором перегрузки в НЕСТ, это может быть очень лаконично выразил

client.Search<MyDocument>(s => s 
    .Query(q => +(q 
     .Match(m => m 
      .Field("type1Title") 
      .Query("searched match") 
     ) || q 
     .Match(m => m 
      .Field("type2Title") 
      .Query("searched match") 
     )) 
    ) 
); 

который производит

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "bool": { 
      "should": [ 
       { 
       "match": { 
        "type1Title": { 
        "query": "searched match" 
        } 
       } 
       }, 
       { 
       "match": { 
        "type2Title": { 
        "query": "searched match" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

Вы также можете использовать оператор перегруженности объектов синтаксис Initializer, который может быть немного более емким чем обертывание в bool запросах. Важная часть - применить операции в правильном порядке. Этот пример производит тот же запрос, как указано выше

QueryContainer query = new MatchQuery 
{ 
    Field = "type1Title", 
    Query = "searched match" 
}; 

// use binary || operator to wrap combined queries 
// into bool query should clause 
query |= new MatchQuery 
{ 
    Field = "type2Title", 
    Query = "searched match" 
}; 

// use unary operator to wrap query in bool 
// query filter clause 
query = +query; 

var request = new SearchRequest<MyDocument> 
{ 
    Query = query 
}; 

client.Search<MyDocument>(request); 
+0

спасибо, но я хотел бы сделать это без хорошей записи потому что я хочу cdynamically ombine фильтр с другими функциями, такими как Should, Must, highlight, Size ... –

+0

@ VivienPipoIve обновил ответ на примере –