#elasticsearch
#elasticsearch
Вопрос:
У меня есть документы со строковыми полями, которые не анализируются (принудительно с помощью сопоставления или задаются глобально). Я пытаюсь понять, в чем практическая разница между
{
"query": {
"bool": {
"must": [
{"match": {"hostname": "hello"}},
]
}
}
}
и
{
"query": {
"term": {
"hostname": "hello"
}
}
}
Я видел в документации по терминальным запросам, что есть разница при анализе строк (что не в моем случае). Есть ли причина использовать term
vs match
?
Комментарии:
1.
term
противmatch
верно?2. Да, извините — я имел в виду
match
, конечно.
Ответ №1:
В term
запросе искомый термин (т. Е. hello
) не анализируется и сопоставляется точно так же, как и термины, присутствующие в инвертированном индексе.
В match
запросе сначала анализируется искомый термин (т. Е. hello
), а затем сопоставляется с терминами, присутствующими в инвертированном индексе.
В вашем случае, поскольку в вашем сопоставлении hostname
есть not_analyzed
, вашим первым выбором должно быть использование term
запроса, поскольку нет смысла анализировать термин во время поиска для поиска того же термина, который не был проанализирован в первую очередь во время индексации.
Комментарии:
1. Это весьма полезно и по существу. Есть ли какое-либо место в документации Elasticsearch, где это упоминается?
2. @akki На самом деле, при использовании
match
запроса ES будет достаточно умен, чтобы сделать то, что я описал выше.3. @akki В официальных документах упоминается эта информация здесь: на основе терминов по сравнению с полнотекстовым