Elasticsearch - Анализ
Когда запрос обрабатывается во время операции поиска, содержимое любого индекса анализируется модулем анализа. Этот модуль состоит из анализатора, токенизатора, tokenfilters и charfilters. Если анализатор не определен, то по умолчанию встроенные анализаторы, токен, фильтры и токенизаторы регистрируются в модуле анализа.
В следующем примере мы используем стандартный анализатор, который используется, когда не указан другой анализатор. Он проанализирует предложение на основе грамматики и произведет слова, используемые в предложении.
POST _analyze
{
"analyzer": "standard",
"text": "Today's weather is beautiful"
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"tokens" : [
{
"token" : "today's",
"start_offset" : 0,
"end_offset" : 7,
"type" : "",
"position" : 0
},
{
"token" : "weather",
"start_offset" : 8,
"end_offset" : 15,
"type" : "",
"position" : 1
},
{
"token" : "is",
"start_offset" : 16,
"end_offset" : 18,
"type" : "",
"position" : 2
},
{
"token" : "beautiful",
"start_offset" : 19,
"end_offset" : 28,
"type" : "",
"position" : 3
}
]
}
Настройка стандартного анализатора
Мы можем настроить стандартный анализатор с различными параметрами в соответствии с нашими индивидуальными требованиями.
В следующем примере мы настраиваем стандартный анализатор так, чтобы max_token_length равнялся 5.
Для этого сначала создаем индекс с анализатором, имеющим параметр max_length_token.
PUT index_4_analysis
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard",
"max_token_length": 5,
"stopwords": "_english_"
}
}
}
}
}
Далее мы применяем анализатор с текстом, как показано ниже. Обратите внимание, что маркер не отображается, поскольку в нем есть два пробела в начале и два пробела в конце. Для слова «есть» есть пробел в начале и пробел в конце. Взяв все из них, получается 4 буквы с пробелами, и это не превращается в слово. По крайней мере, в начале или в конце должен быть непробельный символ, чтобы слово было подсчитанным.
POST index_4_analysis/_analyze
{
"analyzer": "my_english_analyzer",
"text": "Today's weather is beautiful"
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"tokens" : [
{
"token" : "today",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
},
{
"token" : "s",
"start_offset" : 6,
"end_offset" : 7,
"type" : "",
"position" : 1
},
{
"token" : "weath",
"start_offset" : 8,
"end_offset" : 13,
"type" : "",
"position" : 2
},
{
"token" : "er",
"start_offset" : 13,
"end_offset" : 15,
"type" : "",
"position" : 3
},
{
"token" : "beaut",
"start_offset" : 19,
"end_offset" : 24,
"type" : "",
"position" : 5
},
{
"token" : "iful",
"start_offset" : 24,
"end_offset" : 28,
"type" : "",
"position" : 6
}
]
}
Список различных анализаторов и их описание приведены в таблице ниже -
S.No | Анализатор и описание |
---|---|
1 | Standard analyzer (standard) Для этого анализатора можно установить стоп-слова и max_token_length. По умолчанию список стоп-слов пуст, а max_token_length равно 255. |
2 | Simple analyzer (simple) Этот анализатор состоит из токенизатора нижнего регистра. |
3 | Whitespace analyzer (whitespace) Этот анализатор состоит из токенизатора пробелов. |
4 | Stop analyzer (stop) Stopwords и stopwords_path можно настроить. По умолчанию стоп-слова инициализируются английскими стоп-словами, а stopwords_path содержит путь к текстовому файлу со стоп-словами. |
Токенизаторы
Токенизаторы используются для генерации токенов из текста в Elasticsearch. Текст можно разбить на токены с учетом пробелов или других знаков препинания. Elasticsearch имеет множество встроенных токенизаторов, которые можно использовать в настраиваемом анализаторе.
Пример токенизатора, который разбивает текст на термины всякий раз, когда он встречает символ, который не является буквой, но также переводит все термины в нижний регистр, показан ниже.
POST _analyze
{
"tokenizer": "lowercase",
"text": "It Was a Beautiful Weather 5 Days ago."
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"tokens" : [
{
"token" : "it",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
},
{
"token" : "was",
"start_offset" : 3,
"end_offset" : 6,
"type" : "word",
"position" : 1
},
{
"token" : "a",
"start_offset" : 7,
"end_offset" : 8,
"type" : "word",
"position" : 2
},
{
"token" : "beautiful",
"start_offset" : 9,
"end_offset" : 18,
"type" : "word",
"position" : 3
},
{
"token" : "weather",
"start_offset" : 19,
"end_offset" : 26,
"type" : "word",
"position" : 4
},
{
"token" : "days",
"start_offset" : 29,
"end_offset" : 33,
"type" : "word",
"position" : 5
},
{
"token" : "ago",
"start_offset" : 34,
"end_offset" : 37,
"type" : "word",
"position" : 6
}
]
}
Список токенизаторов и их описания показаны здесь, в таблице, приведенной ниже -
S.No | Токенизатор и описание |
---|---|
1 | Standard tokenizer (standard) Это построено на токенизаторе на основе грамматики, и для этого токенизатора можно настроить max_token_length. |
2 | Edge NGram tokenizer (edgeNGram) Для этого токенизатора можно установить такие настройки, как min_gram, max_gram, token_chars. |
3 | Keyword tokenizer (keyword) Это генерирует весь ввод как вывод, и для этого можно установить buffer_size. |
4 | Letter tokenizer (letter) Это захватывает все слово, пока не встретится не буква. |