Nest - ElasticSearch.Net - Как разделить счетчик посещений FacetFilter, возвращаемый свойством поиска
У меня есть NEST Query;
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 в этом списке.
Я надеюсь это имеет смысл.
Я попытался добавить FacetTerm, это дает мне общее количество совпадений для каждого значения значения запроса int, а не только тех, которые относятся к поиску. Я понимаю запрос, стадию фильтрации и попытался изменить дескриптор соответственно без удачи.
Благодарю.
1 ответ
Есть несколько способов сделать это. Я бы предложил использовать отфильтрованный запрос, а затем использовать агрегацию или фасет терминов (не рекомендуется использовать фасеты, поэтому я рекомендую отказаться от них) в результатах.
С агрегацией:
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, которую вы используете, формат может несколько отличаться.