Elasticsearch 6: как подключить плагин русской морфологии

Некоторое время назад понадобилось сделать полнотекстовый поиск в проекте. Решено делать было с помощью elasticsearch. Выбор пал на версию 6 с чем-то. И тут возникла проблема — родной морфологический анализатор русского языка, который идет в комплекте, не очень то хорошо ищет по текстам на русском.

Особенно фамилии. В официальной документации рекомендуют использовать словари hunspell для улучшения работы токенизатора и, как следствие, улучшения качества поиска. В интернете по запросу «elasticsearch русская морфология» очень нахваливают этот плагин. По сути это обертка над Russian Morphology for Apache Lucene для elasticsearch.

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

NOTE: Please note that this plugin is available only for Elasticsearch v5.6.x and below. For Elasticsearch version 6.0 and above consider switching to the officially supported hunspell token filter with russian dictionaries.

Если попробовать установить этот плагин под elasticsearch 6 или 7 — будет ошибка несоответствия версий. Но это не повод отказываться от такого замечательного плагина!

Можно, конечно, поступить по-простому и поставить подходящую версию elasticsearch, но это было бы слишком легко, да и хочется версию по-новее :)

Что ж, будем разбираться как подключить russian morphology к elasticsearch 6/7.

  1. Для начала нужно скачать elasticsearch analysis morphology с гихаба. Либо в zip, либо склонировать к себе репозиториий командой
    git clone git@github.com:imotov/elasticsearch-analysis-morphology.git

    Если качали архив — его нужно распаковать. Это форк репозитория плагина с более дружелюбными настройками сборки.

  2. В каталоге elasticsearch-analysis-morphology нужно найти файл build.gradle и поправить в нем версии на нужные. Допустим, у вас стоит elasticsearch 6.8.0. Если не знаете версию elasticsearch, которую установили, выполните в консоли
    curl -XGET 'localhost:9200'

    В результате получите похожий ответ:

    {
      "name" : "auyV813",
      "cluster_name" : "homestead",
      "cluster_uuid" : "a_QkvOQASDOZHbs6HNTLEA",
      "version" : {
        "number" : "6.8.0",
        "build_flavor" : "default",
        "build_type" : "deb",
        "build_hash" : "65b6179",
        "build_date" : "2019-05-15T20:06:13.172855Z",
        "build_snapshot" : false,
        "lucene_version" : "7.7.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You Know, for Search"
    }

    Итак, меняем в build.gradle:

    • 26 строка:
      classpath "org.elasticsearch.gradle:build-tools:6.8.0"
    • 42 строка:
      version = '6.8.0'

      В обоих случаях следует указать версию elasticsearch под которую собираете плагин.

    • 38 строка: следует поправить протокол на https
      url "https://dl.bintray.com/babayotakun/russianmorphology"

      Иначе могут быть ошибки при сборке плагина:

      * Where:
      Build file ‘/Users/irelic/Code/elasticsearch-analysis-morphology/build.gradle’ line: 36

      * What went wrong:
      A problem occurred evaluating root project ‘elasticsearch-analysis-morphology’.
      > repository [bintray-babayotakun-russianmorphology] on project with path [:] is using http for artifacts on [http://dl.bintray.com/babayotakun/russianmorphology]

  3. Возможно, потребуется обновить gradle/wrapper/gradle-wrapper.properties, поменяв в первой строке версию gradle на актуальную
  4. Сборку плагина следует производить с помощью gradle. Это утилита для сборки, которая сделает свои дела на основании файла, который нужно было отредактировать выше. Как установить можно найти на офсайте.
    Если не установлен jdk, сначала придется поставить его и java 12, если версия другая — нужно обновить или установить отдельно 12. Иначе при сборке будет ошибка:

    * Where:
    Build file ‘/Users/irelic/Code/elasticsearch-analysis-morphology/build.gradle’ line: 32

    * What went wrong:
    A problem occurred evaluating root project ‘elasticsearch-analysis-morphology’.
    > Failed to apply plugin [id ‘elasticsearch.esplugin’]
    > the compiler java.home must be set to a JDK installation directory for Java 12 but is [/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home] corresponding to [11]

    Как обновить java до версии 12 на Mac OS пишут тут.

  5. После установки gradle запускаете в каталоге elasticsearch-analysis-morphology сборку
    gradle build

    или

    ./gradlew

    . Gradle скачает все необходимое и соберет плагин в файл, который положит в каталог build/distributions.

    Сообщение об успешном завершении билда:

    BUILD SUCCESSFUL in 1m 25s
    36 actionable tasks: 35 executed, 1 up-to-date

  6. Теперь остается только распаковать плагин в каталог плагинов elasticsearch:
    unzip build/distributions/analysis-morphology-6.8.0.zip -d /usr/share/elasticsearch/plugins/analysis-morphology
  7. Проверяем что все получилось:
    $ /usr/share/elasticsearch/bin/elasticsearch-plugin list
    analysis-morphology

Плагин установлен и работает на вашей версии эластиксерч. Подключить русскую морфологию к elasticsearch просто!

Запись опубликована в рубрике Web-разработка с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">