В чем разница между терминальным запросом и совпадающим?

#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 В официальных документах упоминается эта информация здесь: на основе терминов по сравнению с полнотекстовым