5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Liferay 7.3 + Elasticsearch 7.9.3 + Kuromoji NEologd plugin

Last updated at Posted at 2021-05-31

はじめに

Liferay7.3では、検索エンジンにElasticsearchを利用している。だがデフォルトはシンプルなKuromojiのみを利用しており、アナライザ・トークナイザの精度は高くはない。今回は新語や固有表現に強いIpadic-NEologd辞書を利用したプラグインを利用した、形態素解析の精度が高い日本語検索にElasticsearchをチューニングしてみます。

この記事の内容を反映したDocker composeはhttps://github.com/yasuflatland-lf/elasticsearch-docker-composer-for-liferay-7/tree/7.9.3_AdoptOpenJDK11に置いてあります。ご自分が利用されるElasticsearchのバージョンが異なる場合は、以下の手順でElasticsearchプラグインを自作する必要がありますがこのDocker Composeをそのまま利用される場合は、[How to set upの1-4]を実行して、Liferay側のElasticsearch設定から読んでください。

前提条件

  • Liferay DXP 7.3 SP1
  • Elasticsearch 7.9.3
  • Docker 3.3.3+
  • テストした環境はMac OS 11.4 (Big Sur) メモリ32GB

Elasticsearchの指定

Liferay 7.3 SP1現在、対応するElasticsearchは7.9+ということで、7.9.3を利用することとする。

Elasticsearch + Kuromoji NEologdのDocker Composeレポジトリを取得

https://github.com/yasuflatland-lf/elasticsearch-docker-composer-for-liferay-7git cloneし、ブランチを7.9.3_AdoptOpenJDK11に切り替える。

該当のElasticsearchで利用しているLuceneのバージョンを調べる

Elasticsearchで利用しているLuceneに対してプラグインを作成するので、以下の方法で利用しているLuceneのバージョンを調べることができる。

  1. このDocker Composeファイルdocker-compose up --buildで起動する。
  2. http://localhost:9200/にアクセス。以下のような表示がされる
{
  "name" : "LiferayElasticsearchCluster",
  "cluster_name" : "LiferayElasticsearchCluster",
  "cluster_uuid" : "AR7mNfG8Q5K_Iy_F7pMqzg",
  "version" : {
    "number" : "7.9.3",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "c4138e51121ef06a6404866cddc601906fe5c868",
    "build_date" : "2020-10-16T10:36:16.141335Z",
    "build_snapshot" : false,
    "lucene_version" : "8.6.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

ここからLuceneのバージョンは"lucene_version" : "8.6.2",ということがわかる。

Kuromoji を mecab-neologdとしてビルド

https://github.com/kazuhira-r/kuromoji-with-mecab-neologd-buildscriptに有志の方が作成してくれているビルドスクリプトがあるので、これを利用させてもらって、Kuromojiをビルドする。

  1. https://github.com/kazuhira-r/kuromoji-with-mecab-neologd-buildscriptgit cloneする。

  2. chmod +x build-lucene-kuromoji-with-mecab-ipadic-neologd.shで実行権限をつける。

  3. build-lucene-kuromoji-with-mecab-ipadic-neologd.shを開き、以下のコードのlucene-solrのバージョンを先ほど調べたLuceneバージョンに変更する。

     ## Lucene Target Tag
     DEFAULT_LUCENE_VERSION_TAG=releases/lucene-solr/8.6.2
     LUCENE_VERSION_TAG=${DEFAULT_LUCENE_VERSION_TAG}
    
  4. ./build-lucene-kuromoji-with-mecab-ipadic-neologd.shでビルドを実行する。

  5. lucene-analyzers-kuromoji-ipadic-neologd-8.6.2-20200910.jarが生成される。

Elasticsearch用プラグインビルド

これもまた有志の方がプラグインを作ってくれているのだが、7.9.3バージョンはない。自前ビルドバージョンを読み込むように変更したコードをここにおいてあるので、それを利用してビルドする。

  1. https://github.com/codelibs/elasticsearch-analysis-kuromoji-ipadic-neologd リポジトリをgit cloneする。
  2. pom.xmlを以下のように編集する。
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.codelibs</groupId>
 	<artifactId>elasticsearch-analysis-kuromoji-ipadic-neologd</artifactId>
-	<version>7.2.1-SNAPSHOT</version>
+	<version>7.9.3-SNAPSHOT</version>
 	<packaging>jar</packaging>
 	<description>This plugin provides an analysis library for Kuromoji with UniDic and Neologd.</description>
 	<inceptionYear>2011</inceptionYear>
 	<properties>
-		<elasticsearch.version>7.2.1</elasticsearch.version>
+		<elasticsearch.version>7.9.3</elasticsearch.version>
 		<elasticsearch.plugin.classname>org.codelibs.elasticsearch.kuromoji.ipadic.neologd.KuromojiNeologdPlugin</elasticsearch.plugin.classname>
 		<maven.compiler.source>1.8</maven.compiler.source>
 		<maven.compiler.target>1.8</maven.compiler.target>
-		<lucene.version>8.0.0</lucene.version>
-		<kuromoji-ipadic-neologd.version>20190808</kuromoji-ipadic-neologd.version>
+		<lucene.version>8.6.2</lucene.version>
+		<kuromoji-ipadic-neologd.version>20200910</kuromoji-ipadic-neologd.version>

 	</properties>

3 . Mavenの最新バージョンを使うように編集する。
※ バージョン一覧:[maven-source-plugin] [maven-assembly-plugin] [org.codelibs.analyzers]

<plugin>
    <artifactId>maven-source-plugin</artifactId>
-		<version>3.1.0</version>
+		<version>3.2.1</version>

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
-		<version>3.1.1</version>
+		<version>3.3.0</version>

<dependency>
    <groupId>org.codelibs</groupId>
    <artifactId>analyzers</artifactId>
-		<version>8.0.0.0</version>
+		<version>8.7.0.0</version>

4 . ロードするAnalizerが変わったことから、全コードのパッケージを以下のように変更。IDEを使っている場合は、再度インポート元を指定しなおしてやる。

- org.codelibs.neologd.ipadic.lucene.analysis
+ org.apache.lucene.analysis

5 . build-lucene-kuromoji-with-mecab-ipadic-neologd.shで生成されたjarをそのディレクトリにコピーする。
6 . mvn packageでビルドする

※1. Jarファイルが識別できない場合、下記のコマンドで、JARファイルをMavenにインストールしてください。)
参考:Guide to installing 3rd party JARs

mvn install:install-file -Dfile=JARファイルのパス/lucene-analyzers-kuromoji-ipadic-neologd-8.6.2-20200910.jar -DgroupId=org.codelibs -DartifactId=lucene-analyzers-kuromoji-ipadic-neologd -Dversion=8.6.2-20200910 -Dpackaging=jar

7 . /target/releases以下にelasticsearch-analysis-kuromoji-ipadic-neologd-7.9.3-SNAPSHOT.zipというファイルが生成される。

Elasticsearchに組み込み

  1. elasticsearch-docker-composer-for-liferay-7リポジトリに移動
  2. esディレクトリにelasticsearch-analysis-kuromoji-ipadic-neologd-7.9.3-SNAPSHOT.zipをコピー
  3. Dockerfileを開いて、以下のように変更。
FROM docker.elastic.co/elasticsearch/elasticsearch:7.9.3

COPY ./elasticsearch-analysis-kuromoji-ipadic-neologd-7.9.3-SNAPSHOT.zip ./

RUN elasticsearch-plugin install file:./elasticsearch-analysis-kuromoji-ipadic-neologd-7.9.3-SNAPSHOT.zip
RUN elasticsearch-plugin install analysis-icu
RUN elasticsearch-plugin install analysis-smartcn
RUN elasticsearch-plugin install analysis-stempel

Liferay側のElasticsearch設定

  1. Control Panel -> System Settings -> Search -> Elasticsearch 7へ移動
  2. Production Mode Enabledにチェックを入れる
  3. Additional Index Configurationselasticsearch-docker-composer-for-liferay-7リポジトリのルートディレクトリにあるindex-settings.jsonの中身をコピー
  4. Override Type Mappingsliferay-type-mappings.jsonの中身をコピー
  5. Network Host AddressesにElasticsearchのサーバーURLを入力。(今回はローカルDockerイメージの為、デフォルトhttp://localhost:9200のままで設定不要)
  6. 設定を保存、サーバーを再起動
  7. Control Panel -> Search -> Connections -> Active ConnectionsにElasticsearchサーバが識別されて、バージョンが7.9.3であることを確認
  8. Control Panel -> Search -> Index Actions -> Reindex all search indexes.を実行

Liferayでの動作テスト

これでLiferay、Elasticsearchのインテグレーションができたので、次は実際にコンテンツを作ってみる。今回は、東京都というワードと京都が入った記事を作成し、正しく別の言葉として検索できるかをテストする。

Liferayのデフォルト言語を英語としてセットアップしてあるという前提で説明する。Liferayではデフォルト言語はデフォルト設定ではStandard Analyzerが利用されてしまうため、日本語検索結果が不正になる。そのため、デフォルト言語は英語でセットアップすることをおすすめする。

Web Contentの作成

  1. Web Contentを開き、Basic Web Contentを作成する。英語ロケールでタイトルはTest1、コンテンツもTest1とする
  2. 次にロケールを日本語に変更し、タイトルはそのまま、コンテンツを京都の観光施設・名所巡りランキングTOP10とする
  3. もう一つBasic Web Contentを作成し、英語ロケールでタイトルとコンテンツをTest2、日本語ロケールでタイトルはTest2のままにし、コンテンツは東京都の水道に関する手続きや料金、東京都水道局の事業や取組、事業者の方向けの情報などをご紹介しています。とする。
  4. 右上のアバターアイコンをクリックし、Acount SettingからPersonal InformationのLanguageを日本語に変更し、保存。
  5. 一回ログアウトして、再ログイン。

検索テスト

  1. ユーザー側のトップ画面に戻り、画面右上の検索バーから東京都と検索する
  2. Test2のみヒットする
  3. 次に京都で検索する。
  4. Test1のみヒットする

まとめ

このように、LiferayはElasticsearchのアナライザとトークナイザーをNEologd辞書を利用したプラグインに差し替えるだけで、日本語での検索性能をデフォルトでも向上させることが可能となる。例えば特定の製品コードのパターンにマッチさせたいなどの調整はまたコード側のカスタマイズが必要にはなるが、単純な検索でよい要件の場合は、実用にたえる検索のベースとして利用できるのではないだろうか。

5
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?