/ #magento #elasticsearch 

Пошук українською мовою в Magento 2

Elasticsearch з коробки працює з великою кількістю мов: arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, estonian, finnish, french, galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, thai. Але солов'їної на жаль немає.

Якщо в Magento 2 ти, як і я, користуєшься пошуком від Smile, то є спосіб навчити цей модуль української. В цьому нам допоможе плагін LemmaGen. Він підтримує 15 мов, серед яких є і українська.

Спочатку треба дізнатись версію Elasticsearch:

curl -XGET 'http://localhost:9200'

У моєму випадку це 7.17.1.

Після цього встановлюємо плагін LemmaGen для потрібної версії:

export VERSION=7.17.1
cd /usr/share/elasticsearch
bin/elasticsearch-plugin install https://github.com/vhyza/elasticsearch-analysis-lemmagen/releases/download/v$VERSION/elasticsearch-analysis-lemmagen-$VERSION-plugin.zip

Тепер додаємо підтримку української мови:

cd /etc/elasticsearch
mkdir -p lemmagen
cd lemmagen
wget https://github.com/vhyza/lemmagen-lexicons/raw/master/free/lexicons/uk.lem

Увага! При роботі локально з docker спрацював інший шлях - /usr/share/elasticsearch/config/lemmagen, але на сервері зафуричило лише якщо покласти файл в /etc/elasticsearch/lemmagen.

Далі перезапускаємо службу elasticsearch:

service elasticsearch restart

Нарешті розширюємо можливості Smile_Searchsuite.

etc/elasticsuite_analysis.xml

<?xml version="1.0"?>
<analysis xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Smile_ElasticsuiteCore:etc/elasticsuite_analysis.xsd">

    <filters>
        <filter name="lemmagen_ukrainian" type="lemmagen" language="uk">
            <lexicon>uk</lexicon>
        </filter>
    </filters>

    <analyzers>
        <analyzer name="standard" tokenizer="standard" language="uk">
            <filters>
                <filter ref="ascii_folding" />
                <filter ref="trim" />
                <filter ref="word_delimiter" />
                <filter ref="lowercase" />
                <filter ref="lemmagen_ukrainian" />
            </filters>
            <char_filters>
                <char_filter ref="html_strip" />
            </char_filters>
        </analyzer>
        <analyzer name="phonetic" tokenizer="standard" language="uk">
            <filters>
                <filter ref="ascii_folding" />
                <filter ref="trim" />
                <filter ref="word_delimiter" />
                <filter ref="lowercase" />
                <filter ref="lemmagen_ukrainian" />
            </filters>
            <char_filters>
                <char_filter ref="html_strip" />
            </char_filters>
        </analyzer>
    </analyzers>
</analysis>  

На цьому все - пошук українською працює ;)

P.S. Існує також плагін analysis-ukrainian, але я не розібрався з його роботою.

Посилання

Author

Олександр Бобилєв

Залишаю собі право використовувати ненормативну (але інформативну) лексику там, де звичайні слова втрачають сенс і не відображають всієї палітри почуттів, від споглядання навколишньої дійсності.