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, которую вы используете, формат может несколько отличаться.

Другие вопросы по тегам