Elasticsearch: разница между "Term", "Match Phrase" и "Query String"

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

{ "name": "Hello" }

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

Запрос запроса или запрос соответствия

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

Не будет работать, вернемся.

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

Не будет работать, вернемся.

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

wildcard Query: -

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

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

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

Не будет работать, вернемся.

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

Query_string: -

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

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

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

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

Заключение - запрашивается query_string с двумя маркерами

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