Подтвердить что ты не робот

Elasticsearch Filtered query vs Filter

Есть ли разница между "запросом и фильтром в фильтрах" и "запросом и фильтром на корне"? например

Случай 1:

{
  "query":{
    "filtered":{
      "query":{
        "term":{"title":"kitchen3"}
      },
      "filter":{
        "term":{"price":1000}
      }
    }
  }
}

Случай 2:

{
  "query":{
    "term":{"title":"kitchen3"}
  },
  "filter":{
    "term":{"price":1000}
  }
}

Я нашел это обсуждение http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html, но ссылочный URL-адрес - 404, и объяснение для меня немного кратки.

Пожалуйста, научите или дайте какой-либо документ, который указывает на разницу между ними, спасибо.

4b9b3361

Ответ 1

Разница связана с производительностью. "фильтр" на верхнем уровне всегда выполняется после запроса. Это означает, что запрос выполняется во всех документах, оценка вычисляется для всех документов и т.д. - и только тогда исключаются документы, не соответствующие фильтру.

С "фильтрованным" запросом существует вероятность того, что ES оптимизирует это вычисление, например. сначала выполняет фильтр, затем выполняет запрос по ограниченному набору документов, экономя время на проверку документов, которые не соответствуют фильтру против запроса, и вычислению баллов для них, если они соответствуют запросу.

Если вы выполняете несколько запросов с одним и тем же фильтром, то есть еще больше преимуществ: фильтр может кэшироваться, улучшая производительность каждого запроса еще больше. Это относится к вашему примеру: фильтры "term" кэшируются по умолчанию.

Вы также можете явно контролировать выполнение "отфильтрованного" запроса (см. документацию), чтобы оптимизировать его для вашего конкретного варианта использования.

Ответ 2

Фильтры двух типов можно также отнести к фильтрам pre и post. Как пояснил @alexey, фильтр корневого уровня выполняется после того, как запрос и фильтр в отфильтрованном запросе выполняются перед запросом.

Кроме того, вам нужно понять влияние одного и того же другого, а затем порядок, который они выполняются. Фильтр в "отфильтрованном" запросе попадает под область запроса, что означает, что при расчете агрегаций будет учитываться отфильтрованный вывод, в то время как в случае агрегации фильтра корневого уровня будут выполняться только результаты запроса, исключая фильтр. Хотя в обоих случаях результирующие документы будут такими же.

Например, с двумя запрошенными вами сообщениями оба будут давать одинаковые результаты, но если вы выполняете агрегацию, первый запрос будет вычислять количество агрегатов из документов, соответствующих названию kitchen3, и цене 10000, а второй запрос будет вычислять количество агрегатов из документы, соответствующие названию kitchen3, только без фильтра цены 1000.