Elasticsearch: різниця між "терміном", "збігом фрази" та "рядком запиту"


116

Нове тут у Elasticsearch та намагається краще зрозуміти різницю між цими запитами. Наскільки я можу сказати, termзбігається з одним терміном (чи має бути малий регістр, щоб збіг працював?), І обидва, match phraseі query stringзбігаються з рядком тексту.

Відповіді:


226

termзапит відповідає одному терміну, як він є: значення не аналізується . Отже, це не має бути нижчим регістром залежно від того, що ви індексували.

Якщо ви вказали Bennettв індексний час і значення не було проаналізовано, наступний запит нічого не поверне:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase запит проаналізує вхідні дані, якщо аналізатори визначені для запитуваного поля та знайдуть документи, що відповідають таким критеріям:

  • всі умови повинні відображатися в полі
  • вони повинні мати той самий порядок , що і вхідне значення

Наприклад, якщо ви індексуєте такі документи (використовуючи standardаналізатор для поля foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Цей match_phraseзапит поверне лише перший та другий документи:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringпошук за замовчуванням у полі _all, яке містить текст декількох текстових полів одночасно. Крім цього, він розбирається та підтримує деякі оператори (AND / OR ...), підстановочні символи тощо (див. Пов'язаний синтаксис ).

Як match_phraseзапити, вхід аналізується відповідно до аналізатора, встановленого в запитуваному полі.

На відміну від match_phraseтермінів, отриманих після аналізу, не повинно бути в одному порядку, якщо тільки користувач не використав лапки навколо вводу.

Наприклад, використовуючи ті самі документи, що і раніше, цей запит поверне всі документи:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Але цей запит поверне ті самі два документи, що й match_phraseзапит:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Про різні варіанти цих запитів можна сказати набагато більше, перегляньте відповідну документацію:

Сподіваюся, це досить зрозуміло і це допоможе.


Чудове, чудове та ґрунтовне пояснення! Єдине, що мені незрозуміло, це те, що саме аналізує чи робить ...
blee908

1
Запрошуємо :) Аналізатори обробляють текст, щоб отримати терміни, які остаточно індексуються / шукаються. Прочитайте ці сторінки Посібника з остаточного пошуку ElasticSearch, оскільки це дійсно важлива концепція, яку потрібно зрозуміти.
ThomasC

1
Ага, що йде від SQL, тут багато нових ідей. Різниця між запитами та фільтрами, точними значеннями порівняно з повним текстом, об'єктом пошуку JSON, а також способом еластичного пошуку. ТАКОГО ВІДПОВІСТЬ !!! Дякуємо за ресурс!
blee908

1
@ThomasC Якщо у вашому індексі був {"foo": "Привіт прекрасний світ"}, відповідь запиту поверне це?
batmaci

1
@batmaci matchзапит використовує аналізатор, якщо поле аналізується, так, так. За замовчуванням він поверне документи, що мають принаймні один із термінів (див. Параметр operator), і порядок не важливий.
ThomasC

17

Я думаю, що хтось, безумовно, шукає відмінностей між ними щодо ЧАСТИЧНОГО ПОШУКУ Ось мій аналіз із стандартним "аналізатором" за замовчуванням : -

Припустимо, у нас є дані: -

{"name": "Привіт"}

Що робити, якщо ми хочемо зробити частковий пошук з ell ???

Термін запит АБО відповідність запиту

{"term":{"name": "*ell*" }

Не вийде, повернувшись, зауваживши.

{"term":{"name": "*zz* *ell*" }

Не вийде, повернувшись, зауваживши.

Висновок - Термін чи відповідність взагалі не в змозі зробити частковий пошук

Запит на підстановку: -

{"wildcard":{"name": "*ell*" }

Буде працювати, дасть результат {"name": "Привіт"}

{"wildcard":{"name": "*zz* *ell*" }

Не вийде, повернувшись, зауваживши.

Висновок - wildcard може виконати частковий пошук лише одним маркером

Запит запитів: -

{"query_string": {"default_field": "name","query": "*ell*"}

Буде працювати, дасть результат {"name": "Привіт"}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Працює, дасть результат {"name": "Привіт"}.

Висновок - query_string здатний шукати за допомогою двох маркерів

-> тут лексеми є ell і zz


wildcard is able to do partial search with one token only: точніше, wildcardзапити за замовчуванням працюють лише на keywordполях , які за визначенням є однотоковими. Це не має нічого спільного з тим, що вміст поля є більш ніж одним словом. У вашому запиті підказки відповідатиме "ozzy hello".
сокс з Монікою
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.