Эластичный поиск: разница между "термином", "соответствием фразе" и "строкой запроса"
Новое в упругом поиске и попытка лучше понять разницу между этими запросами. Насколько я могу сказать, 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