もう10年近く開発・保守している乗馬用品ネットショップ ボロ ライディング ショップ に全文検索を追加しました。現在、全文検索エンジンは多数あり全文検索をネットショップに追加のは技術的には簡単ですが、プロトタイプを作りネットショップの方に評価して頂き議論を重ねサービスとしての完成度を高めるのに苦労しました。
検索エンジン Groonga(PGroonga)
Groongaは高速で使い易い全文検索エンジンです。ボロ ライディング ショップのシステムはデータベースにPostgreSQLを使っているのでPostgreSQLの拡張機能として使える PGroonga を使いました。
インストールは yum/apt等で簡単に出来ます、PGroongaをインストールすると SELECT * FROM tables WHERE content &@ '全文検索'
のようにSQLで全文検索が実行できます。
今回の検索対処は商品名、カテゴリー、商品説明文、色、サイズ等です。 これらの情報は複数のテーブルに分かれているので、商品毎の検索対象文字列を格納した検索専用テーブルを用意しました。
優先順
全文検索は、上に書いたように商品名、カテゴリー、商品説明文、色、サイズ等の文字列を検索して、マッチしたものを表示すれば完成だと思っていましたが、プロトタイプをネットショップの方に評価してもらうと。商品名やカテゴリーにマッチする検索結果は商品説明文にマッチした結果より優先して先に表示して欲しいとの要望が出ました。
商品説明文には色々な言葉が書かれて、いっけん検索キーワードとは関係ない商品がマッチしてしまいます。このような事を避けるために検索用のデータを複数用意し、優先順の高いデータがマッチした商品から検索結果に表示されるようにしました。この優先順をどうするかで何度もプロトタイプを作り直しました。
シソーラス
ボロ ライディング ショップは輸入した乗馬用品を販売しているので、商品名やメーカー等は英語表記とカタカナ表記の両方が検索ワードとして使われます。また 革・カワ のように漢字・カタカナも使われるますし、女性・レディースのような同義語も検索ワード使われます。
このような同義語を使っても同じような検索結果が得られるように、シソーラス(同義語)辞書機能を用意しました。
色名
ボロ ライディング ショップでは多数の乗馬ウエアを扱っています。ウエアを検索する際に色名はよく使われる事が予想できます。
しかし商品の色名には「シェンナ」、「ルビー」のような微妙な色合いを現す単語が使われていますが、大筋ではどちらも「赤」です。
このような大筋の色名はシソーラスで実現出来ると思いました。しかし、ネットショップの方からは「アイスブルー」「サファイア」は「水色」、「ナイトブルー」「インペリアル」は「紺」しかし、これら4つの色は「青」でもあるように出来ないか? と言われました。
色名が重要である事は分かっていたので、シソーラスではなく色名に関しては、「アイスブルー」のような具体的な色名は「水色」、「青」というグループに属するという色グループ辞書を用意する事で対応しました。
まとめ
このように、検索エンジンという難易度の高い技術は既存のライブラリーを使う事で用意に実現できますが、アプリケーションの特性を考え良いのも作るには作り込みが必用になります。
そのような作り込みは開発者だけでは無理で、ユーザーや運営者の意見を取り込む必用があります。それにはプロタイプを作り評価してもらうことが重要です。開発者としては、そのような環境を準備する事が重要な選択だと思います。
ボロ ライディング ショップ は10年前に Ruby on Railsを採用し、5年前からサーバーもクラウドに移行し、プロタイプ・評価の繰り返しが用意に出来るようにした事は良い選択だったと思っています。