Я не бачу жодного опису, коли я повинен використовувати запит, фільтр або якусь комбінацію обох. У чому різниця між ними? Хто-небудь може пояснити, будь ласка?
Я не бачу жодного опису, коли я повинен використовувати запит, фільтр або якусь комбінацію обох. У чому різниця між ними? Хто-небудь може пояснити, будь ласка?
Відповіді:
Різниця проста: фільтри кешуються і не впливають на показник, тому швидше, ніж запити. Подивіться і тут . Скажімо, запит, як правило, те, що користувачі набирають і вкрай непередбачувано, тоді як фільтри допомагають користувачам звужувати результати пошуку, наприклад, використовуючи фасетки.
Про це говорить офіційна документація:
Як правило, замість запитів слід використовувати фільтри:
- для бінарних так / ні пошуків
- для запитів про точні значення
Як правило, запити слід використовувати замість фільтрів:
- для повного пошуку тексту
- де результат залежить від показника релевантності
Скажімо, індекс 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 Array. Цей масив BitSet знаходиться в пам'яті, і він буде використовуватися з другого разу, коли фільтр запитується. Таким чином, використовуючи структуру даних масиву біт, ми можемо використовувати кешований результат.
Ще один момент, який слід зазначити, кеш-фільтр створюється лише тоді, коли запит виконується, тобто лише з другого звернення, ми фактично отримуємо перевагу кешування.
Але тоді ви можете використовувати тепліший API , щоб перерости це. Коли ви реєструєте запит з фільтром проти теплішого API, він буде впевнений, що він виконується проти нового сегмента кожного разу, коли він з’являється в реальному часі. Отже, ми отримаємо стійку швидкість від самого першого виконання.
В основному, запит застосовується, коли ви хочете здійснити пошук за вашими документами з оцінкою. І фільтри використовуються для звуження набору результатів, отриманих за допомогою запиту. Фільтри булі.
Наприклад, ви кажете, що у вас є індекс ресторанів, подібний до zomato. Тепер ви хочете шукати ресторани, які пропонують "піцу" , що в основному є вашим ключовим словом для пошуку.
Таким чином, ви використовуєте запит, щоб знайти всі документи, що містять "піцу" і будуть отримані деякі результати.
Скажіть, що ви хочете список ресторанів, де подають піцу, і рейтинг не менше 4,0.
Тож вам доведеться скористатися ключовим словом "піца" у своєму запиті та застосувати фільтр для оцінки як 4.0.
Що відбувається, так це те, що фільтри зазвичай застосовуються за результатами, отриманими шляхом запиту вашого індексу.
Filters
-> Чи відповідає цей документ? двоичная так чи ні відповіді
Queries
-> Чи відповідає цей документ? Наскільки це добре відповідає? використовує скоринг
Починаючи з версії 2 Elasticsearch, фільтри та запити були об'єднані, і будь-який пункт запиту може використовуватися як фільтр, або як запит (залежно від контексту). Як і у версії 1, фільтри є кешованими і їх слід використовувати, якщо оцінка не має значення.