Запити проти фільтрів


198

Я не бачу жодного опису, коли я повинен використовувати запит, фільтр або якусь комбінацію обох. У чому різниця між ними? Хто-небудь може пояснити, будь ласка?


46
Офіційна документація насправді не дуже зрозуміла
geekazoid

2
Схоже, з’явилася сторінка з більш розширеним поясненням: elastic.co/guide/en/elasticsearch/guide/master/…
Дмитро Полушкин

6
Варто зауважити, що запити та фільтри будуть об’єднані в ES 2.0, отже, більшість сказаних і написаних для запитів проти фільтрів більше не застосовуватимуться. Також перевірте офіційне повідомлення в блозі, де оголошено про ці зміни.
Валь

Відповіді:


201

Різниця проста: фільтри кешуються і не впливають на показник, тому швидше, ніж запити. Подивіться і тут . Скажімо, запит, як правило, те, що користувачі набирають і вкрай непередбачувано, тоді як фільтри допомагають користувачам звужувати результати пошуку, наприклад, використовуючи фасетки.


19
Так, якщо користувач здійснює пошук типу Google, то я використовував би запит? Якщо вони вибирають можливе значення зі спадного меню (наприклад, рахунок рахунків-фактур> 50), це був би фільтр?
Джонсі

4
Так, саме так. Кожен раз, коли вам потрібно обмежити весь набір документів деякими показниками, зазвичай це так, що фільтр є відповідним. Тож можливо за віком, довжиною, розміром тощо тощо
Зак

Моє рішення використовує фільтри та запити в одному запиті, і це дуже швидко в тестовій базі даних. Незабаром ми отримаємо живі дані там, щоб побачити, наскільки це швидко.
Джонісі

@Zach Щоб бути абсолютно зрозумілим, у системі з багатьма орендарями - з дозволами для користувачів усередині орендатора - це звучить, як інформація орендатора / автентифікації була б фільтром, який додається до кожного запиту (тобто відфільтрованого запиту). Правильно?
Скотт Віллеке

4
@activescott Так, саме цим я б займався. Ви також можете налаштувати відфільтровані псевдоніми, щоб "псевдоніми користувачів" завжди застосовували відповідний фільтр. Полегшує адміністрування та не потребує змін коду для оновлення запитів, додаткової чіткості у вашому запиті тощо
Zach

99

Про це говорить офіційна документація:

Як правило, замість запитів слід використовувати фільтри:

  • для бінарних так / ні пошуків
  • для запитів про точні значення

Як правило, запити слід використовувати замість фільтрів:

  • для повного пошуку тексту
  • де результат залежить від показника релевантності

коли я хочу видалити документ, чи повинен я використовувати фільтр, якщо це можливо? Я не хочу, щоб це було кешоване
Rytek

при видаленні документа ви не потребуєте жодної оцінки, а також не потрібно здійснювати повнотекстовий пошук. Отже, це був би фільтр, ніж, оскільки вам просто потрібно прийняти рішення про видалення / не видалення. filter-query-context
nonNumericalFloat

13

Приклад (спробуйте самі)

Скажімо, індекс 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."
     }
   ...

Якщо вам не потрібен повнотекстовий пошук або підрахунок балів, віддається перевага фільтрам, оскільки часто використовувані фільтри будуть кешовані автоматично Elasticsearch, щоб прискорити продуктивність. Див. Еластичний пошук: контекст запитів та фільтрів.


11

Трохи більше доповнення до того ж. Спочатку застосовується фільтр, а потім запит обробляється за його результатами. Для зберігання бінарного істинного / хибного відповідності на документ використовується щось, що називається bitSet Array. Цей масив BitSet знаходиться в пам'яті, і він буде використовуватися з другого разу, коли фільтр запитується. Таким чином, використовуючи структуру даних масиву біт, ми можемо використовувати кешований результат.

Ще один момент, який слід зазначити, кеш-фільтр створюється лише тоді, коли запит виконується, тобто лише з другого звернення, ми фактично отримуємо перевагу кешування.

Але тоді ви можете використовувати тепліший API , щоб перерости це. Коли ви реєструєте запит з фільтром проти теплішого API, він буде впевнений, що він виконується проти нового сегмента кожного разу, коли він з’являється в реальному часі. Отже, ми отримаємо стійку швидкість від самого першого виконання.


1
Цікаво! Я не розумів, що фільтри трапляються перед запитами. Кешування фільтрів тепер має більше сенсу.
Постійний мірінг

Не завжди. Основна та основна відмінність між відфільтрованим та постійним запитом балів. Постійний бал завжди спочатку виконує запит, а потім застосовує над ним фільтр. Навіть відфільтрований запит має налаштування, за допомогою яких запит може виконуватися перед фільтрами.
piyushGoyal

10

В основному, запит застосовується, коли ви хочете здійснити пошук за вашими документами з оцінкою. І фільтри використовуються для звуження набору результатів, отриманих за допомогою запиту. Фільтри булі.

Наприклад, ви кажете, що у вас є індекс ресторанів, подібний до zomato. Тепер ви хочете шукати ресторани, які пропонують "піцу" , що в основному є вашим ключовим словом для пошуку.

Таким чином, ви використовуєте запит, щоб знайти всі документи, що містять "піцу" і будуть отримані деякі результати.

Скажіть, що ви хочете список ресторанів, де подають піцу, і рейтинг не менше 4,0.

Тож вам доведеться скористатися ключовим словом "піца" у своєму запиті та застосувати фільтр для оцінки як 4.0.

Що відбувається, так це те, що фільтри зазвичай застосовуються за результатами, отриманими шляхом запиту вашого індексу.


Не можете надати приклад органу запиту?
Собака

9

Filters-> Чи відповідає цей документ? двоичная так чи ні відповіді

Queries-> Чи відповідає цей документ? Наскільки це добре відповідає? використовує скоринг


0

Починаючи з версії 2 Elasticsearch, фільтри та запити були об'єднані, і будь-який пункт запиту може використовуватися як фільтр, або як запит (залежно від контексту). Як і у версії 1, фільтри є кешованими і їх слід використовувати, якщо оцінка не має значення.

Джерело: https://logz.io/blog/elasticsearch-queries/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.