このエントリはMagento Advent Calendar 2018の11日目です。

有償版のMagento Commerceでは以前からElasticsearchによる商品検索ができましたが、無償版のOpen Sourceでも2.3からはElasticsearchが利用できるようになりました。
今回はElasticsearchを利用するメリットと、導入方法について解説したいと思います。

Magento2系と商品キーワード検索

Magento1系では、Magentoの商品キーワード検索機能はMySQLのLikeまたは全文検索を使用してきました。
Like検索の場合は部分一致検索なので、データベースのインデックスがあまり有効に機能せず、パフォーマンス的に厳しい側面がありました。

また、Magento1系の場合はApache Solrを使用する実装が有償版やサードパーティ製エクステンションで提供されてきましたが、古いバージョンのSolrのインデックス更新があまり高速ではないこともあり、10万点以上商品があるサイトの場合はなかなか厳しいところがありました。

Magento2系になり、実装は大きく改められ、商品キーワード検索はMySQLによる全文検索が標準となり、CommerceではApache SolrやElasticsearchの連携が利用できるようになりました。

MySQLの全文検索における課題

古いMySQLでは、全文検索といえばMyISAM型テーブルに対するもので、InnoDB型テーブルを対象としたものではありませんでした。
そのため、Magento1では検索専用のデータを格納するテーブルをMyISAM型でわざわざ定義し、
最近のMySQLはInnoDB型テーブルであっても、フルテキストインデックスが作成できるようになっているため、全文検索クエリを発行して検索をかけることが可能です。

ところが、往々にしてあることなのですが、この手のフルテキストインデックスは日本語のような膠着語に対してはなかなか有効に機能しないことが多々あります。
日本語の場合、単語の区切りがあまり明確ではなかったり、1文字や2文字の単語も非常に多いことから、西ヨーロッパ諸語のような半角スペースを区切りとした文章の評価は効果がありません。
そのため、Magento2系を導入された方から「商品検索がヒットしない」という声をよく頂いてきました。

MySQL5.7以降で使えるngramパーサーを使用した全文検索

Magentoに一切手を入れずに対処する方法として、MySQL5.7から実用レベルになった、InnoDB型テーブルにおけるフルテキストインデックスでngramパーサーを使う方法があります。
インデックスを定義する際に以下のように記述することで、インデックス対象の列に格納されているデータを所定の文字数で分割してインデックス化するものです。

CREATE FULLTEXT INDEX FTI_FULLTEXT_DATA_INDEX ON catalogsearch_fulltext_scope<ストアID>(data_index) WITH PARSER ngram;

この方法を利用すると、難しいカスタマイズをしなくとも検索の精度がある程度向上します。
ですが、実は以下の問題点を抱えることになります。

  • 1文字の単語にはヒットしない
  • 商品更新時などに発生するインデックス更新コストが増大し、場合によってはデッドロックする
  • 商品検索インデックスをコマンドから再構築すると、手動でインデックスを作り直す必要がある

実際のところ、この方式は実際のサイトで試してみましたが、全くといっていいほどお薦めはできません。
ですからMagento Open Source 2.2まではサードパーティ製のElasticsearch連携や、商品検索専門の外部サービスを利用する必要性がありました。

Magento Open Source2.3のElasticsearch連携

そしてついに、Magento2.3からはOpen Source版でもElasticsearch連携が標準搭載されるようになりました。
この機能自体はこれまでMagento Commerceに搭載されてきたものと同じで、2.3からは両エディションで共通した実装が採用されています。
(つまり商品検索に関して言えば、Open SourceもCommerceも同等と言えます)

MagentoとElasticsearchを連携させるには

Elasticsearchを使うためには、お使いのサーバーにElasticsearchをインストールするか、Amazon Web ServicesのElasticsearch Serviceのようなマネージドサービスを利用して、Elasticsearchが動く環境を用意する必要があります。
この部分はElasticsearchの公式ドキュメントや、各種マネージドサービスのマニュアルを見ていただくとして、要はElasticsearchがMagentoの動作しているWebサーバーからhttp/httpsでアクセスできる場所でセットアップされていればOKです。

次に、Magentoの管理画面にあるカタログの設定画面で、Elasticsearchサーバーに対する接続情報を設定します。

Elasticsearch設定


接続情報についてはサーバー管理者やサービス提供事業者に確認してください。

設定ができ、接続が確認できたら、検索インデックスを再構築します。
基本はたったこれだけです。

日本語に対する検索精度の向上

現在弊社ではMagento Community Engineering Teamと協力して、Elasticsearch連携を日本語向けに調整する改良を進めています。
標準状態でもMySQLの全文検索よりは良好に動作するのですが、さらに精度を向上させることを目指しています。

すでにMagentoをお使いで、商品キーワード検索の精度でお悩みの方は、を開始いたしましたので、ご検討いただければ幸いです。