2015-03-10 3 views
39

Есть ли разница между «запросом и фильтром в фильтрах» и «запросом и фильтром на корне»? например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 и объяснение немного слишком кратким для меня.

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

+5

http://stackoverflow.com/questions/28937819/filter-inside-or-outside-filtered-query –

ответ

34

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

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

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

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

+0

можете ли вы рассказать мне в отфильтрованном запросе, если i напишите фильтр перед запросом, не повлияет ли он на производительность или нет? –

+1

@SudhanshuGaur порядок ключей в запросе JSON не влияет на результаты. Вы можете управлять стратегией фильтра, которая может влиять на производительность: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html#_filter_strategy –

7

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

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

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

+1

Выполняется фильтрация в отфильтрованном запросе перед запросом "- не нужно –