Elasticsearch: разница между терминами, фразами соответствия и строкой запроса


116

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

Ответы:


227

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

Если вы предоставили Bennettво время индексации и значение не проанализировано, следующий запрос ничего не вернет:

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

match_phrase query проанализирует входные данные, если для запрашиваемого поля определены анализаторы, и найдет документы, соответствующие следующим критериям:

  • все термины должны появиться в поле
  • они должны иметь тот же порядок, что и входное значение

Например, если вы индексируете следующие документы (с помощью 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\""
    }
  }
}

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

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


Великолепное, чудесное и подробное объяснение! Единственное, в чем я не понимаю, это что такое анализ или что он делает ...
blee908

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

1
Да, исходя из SQL, здесь много новых идей. Разница между запросами и фильтрами, точными значениями и полным текстом, объектом поиска JSON и тем, как эластичный поиск выполняет свой поиск. ТАК МНОГО ВЗЯТЬ !!! Спасибо за ресурс!
blee908

1
@ThomasC Если в вашем индексе есть {"foo": "Hello beautiful world"}, вернет ли это соответствующий запрос?
Batmaci

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

17

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

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

{"name": «Привет»}

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

Term Query OR Match query

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

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

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

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

Заключение - Term or Match вообще не может выполнять частичный поиск

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

{"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


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