Проблема японского языка в Elasticsearch

Elasticsearch — это поисковая система, поддерживающая полнотекстовый поиск по большим объемам данных. Он основан на библиотеке Lucene с открытым исходным кодом. Так много для теории. В большинстве случаев вы используете латинский алфавит в своих поисковых записях. А что, если вам нужно выполнить полнотекстовый поиск арабского или японского алфавита или других языков, в которых не используются латинские символы?

В этой статье я собираюсь показать вам, с какими проблемами я столкнулся и как я их решил, работая над проектом для японского рынка. Этот пример продемонстрирует, что стандартные анализаторы, предоставляемые Elasticsearch, не могут корректно взаимодействовать с системами логографического письма.

Последние пару месяцев я участвовал в создании приложения для японского рынка. При отображении индекса я использовал стандартный анализатор текстовых полей, предполагая, что он будет обрабатывать японские символы. Это была ошибка. Первые тесты разработки доказали, что я ошибался. Я тестировал приложение, вводя отдельные существительные. В результате я получил некорректно работающее приложение.

Токенизация и анализ ключевых слов в Elasticsearch

В Elasticsearch анализаторы работают в два этапа.

Первый — это токенизация: процесс разбиения потока текста на слова, например. предложение:

Быстрая коричневая лиса перепрыгнула через ленивую собаку

будут разделены на отдельные слова:

[Быстрая, коричневая, лиса, перепрыгнула, через, ленивую, собаку]

Второй этап заключается в нормализации, характеристики которой зависят от используемого анализатора. В приведенном выше примере я использовал простые слова без других знаков или цифр. Но что произойдет, если текст также содержит не буквенно-цифровые символы? Давайте проверим это. В Elasticsearch используются два самых популярных анализатора: стандартный и простой. Вот некоторая информация о них.

Стандартный анализатор:

  • это инструмент по умолчанию, используемый для текстовых полей,
  • удаляет большинство знаков препинания,
  • заменяет верхний регистр на нижний.

Теперь я собираюсь протестировать анализ более сложного предложения стандартным анализатором на следующем примере: Установите полупрозрачную форму, вызвав set_trans(5)

Результат анализа предложения выше:

[set, the, shape, to, semi, Transparent, by, call, set, trans]

Как видите, пунктуация убрана, а прописные буквы заменены на строчные.

Простой анализатор:

  • удаляет все, что не является буквой,
  • заменяет верхний регистр на нижний.

Итак, результатом анализа будет следующее:

[set, the, shape, to, semi, Transparent, by, call, set, trans]

Проблема анализа японских слов

Я попытаюсь проанализировать предложение Это вкусные суши по-японски, используя простой и стандартный анализаторы. Предложение на японском языке выглядит следующим образом:

寿司がおいしいね.

Для этого я буду использовать функцию _analyze, доступную в API Elasticsearch.

Это запрос:

В результате анализа с помощью стандартного анализатора предложение разбивается на доску.

одиночных знаков: [寿,司, が, お, い, し, い, ね]. И это неправильно.

Далее я собираюсь протестировать работу простого анализатора.

В результате получается доска с одной записью: [寿司がおいしいね]. И это тоже неправильно.

Как вы можете видеть в поле токена, оба анализатора неправильно проанализировали предложение.

Первый разделил текст на отдельные символы, а другой интерпретировал его как одно слово. Оба основных анализатора не смогли хорошо обработать предложение. Чтобы решить эту проблему, вам нужно использовать плагин Kuromoji, который поддерживает полнотекстовый поиск для Elasticsearch.

Установка плагина Куромодзи

Установка действительно проста. В папке Elasticsearch просто напишите команду:

sudo bin/elasticsearch-plugin install analysis-kuromoji

Плагин Куромодзи

После установки плагина Kuromoji я провел тест, также методом _analyze.

Это запрос:

И это результат:

Тест был правильно интерпретирован и проанализирован Elasticsearch. В результате получается доска, состоящая из двух отдельных слов: [寿司], [がおいしいね]

Вывод

Как вы могли видеть в моих примерах, стандартные анализаторы, предоставляемые Elasticsearch, не умеют работать с японской системой письма. Специальный плагин, доступный на веб-сайте создателей, является хорошим решением этой проблемы. Благодаря простому способу установки и эксплуатации плагина его легко реализовать. Единственное, что вам нужно иметь в виду, это установить отображение индекса на текстовые поля, чтобы Elasticsearch мог правильно анализировать тексты. Для простоты я использовал специальный метод _analyze в примерах, представленных в этой статье. Я использовал Elasticsearch версии 5.1.1.

Первоначально опубликовано на xsolve.software 14 марта 2017 г.