Magentoで構築した日本語向けサイトでは、次のような問題が頻発します。

  • 商品検索が意図した結果ではない

この問題は、Magento Open SourceでもAdobe Commerceでも共通して発生します。
もちろん構築時にサイトの特性に合わせた調整がしてあれば回避可能ですが、何も考えずに構築した場合は、高確率でトラブルが発生します。

なぜ、Magentoの商品検索はイケてないのか?

Magentoの商品検索は、歴史的に次のような段階を経てきました。

  1. MySQLのLike検索
  2. Apache Solrを使用した全文検索
  3. MySQLの全文検索
  4. Elasticsearchを使用した全文検索

MySQLのLike検索

Magento1.xで主に使用されていた実装です。
他のアプリケーションでもよく使用されるものですが、パフォーマンスがお世辞にも良いとはいえませんでした。
データベースの性質上、部分一致のLike検索はインデックスが使用できないため、商品件数が増えるとパフォーマンス劣化が起こりやすい問題を抱えていました。

Apache Solrを使用した全文検索

主に有償版のMagento1.xに提供されていた実装です。
Apache Solrを検索エンジンとして利用することで、MySQLのLike検索よりも制度の高い検索機能が実現可能でした。
旧Magento Community Editionの場合はサードパーティの実装を使用することで、同様の検索機能を提供可能でしたが、サードパーティによって実装方針が異なるため、機能差が相応に見られました。

MySQLの全文検索

Magento2.0 - 2.3の標準です。
MySQLに標準で用意されている全文検索機能を用いて検索を行う仕組みです。
Like検索に比べ、全文検索インデックスが利用できるぶんだけ検索速度面では優位ですが、

  • 2文字以下の単語にヒットしない
  • 日本語の構文解析能力があまり高くない

という問題があります。
場合によってはLike検索よりもヒット率が落ちる事があり、英語圏ではそれなりに使えますが、日本語や中国語では少し微妙な実装です。

Elasticsearchを使用した全文検索

Magento Commerce 2.2以降またはMagento Open Source 2.3以降で利用可能な検索機能です。
Magneto Open Source 2.4以降ではMySQLの全文検索が廃止されるため、事実上唯一の選択肢となります。

Elastic社の開発しているElasticsearchと連携することで、高度な構文解析による検索機能を提供できます。
今回の解説対象はこのElasticsearchを使用した全文検索です。

Magentoの商品検索の仕組み

Magentoの商品検索は、次のような仕組みになっています。

  1. 商品属性として定義されているものののうち「検索に使用する」となっている属性を対象にする
  2. 対象属性の値を収集し、検索用のインデックスとして整形・格納する
  3. 入力された検索キーワードを解析し、検索用インデックスに対して検索を行う
  4. ヒットした商品の情報を表示する

実際はもっと細かい処理ステップがありますが、大枠としては上のような流れになっています。

良い検索結果を得たい場合、2と3の部分でのElasticsearch上での構文解析が重要になります。

英語と日本語の特性の違い

Magentoの主な開発者は英語圏(あるいは半角スペースで語を区切る言語の文化圏)の方が多く、日本語の構文については基本的に理解がありません。
多くのElasticsearchに関する解説サイト・記事でも触れられていますが、

  • 多くの言語:かなり明確なルールで単語を分かち書き可能。
  • 日本語(中国語や韓国語も):語の区切りが不鮮明。独自の解析が必要。

という違いがあります。
Magentoの標準実装では、Elasticsearchに標準で用意されている「Standard Tokenizer」を使用して属性のテキストを評価します。
もちろん、日本語で記述された商品属性データが「Standard Tokenizer」で解釈しやすい内容であれば、特段問題はありません。

ですが多くの場合は日本語の自然文が商品説明などに記述されていることがほとんどで、これらをそのまま検索に使用することになります。
このような場合は良い結果を得られないことがほとんどではないでしょうか。

商品検索の精度を上げるには

では、Magentoで検索の精度を上げることはできないのか?というとそんな事はありません。
オープンソースソフトウエアである以上、ソースコードを見ることは可能ですし、その実装に基づいてカスタマイズを加えることも可能です。

ここではどのように調整すれば精度を改善できるか、について解説をしていきます。

商品属性の特性に合わせた構文解析を選択する

最初に考えるべきことは、「商品属性の特性に合わせた構文解析を選択する」ということです。

例えば、商品番号のような半角英数字と一部の記号だけで構成されるような属性については、構文解析はあまり必要ではありません。
概ね属性の値をそのままインデックスとして登録すればよいでしょう。

反対に商品説明文のような自然文の場合は言語によって考慮する幅が大きく変わります。
日本語の場合であれば、Elasticsearch向けには「kuromoji」のような日本語用の形態素解析処理に基づく構文解析プラグインがリリースされています。
サイトで販売する商品の特性にもよりますが、まずはこういったものを利用するのが良いでしょう。

インデックス時と検索時で異なる構文解析を使用する

Magentoの場合、標準の実装ではインデックスの作成時と検索時で同じ構文解析を使用しています。
もちろんこれで問題なく運用できるサイトもあると思いますが、多くのサイトでは以下のような現象が発生します。

  • 検索がヒットしすぎる
  • 指定したキーワードでヒットしない
  • 部分一致でヒットしない

これらの現象の大半はインデックス時と検索時で同じ構文解析が使用されていることによって引き起こされます。
本来、文章を解析してインデックスを作成する際と、検索を行う際では異なる構文解析を用いるほうが良い結果を得られます。

必要に応じて類義語やサイト固有の単語の辞書を整備する

日本語の場合、

  • アルファベットとカタカナの相互変換
  • 表記のゆらぎ
  • 正式名称と略称の相互変換

といったものが検索の際には重要になるケースがあります。
Elasticsearchには「シノニム」という仕組みがあり、この辞書データを作成して利用することによってこれらの揺れを吸収することができます。

また、「kuromoji」などには品詞の辞書が利用できる機能が用意されています。
サイト固有の単語などはこの辞書に登録することで、一般名詞と区別して扱うことができます。

OR検索ではなく、AND検索にする

Magento標準の実装では、キーワード検索は以下のような動きをします。

  1. 入力されたキーワードを半角スペースで分割する
  2. 分割したキーワードを構文解析にかける
  3. 検索クエリに組み立てて、Elasticsearchに送信する

2の際にMagentoは「OR」を使用するため、入力されたキーワードのいずれかが含まれていれば結果が得られます。
サイトによっては「OR」の場合に結果が得られすぎてしまうため、ここを「AND」にすることで結果件数を絞ることができます。

標準ではないElasticsearch連携を使用する

Magento標準のElasticsearch連携の機能はかなり限定的です。
全く使えないわけではありませんが、かなりオーソドックスな機能に限定されているため、できないことも多々あります。

幸い、Magentoには多くのサードパーティ製の実装が提供されています。
これらを利用することによって、標準実装に手を入れることなく、目的の機能を手に入れられる可能性はあります。

より良い検索には個別チューニングが必要

ここまで解説をしてきましたが、Magentoで良い検索機能を提供するためには、そのサイトの構成や商品データを把握した上での調整が不可欠です。
弊社では「 Elasticsearch導入支援 」をご提供しております。
様々なサイトで培ったノウハウをベースとした調整をご提供可能となっておりますので、Magentoの検索機能でお悩みの事業者様は一度お問い合わせください。