近年、検索技術の進化に伴い、従来のキーワード検索に加えて、意味に基づく検索手法である「セマンティック検索」も利用できるようになってきました。セマンティック検索は、検索対象の文書に関する意味的な表現を利用して、利用者が検索する内容に適した検索結果を提示します。
Fessでも標準的なキーワードによる検索に加えて、セマンティック検索が利用できるように対応が進められています。まだ実験的な機能ではありますが、今回は、Fessでのセマンティック検索の利用方法について紹介します。
Fessの起動
セマンティック検索を利用するためには、Fess 14.7以上が必要になります。 今回は、Docker Composeを利用して、Fess 14.7.0とOpenSearch 2.6の環境を構築します。 まず、Docker Composeで起動に必要なファイルをダウンロードします。
$ curl -o compose.yaml https://raw.githubusercontent.com/codelibs/docker-fess/v14.7.0/compose/compose.yaml
$ curl -o compose-opensearch2.yaml https://raw.githubusercontent.com/codelibs/docker-fess/v14.7.0/compose/compose-opensearch2.yaml
セマンティック検索を利用するためには、fess-webapp-semantic-searchプラグインが必要になります。そのプラグインをインストールするため、ダウンロードしたcompose.yml 9行目の「FESS_PLUGINS=〜」のコメントアウトを外し、以下のように書き換えます。
environment:
- "SEARCH_ENGINE_HTTP_URL=http://es01:9200"
- "FESS_DICTIONARY_PATH=${FESS_DICTIONARY_PATH:-/usr/share/opensearch/config/dictionary/}"
- "FESS_PLUGINS=fess-webapp-semantic-search:14.7.0 fess-ds-wikipedia:14.7.0"
fess-ds-wikipediaプラグインは、セマンティック検索には不要ですが、Wikipediaのデータを利用して、今回の検索結果の検証をするためにインストールします。 compose.yaml の修正後、compose.yamlが置いてあるフォルダで、以下を実行してFessを起動します。
$ docker compose -f compose.yaml -f compose-opensearch2.yaml up -d
管理画面左メニューの「システム」>「プラグイン」をクリックし、「fess-webapp-semantic-search」と「fess-ds-wikipedia」のプラグインがインストールされていることを確認してください。
OpenSearchの設定
Fessのセマンティック検索は、OpenSearchのNeural Searchプラグインの機能を利用しています。そのため、Neural Searchプラグインの手順に従って、OpenSearchに言語モデルをロードする必要があります。今回は、その手順をまとめた setup.sh を用意したので、それを実行することで、OpenSearchに言語モデルをロードします。 OpenSearchでの言語モデルの利用方法を知りたい方は、Neural Searchプラグインのドキュメントを参照するか、setup.sh の内容を確認してください。 setup.sh は今後も改善されていく予定なので、興味がある方はfess-webapp-semantic-searchのサイトを確認してください。
以下のように setup.sh を取得して実行します。
$ curl -o setup.sh https://raw.githubusercontent.com/codelibs/fess-webapp-semantic-search/20230421/tools/setup.sh
$ bash ./setup.sh
Uploading language model...
Checking task:BqICoocB3Ws9eVwmqJy..........
Loading model:B6ICoocB3Ws9eVwmqLd...
Checking task:CKIDoocB3Ws9eVwmKKLD................
Setting pipeline:neuralpipeline...
--- system properties: start ---
fess.semanticsearch.pipeline=neuralpipeline
fess.semanticsearch.content.field=contentvector
fess.semanticsearch.content.dimension=384
fess.semanticsearch.content.method=hnsw
fess.semanticsearch.content.engine=lucene
fess.semanticsearch.content.modelid=B6ICoocB3Ws9eVwm_qLd
--- system properties: end ---
Docker Desktopでのメモリー割当が少ない場合などには、言語モデルの読み込みでエラーになる場合があります。その場合は、メモリー割当を増やしてください。
Fessの設定
Fessの管理画面にログインし、左メニューの「システム」>「全般」をクリックして、「システムプロパティ」に setup.sh で出力された fess.semantic_search.* の情報を入力します。
次に、管理画面左メニューの「システム情報」>「メンテナンス」をクリックし、「シャード数」に1 を入力して「開始」ボタンをクリックします。
再インデクシングして、インデックスを作り直すことで、セマンティック検索が利用できるインデックスが作成できます。
クロール設定
次に、クロール設定を作成します。 管理画面の左メニュー「クローラー」>「データストア」>「新規作成」をクリックして、以下の項目を入力します。
「名前」には任意のクロール設定の名前を入力し、「ハンドラー名」は「WikipediaDataStore」を選択します。 パラメーターには以下を設定します。
url=https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles1.xml-p1p114794.bz2
limit=10000
url に指定しているのは、Wikipediaのコンテンツデータのダンプです。 jawiki-latest-pages-articles.xml.bz2 は全データを取得できますが、サイズが大きすぎるので、今回は https://dumps.wikimedia.org/jawiki/latest/ から分割されたファイルを探して利用しています。指定する際には、対象ファイルのファイル名を確認して、指定してください。
limit はインデックス数の上限です。今回は1万件を上限として、インデックスを作成します。
スクリプトには以下を設定します。
lang="ja"
filetype=format
filename=title
url="https://ja.wikipedia.org/wiki/" + encodedTitle
host="ja.wikipedia.org"
site="ja.wikipedia.org"
title=title
content=content
digest=digest
anchor=
contentlength=content.length()
lastmodified=timestamp
timestamp=timestamp
クロールの実行
それでは、クロールを実行してみましょう。 管理画面の左メニューの「システム」>「スケジューラ」で「Default Crawler」のジョブを開きます。「今すぐ開始」をクリックしてクローラを開始し、ジョブの状態が「実行中」から「有効」になるまで待ちます。
検索
クロール完了後、検索語を指定して検索してみます。 キーワード検索と異なり、検索語と同義の検索結果が上位に表示されます。
現時点では、セマンティック検索は「シャード数」×「件数」がヒット件数として、一致するものが検索結果として返ってきます。そのため、キーワード検索とは違い、意味的に類似する上位N件が取得できるかたちになります。
* * *
まだ実験的な機能ではありますが、Fessを利用すると、手軽にセマンティック検索を利用することができると思います。 ChatGPTの登場や検索技術の進化に伴い、全文検索の在り方も大きく変わっていくことが考えられます。セマンティック検索はこの進化の基盤となる技術であり、Fessはその流れに合わせて、新たな検索体験を提供していく予定です。
今後も、Fessのセマンティック検索は改善されていくので、ぜひ、いろいろと試してみてください。