Еластична пошукова різниця між ОБОВ'ЯЗКОВО і ДОЛЖНЯ запит bool


169

У чому різниця між MUSTі SHOULDBOOL запит в ES?

Якщо я ТОЛЬКО хочу отримати результати, які містять мої терміни, я повинен тоді використовувати must?

У мене є запит, який повинен містити лише певні значення, а також результати, які мають меншу дату / часову позначку, ніж сьогоднішній час / дата - ЗАРАЗ

Також

Чи можу я використовувати декілька фільтрів усередині обов'язкового коду, як наведено нижче:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },

Відповіді:


250

повинен означати: Запит (запит) повинен міститись у відповідних документах. Ці положення повинні відповідати, як логічне І .

повинен означати: Принаймні один із цих застережень повинен відповідати, як логічний АБО .

В основному вони використовуються як логічні оператори AND і OR. Дивіться це .

Тепер у запиті bool :

повинен означати: Застереження, які повинні відповідати для включення документа.

повинен означати: Якщо ці пропозиції відповідають, вони збільшують _score; інакше вони не мають ефекту. Вони просто використовуються для уточнення оцінки відповідності для кожного документа.


Так, ви можете використовувати кілька фільтрів всередині must.


Трохи запізнюємось на вечірку, але як щодо mustкатегорій чи цін, так і shouldдля атрибутів, таких як розмір і колір. Тепер, якщо обрані розміри L і XL, це значення має бути між цими двома, але якщо також вибрано колір зелений, він повинен бути обов'язковим для (розміри L АБО XL) І (зелений колір). Це можливо?
Mave

Я вважаю, що фільтри можуть бути кращим підходом до атрибутів. Вони орієнтовані на точні збіги, а не на релевантні пошуки. Для отримання додаткової інформації див. Запити та фільтри в документах.
Джим К.

6
Я думаю, що вам потрібно це мати minimum_number_should_match = 1для того, щоб нав'язати думку про те, що "принаймні одна з цих статей повинна відповідати".
Джим К.

Хороша відповідь! Я просто хочу поділитися частиною документації, яка мені дуже допомогла зрозуміти це. elastic.co/guide/en/elasticsearch/guide/current/…
ba0708

1
JimK - або не має застереження. Коли немає обов'язкового застереження, мається на увазі мінімальний_числовий_міський_матч.
LizH

15

Оскільки це популярне питання, я хотів би додати, що у версії Elasticsearch 2 речі дещо змінилися.

Замість filteredзапиту слід використовувати boolзапит на найвищому рівні.

Якщо вам не байдуже кількість mustдеталей, покладіть їх на filterключ. Немає балів означає швидший пошук. Крім того, Elasticsearch автоматично визначить, кешувати їх тощо must_not, однаково справедливо для кешування.

Довідка: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Також майте на увазі, що "gte": "now"це неможливо кешувати через мілісекундну деталізацію. Використовуйте два діапазони в mustпункті: один з, now/1hа другий з nowтаким, щоб перший міг бути кешований на деякий час, а другий для точної фільтрації, прискореної на менший набір результатів.


8

Як сказано в документації :

Обов’язково: пункт (запит) повинен з’являтися у відповідних документах.

Потрібно: Запит (запит) повинен з’явитися у відповідному документі. У булевому запиті, у якому немає обов'язкових застережень, одна чи більше пропозицій повинні відповідати документу. Мінімальна кількість пропозицій повинен відповідати, можна встановити за допомогою параметра minimal_should_match.

Іншими словами, результати повинні бути підкріплені все запити уявити в сусло пункті (або відповідати принаймні один з повинні застережень , якщо немає обов'язково розділ.

Оскільки ви хочете, щоб ваші результати задовольнили всі запити, ви повинні використовувати must .


Ви дійсно можете використовувати фільтри всередині булевого запиту.


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