Эластичный поиск: разница между "термином", "соответствием фразе" и "строкой запроса"

Новое в упругом поиске и попытка лучше понять разницу между этими запросами. Насколько я могу сказать, term совпадения одного термина (должен совпадать в нижнем регистре для соответствия?), и оба match phrase а также query string соответствует строке текста.

2 ответа

Решение

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, в котором содержится текст сразу из нескольких текстовых полей. Кроме того, он анализируется и поддерживает некоторые операторы (И / ИЛИ...), подстановочные знаки и т. Д. (См. Связанный синтаксис).

Как match_phrase запросы, входные данные анализируются в соответствии с анализатором, установленным в поле запроса.

в отличие от match_phrase термины, полученные после анализа, не обязательно должны быть в одном и том же порядке, если только пользователь не использовал кавычки вокруг ввода.

Например, используя те же документы, что и раньше, этот запрос вернет все документы:

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

Но этот запрос вернет те же 2 документа, что и match_phrase запрос:

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

Можно еще много рассказать о различных вариантах этих запросов, пожалуйста, ознакомьтесь с соответствующей документацией:

Надеюсь, это достаточно ясно, и это поможет.

Я думаю, что кто-то определенно ищет различия между ними в отношении ЧАСТИЧНОГО ПОИСКА. Вот мой анализ со стандартным анализатором по умолчанию:

Предположим, у нас есть данные: -

{ "name": "Hello"}

А что если мы хотим выполнить частичный поиск с помощью ell???

Термин Запрос ИЛИ Совпадение запроса

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

Не получится, вернемся, отметим.

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

Не получится, вернемся, отметим.

Вывод - термин или совпадение вообще не могут выполнять частичный поиск

Подстановочный запрос: -

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

Будет работать, дать результат { "name": "Hello"}

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

Не получится, вернемся, отметим.

Вывод - подстановочный знак может выполнять частичный поиск только с одним токеном

Строка запроса:-

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

Будет работать, дать результат { "name": "Hello"}

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

Будет работать, дать результат { "name": "Hello"} .

Вывод - query_string умеет искать с двумя токенами

-> здесь токены ell и zz

Другие вопросы по тегам