Я не вижу описания того, когда мне следует использовать запрос, фильтр или какую-то их комбинацию. В чем разница между ними? Кто-нибудь может объяснить, пожалуйста?
Я не вижу описания того, когда мне следует использовать запрос, фильтр или какую-то их комбинацию. В чем разница между ними? Кто-нибудь может объяснить, пожалуйста?
Ответы:
Разница проста: фильтры кэшируются и не влияют на оценку, поэтому работают быстрее, чем запросы. Посмотрите здесь тоже. Допустим, запрос обычно является чем-то, что пользователь вводит, и в значительной степени непредсказуемым, в то время как фильтры помогают пользователям сузить результаты поиска, например, используя фасеты.
Вот что говорится в официальной документации:
Как правило, вместо запросов следует использовать фильтры:
- для бинарных поисков да / нет
- для запросов на точные значения
Как правило, вместо фильтров следует использовать запросы:
- для полнотекстового поиска
- где результат зависит от оценки релевантности
Индекс Say myindex
содержит три документа:
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
Запрос: насколько документ соответствует запросу
hello sam
(используя ключевое слово must
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
Документу "Hello world! I am Sam."
присваивается более высокий балл, чем "Hello world!"
, поскольку первый соответствует обоим словам в запросе. Документы оцениваются.
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
Фильтр: соответствует ли документ запросу
hello sam
(используя ключевое слово filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Документы, которые содержат hello
или sam
возвращены. Документы НЕ оцениваются .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
Еще немного дополнений к тому же. Сначала применяется фильтр, а затем запрос обрабатывается по его результатам. Для хранения двоичного соответствия истина / ложь для каждого документа используется нечто, называемое массивом bitSet. Этот массив BitSet находится в памяти, и он будет использоваться со второго раза, когда фильтр запрашивается. Таким образом, используя структуру данных массива bitset, мы можем использовать кэшированный результат.
Здесь следует отметить еще один момент: кэш фильтра создается только тогда, когда запрос выполняется, следовательно, только после второго попадания, мы фактически получаем преимущество кеширования.
Но тогда вы можете использовать более теплый API , чтобы перерасти это. Когда вы регистрируете запрос с фильтром для более теплого API, он будет следить за тем, чтобы он выполнялся для нового сегмента при каждом его запуске. Следовательно, мы получим постоянную скорость от самого первого выполнения.
По сути, запрос используется, когда вы хотите выполнить поиск по документам с оценкой. И фильтры используются, чтобы сузить набор результатов, полученных с помощью запроса. Фильтры логические.
Например, скажем, у вас есть индекс ресторанов что-то вроде Zomato. Теперь вы хотите искать рестораны, которые подают «пиццу» , которая в основном является вашим ключевым словом поиска.
Таким образом, вы будете использовать запрос, чтобы найти все документы, содержащие «пиццу», и некоторые результаты будут получены.
Допустим, вам нужен список ресторанов, где подают пиццу и рейтинг не ниже 4.0.
Так что вам нужно будет использовать ключевое слово «пицца» в своем запросе и применить фильтр для рейтинга как 4.0.
Что происходит, так это то, что фильтры обычно применяются к результатам, полученным путем запроса вашего индекса.
Filters
-> Соответствует ли этот документ? бинарный ответ да или нет
Queries
-> Соответствует ли этот документ? Насколько хорошо это соответствует? использует скоринг
Начиная с версии 2 Elasticsearch, фильтры и запросы были объединены, и любое условие запроса может использоваться как фильтр или как запрос (в зависимости от контекста). Как и в версии 1, фильтры кэшируются и должны использоваться, если оценка не имеет значения.