Amazon OpenSearch Serviceを使った自然言語検索サービスを構築してみた

Pocket

はじめに

現代において、検索サービスはどのようなシステムにおいてもほぼ必須の機能であり、SQL検索からChatGPTのような高度な質問応答AIを用いた検索まで、多種多様な検索サービスが構築されています。

中でもAmazon OpenSearch Service(以下OpenSearch)を用いた文書検索サービスは、関連度のスコア算出や形態素解析を通じて単語の意図を理解した自然言語の検索を高精度に行うことができます。また、Virtual Private Cloud(以下VPC)エンドポイントを経由したアクセスやアクセスポリシーの設定により容易に情報を保護でき、自社ドキュメントなど、機密情報の検索サービス作成にも対応することができます。

今回は、一般的なOpenSearchの実装と、OpenSearch上で形態素解析を利用する方法を解説します。

Amazon OpenSearch Serviceとは

OpenSearchとは、Amazon Web Services(以下AWS)上にドメインと呼ばれるインスタンスを作成し、ドメイン上に登録された文書を検索できるサービスです。文書は直接ファイルを登録するのではなく、一度ファイルをテキストに変換し、そのデータを記入したJSON形式で登録します。検索や登録はAPI、もしくはOpenSerch Dashboards(以下Dashboards)上から行うことができます。

では、実際にOpenSearchの環境構築を始めていきます。

Amazon OpenSearch Serviceドメインの作成

最初にOpenSearchのドメインを作成します。

今回はテスト用のシンプルな構成で作成します。本番環境では必要に応じてアベイラビリティーゾーン(以下AZ)の数やインスタンスタイプを調整してください。また、本番環境やテストに機密データを利用する際は必要に応じてVPCエンドポイントの設定やアクセスポリシーの設定を強化してください。

まず、AWSコンソールにアクセスします。検索ボックスに”Amazon OpenSearch Service”と入力し、OpenSearchのコンソールに移動します。

OpenSearchのコンソール上ではドメインの作成、管理やVPCエンドポイントの設定などができます。

では、実際にドメインを作成していきます。

OpenSearchのコンソール画面右側のマネージド型クラスターが選択されていることを確認し、ドメインの作成を選択します。

ドメイン名を設定します。英数小文字と”-“のみを使い、3文字以上28文字以内で設定します。今回は”domain-test”と設定します。

ドメインの作成方法はカスタム作成を選択します。テンプレートは開発/テストを選択します。

Deployment Option(s)はスタンバイが無効のドメイン、AZの数は1-AZを選択します。

データノードのインスタンスタイプはt3.small.search、ノード数は1、ノード当たりのEBSストレージサイズを10に設定し、残りはデフォルトにしておきます。

ネットワーク設定はパブリックアクセスを選択します。

きめ細やかなアクセスコントロールの設定はマスターユーザーの作成を選択します。ユーザ名は1-16文字、パスワードは大文字小文字、数字記号すべてを含めた8文字以上で設定します。今回はユーザ名を”domain-user”と設定しました。

アクセスポリシーはきめ細やかなアクセスコントロールのみを使用を選択します。

残りの設定はデフォルトのままにしています。

これでドメインの設定が完了です。最後に作成ボタンを選択し、ドメインを作成します。

DashboardsのURLとドメインエンドポイントが表示されたらドメインの作成は完了です。

次は、インデックスの生成を行います。

インデックスの作成

インデックスとは、特定の検索方法や検索条件を設定したデータの集まりのことです。インデックスの作成は実行機会が少なく、UI上から実行するのがおすすめです。今回はDashboards上からインデックスを作成します。

ドメインのページからDashboardsを開きます。ユーザ名とパスワードを確認されるので、きめ細やかなアクセスコントロールで設定したマスターユーザのユーザ名、パスワードを入力しましょう。

ログイン出来たら左のハンバーガーメニューからDev Toolsを選択します。Dev Toolsでは基本的なAPI操作をUI上で実行できます。

今回はインデックスの作成時にkuromoji_tokenizer(以下kuromoji)を利用できるように設定します。kuromojiはインデックスで利用できる解析手法の一つで、形態素解析を用いた解析や検索ができます。形態素解析とは、自然言語処理の一分野で、文章を単語や言語の最小単位(形態素)に分解する技術のことです。

インデックスを作成する前に、実際にkuromojiの有効性を確認してみましょう。

まずはデフォルトの設定で検索を行った場合どうなるかを確認します。Dev Toolsの左側に以下のコマンドを入力し、再生ボタンを選択してください。

“GET _analyze”コマンドは、入力されたテキストを指定の解析手法で解析し、その結果を返してくれる機能です。

実行すると、以下のような回答が返ってきます。

内容を確認すると、”MISO”といった半角文字は単語で分割される一方、全角の日本語は一文字ずつ分割されてしまっていることがわかります。このまま検索を行うと、分割された一文字一文字が文書に含まれるかを探索し、スコアを算出するため、”京都”と検索すると”東京都”がヒットしてしまうなど、検索の意図に沿わない結果が返ってくる可能性があります。

では次に、kuromojiを利用した解析を行った場合どうなるのか確認します。先ほどのコマンドに”tokenizer”を指定する行を追加します。

実行すると、以下のような回答が返ってきます。

先ほどと違い、ある程度単語ごとに要素が区切られていることが確認できます。このように、kuromojiを利用することで単語の意味を踏まえた検索を行い、先ほどの”京都”と”東京都”の検索のような場面でも意図に沿う結果を返すことができるようになります。

それでは、実際にkuromojiを利用したインデックスを作成します。

以下のコマンドを入力し、再生ボタンを選択してください。

“kuromoji_index”がインデックス名です。kuromojiの設定は”analyzer”で行います。今回はタイトルと本文をそれぞれ”title”、”text”として登録するため、これら2項目に対してkuromojiを利用できるように設定しました。

以下のメッセージが表示されればインデックスの作成は完了です。

次は、インデックスに文書を登録します。

Amazon OpenSearch Serviceへの文書登録

文書の登録はDashboards上、もしくはAPI経由で実施することができます。今回はAPI(cURL)経由で文書を登録します。

まず登録用のJSONデータ作成のため、以下のサンプルをコピー&ペーストして任意の名称で保存します。サンプルは国土交通省が発行するオープンデータを編集したものです。

“index”内でインデックス名と文書IDを設定します。”_index”に先ほど作成したインデックス名を、”_id”に一意なテキストを設定します。

“index”の下行に登録したい文書を入力します。今回はタイトルと本文をそれぞれ”title”、”text”として登録します。

ファイルを作る際、最後の行に改行がないとデータの登録ができません。必ず末尾に改行コードを残しておいてください。

それでは、実際に文書を登録します。コマンドプロンプトなどのコンソールから以下のコマンドを入力してください。

“endpoint_url”はOpenSearchのドメインエンドポイントのことです。”username”、”password”はきめ細やかなアクセスコントロールで設定したものと同一です。JSONファイルパスは自身の環境に合わせて指定してください。

コマンド実行後、以下のような画面が表示されればデータの登録は完了です。

最後に、実際に登録した文書をOpenSearch上で検索します。

Amazon OpenSearch Serviceで文書を検索

文書の検索は”GET _search”コマンドを利用します。今回は文書のタイトル、本文を検索対象とします。Dashboardsで以下のコマンドを入力し、再生ボタンを選択してください。

“fields”で検索したいフィールドを指定し、”query”に検索文を入力します。

実行すると、以下のような結果が返ってきます。

“_score”は検索文と登録されたドキュメントの関連度を表し、値が高いほど関連性が高い文書であると判定されています。

結果の通り、”地震”や”家賃”といった単語が含まれる文書のスコアが高く、自然言語の意図に沿った検索をすることができました。

まとめ

今回はOpenSearch を用いて単語の意図を理解した自然言語検索サービスを構築しました。シンプルな設定で自然言語にも対応した検索ができることがご理解いただけたかと思います。

今回はセキュリティの設定を簡素にしましたが、必要に応じて業務用の本番環境でも十分に対応できる強力なセキュリティ設定を実現することができます。この機会にOpenSearchを使った検索システムを検討してみてはいかがでしょうか。

お問い合わせ先

執筆者プロフィール

Taniguchi Natsuki
Taniguchi Natsukitdi AI&データマネジメント推進部
AIアセットのプリセールス活動やAI-OCRを用いた技術検証などに携わっています。近年はデータ分析業務に従事し、BIツールやデータエンジニアリングに取り組んでいます。
Pocket

関連記事