Разница между полем и field.keyword
Если я добавляю документ с несколькими полями в индекс Elasticsearch, когда я просматриваю его в Kibana, я получаю каждый раз одно и то же поле дважды. Один из них будет называться
some_field
а другой будет называться
some_field.keyword
Откуда происходит это поведение и в чем разница между ними обоими?
PS: один из них является агрегируемым (не уверен, что это значит), а другой (без ключевого слова) нет.
3 ответа
Обновление: краткий ответ будет такого типа: текст анализируется, что означает, что при хранении он разбивается на отдельные слова и позволяет осуществлять поиск в произвольном тексте по одному или нескольким словам в поле. Поле.keyword принимает те же данные и хранится как одна большая строка, что означает, что она может быть агрегирована, и вы можете использовать поиск по ней по шаблону. Агрегируемый означает, что вы можете использовать его в агрегатах в эластичном поиске, который напоминает группу SQL, если вы знакомы с этим. В Кибане вы, вероятно, использовали бы поле.keyword с агрегатами для подсчета различных значений и т. Д.
Пожалуйста, посмотрите на эту статью о text
противkeyword
,
Вкратце: начиная с Elasticsearch 5.0 string
тип был заменен на text
а также keyword
типы. С тех пор, когда вы не указываете явное отображение, для простого документа со строкой:
{
"some_field": "string value"
}
ниже будет создано динамическое отображение:
{
"some_field": {
"type" "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
Как следствие, оба будут иметь возможность выполнять полнотекстовый поиск на
some_field
и поиск по ключевым словам и агрегации с использованиемsome_field.keyword
поле.
Надеюсь, это ответит на ваш вопрос.
Посмотри на эту проблему. В этом есть объяснение вашего вопроса. Грубо говоря some_field
анализируется и может быть использован для полнотекстового поиска. С другой стороны some_filed.keyword
не анализируется и может использоваться в терминах запросов или в агрегации.
Я постараюсь ответить на ваши вопросы один за другим. Откуда такое поведение? Он представлен в Elastic 5.0.
Какая разница между двумя?some_field используется для полнотекстового поиска, а some_field.keyword используется для поиска по ключевым словам. Полнотекстовый поиск используется, когда мы хотим включить в поиск отдельные токены значения поля. Например, если вы ищете все названия отелей, в которых есть слово «ферма», например, дом на ферме сена, дом на ферме в гавани Уинди и т. д.
Поиск по ключевым словам используется, когда мы хотим включить в поиск все значение поля, а не отдельные токены из значения. Например, предположим, что вы индексируете документы на основе поля города. Агрегирование на основе этого поля будет иметь отдельный подсчет для «новый» и «йоркский» вместо «нью-йоркского», что обычно является ожидаемым поведением.
Начиная с Elastic 5.0, строки теперь будут отображаться как ключевое слово и как текст по умолчанию.