2015-03-09 7 views
0

У меня есть запрос NEST;Nest - ElasticSearch.Net - Как расколоть счетчик хитов FacetFilter, возвращаемый свойством поиска

  var desciptor = new SearchDescriptor<SomePoco>() 
      .TrackScores() 
      .From(request.Page == 1 ? 0 : (request.Page - 1) * request.PageSize) 
      .Size(request.PageSize) 
      .MatchAll() 
      .FacetFilter("some_name", a => new FilterContainer(new AndFilter { Filters = CreatePocoSearchFilter(request) })) 
      .SortDescending("_score"); 


var results = _client.Search<SomePoco>(x => descriptor); 

FacetFilter возвращает общее количество HITS из моего запроса. Я хочу разбить эти удары, используя свойство в запросе на поиск. Итак, в запросе поиска у меня есть список int. Я хочу знать, сколько хитов было возвращено для каждого int в этом списке.

Надеюсь, это имеет смысл.

Я попытался добавить FacetTerm, это дает мне общее количество обращений за каждое значение значения int int, а не только те, которые относятся к поиску. Я понимаю запрос, этап фильтрации, и попытался изменить дескриптор соответственно без везения.

Спасибо.

+0

Вы делаете MatchAll(), так что такое или где список объектов, которые вы ищете? Или вы имеете в виду, что вы получаете список ints, а также хотите получить количество вхождений каждого из этих ints? – rclement

+0

Список ints - это запрос, переданный CreatePocoSearchFilter. Я хочу получить количество обращений, которые возникают из-за включения каждого int в список. – Dan

ответ

1

Существует несколько способов сделать это. Мое предложение было бы использовать отфильтрованный запрос, а затем использовать агрегирование терминов или фасет (графы устарели, поэтому я рекомендую отказаться от них) по результатам.

С Aggregation:

POST /_search 
{ 
    "query": { 
    "filtered": { 
     "query": { "match_all": {}}, 
     "filter": { 
     "terms": { 
      "<FIELD_NAME>": [1, 2, 3, 42] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "countOfInts": { 
     "terms": { 
     "field": "<FIELD_NAME>", 
     "size": 10 
     } 
    } 
    } 
} 

с фаской:

POST /_search 
{ 
    "query": { 
    "filtered": { 
     "query": { "match_all": {}}, 
     "filter": { 
     "terms": { 
      "<FIELD_NAME>": [1, 2, 3, 42] 
     } 
     } 
    } 
    }, 
    "facets": { 
    "countOfInts": { 
     "terms": { 
     "field": "<FIELD_NAME>", 
     "size": 10 
     } 
    } 
    } 
} 

Вы также мог бы сделать то же самое, делая простой запрос с match_all, а затем сделать фильтр внутри фаски или агрегаций , То, как я перечислил его выше, будет немного лучше, потому что это уменьшит рабочий набор до создания agg/facet.

Я не включил код для NEST, потому что в зависимости от версии DLL, которую вы используете, формат может быть несколько иным.

+0

Спасибо, работает. – Dan