Відповіді:
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\""
}
}
}
Про різні варіанти цих запитів можна сказати набагато більше, перегляньте відповідну документацію:
Сподіваюся, це досить зрозуміло і це допоможе.
match
запит використовує аналізатор, якщо поле аналізується, так, так. За замовчуванням він поверне документи, що мають принаймні один із термінів (див. Параметр operator
), і порядок не важливий.
Я думаю, що хтось, безумовно, шукає відмінностей між ними щодо ЧАСТИЧНОГО ПОШУКУ Ось мій аналіз із стандартним "аналізатором" за замовчуванням : -
Припустимо, у нас є дані: -
{"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".