目次
はじめに
現代において、検索サービスはどのようなシステムにおいてもほぼ必須の機能であり、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の左側に以下のコマンドを入力し、再生ボタンを選択してください。
1 2 3 4 |
GET _analyze { "text" : "MISOでは情報技術開発株式会社(tdi)の技術者・コンサルタントが、未(MI)来を創(SO)造する、最新ITのミソをお伝えします。" } |
“GET _analyze”コマンドは、入力されたテキストを指定の解析手法で解析し、その結果を返してくれる機能です。
実行すると、以下のような回答が返ってきます。
内容を確認すると、”MISO”といった半角文字は単語で分割される一方、全角の日本語は一文字ずつ分割されてしまっていることがわかります。このまま検索を行うと、分割された一文字一文字が文書に含まれるかを探索し、スコアを算出するため、”京都”と検索すると”東京都”がヒットしてしまうなど、検索の意図に沿わない結果が返ってくる可能性があります。
では次に、kuromojiを利用した解析を行った場合どうなるのか確認します。先ほどのコマンドに”tokenizer”を指定する行を追加します。
1 2 3 4 5 |
GET _analyze { "tokenizer" : "kuromoji_tokenizer", "text" : "MISOでは情報技術開発株式会社(tdi)の技術者・コンサルタントが、未(MI)来を創(SO)造する、最新ITのミソをお伝えします。" } |
実行すると、以下のような回答が返ってきます。
先ほどと違い、ある程度単語ごとに要素が区切られていることが確認できます。このように、kuromojiを利用することで単語の意味を踏まえた検索を行い、先ほどの”京都”と”東京都”の検索のような場面でも意図に沿う結果を返すことができるようになります。
それでは、実際にkuromojiを利用したインデックスを作成します。
以下のコマンドを入力し、再生ボタンを選択してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
PUT kuromoji_index { "settings": { "analysis": { "analyzer": { "hoge_kuromoji_analyzer": { "type": "custom", "tokenizer": "kuromoji_tokenizer" } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "hoge_kuromoji_analyzer" }, "text": { "type": "text", "analyzer": "hoge_kuromoji_analyzer" } } } } |
“kuromoji_index”がインデックス名です。kuromojiの設定は”analyzer”で行います。今回はタイトルと本文をそれぞれ”title”、”text”として登録するため、これら2項目に対してkuromojiを利用できるように設定しました。
以下のメッセージが表示されればインデックスの作成は完了です。
次は、インデックスに文書を登録します。
Amazon OpenSearch Serviceへの文書登録
文書の登録はDashboards上、もしくはAPI経由で実施することができます。今回はAPI(cURL)経由で文書を登録します。
まず登録用のJSONデータ作成のため、以下のサンプルをコピー&ペーストして任意の名称で保存します。サンプルは国土交通省が発行するオープンデータを編集したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "index" : { "_index": "kuromoji_index", "_id" : "1" } } {"title": "【資料1】「物流事業者におけるKPI導入の手引き」(案).txt", "text":"資料1物流事業者におけるKPI導入の手引き(案)-物流事業者の経営高度化/荷主とのパートナーシップ深化のために- 2015年3月国土交通省 目 次 0.この「手引き」について 1.KPIの概要と必要性 1) KPIとは 2) KPIを用いるメリット 2.KPIの利用目的・利用場面・評価の視点 1) 物流事業者におけるKPI利用目的・利用場面 2) 評価の視点 3) 各評価の視点の概要と指標例"} { "index" : { "_index": "kuromoji_index", "_id" : "2" } } {"title": "〔参考〕物流の効率化に向けた取組について.txt","text": "【機密性2】 物流の効率化に向けた取組について 国土交通省総合政策局物流政策課平成29年3月 トラックドライバーの高齢化と中高年層への依存 【機密性2】 トラックドライバーは全産業平均に比べて平均年齢が高く、高齢化が進んでいる。 今後、中高年層の大量退職を迎えるため、トラックドライバー不足対策は喫緊の課題。 <トラックドライバーの平均年齢> <トラック業界の年齢構成> 36.0 2003 2005 2007 2008 200"} { "index" : { "_index": "kuromoji_index", "_id" : "3" } } {"title": "EDIシステムによる流通取引情報の標準化.txt","text": " 本日の説明 1.業界ネットワークの構築 2.業界標準EDIのメリット 3.EDIの標準化内容 4.業界情報インフラとしての立場 〇ご参考:プラネットの基幹EDIサービス 業界ネットワークの構築 メーカー・卸売業間でやり取りされている商取引に必要 <錯綜したネットワーク>な情報を業界として標準化し、共通のネットワークでデータ交換すること(業界標準EDI)により複数の取引先と統一した業務オペレーションを実現する"} { "index" : { "_index": "kuromoji_index", "_id" : "4" } } {"title": "企業連携による生産性向上に向けた取組(流通経済大学教授 矢野 裕児).txt","text": "企業連携による生産性向上に向けた取組 流通経済大学 流通情報学部矢野裕児 1 物流が直面する課題 長期的なドライバー不足 労働環境の改善-改善基準告示の厳守化 これまでの物流は、トラック輸送比率が高く、厳しい時間指定、 注文してから短いリードタイムでの納品、かつ顧客から非効率な要求であっても対応せざるをえなく、安価な運賃で提供するというのが当たり前の状態。 今までの"} { "index" : { "_index": "kuromoji_index", "_id" : "5" } } {"title": "具体的な事例.txt","text": "原状回復のガイドラインについて Ⅰ原状回復の定義と根拠 原状回復の定義:賃借人の居住、使用により発生した建物価値の減少のうち、賃借人の故意・過失、善管注意義務違反、その他通常の使用を超えるような使用による損耗等を復旧すること(国土交通省による) 原状回復義務の定義:賃借目的物を返還する際、賃借人が設置したものを取り除いて賃借人に返還すること(民法第 598 条による) 善管注意義務:社会通念上要求されると考えられる程度の注意義務。"} { "index" : { "_index": "kuromoji_index", "_id" : "6" } } {"title": "建築基準法道路関係規定運用指針の解説.txt","text": " 建築基準法道路関係規定運用指針の解説 平成19年7月策定平成21年1月改定 国土交通省 目 次 Ⅰ.建築基準法道路関係規定運用指針の解説について ・・・・・・・ 1 1.解説の位置付け ・・・・・・・ 2 2.本解説で取り上げる項目 ・・・・・・・ 2 Ⅱ.改正省令の具体的な運用の考え方 ・・・・・・・ 5 1.指定道路の定義(法第 42 条関係) ・・・・・・・ 6 2.指定道路の指定・取消しに係る手続 ・・・・・・・"} { "index" : { "_index": "kuromoji_index", "_id" : "7" } } {"title": "原状回復をめぐるトラブルとガイドライン_令和2年度版.txt","text": " 2 原状回復に関する契約条件等の開示 現行、賃貸借における原状回復に関する契約条件等の開示については、特に法的な規制はなされていない。宅地建物取引業法では、宅地建物取引業者が賃貸借の代理、媒介を行う場合、重要事項説明項目として、解約時の敷金等の精算に関する事項の説明が義務付けられているが、契約時にその内容が決定していない場合には、その旨説明すればよいこととなっている。 ところで、原状回復にかかる費用は"} { "index" : { "_index": "kuromoji_index", "_id" : "8" } } {"title": "原状回復費用の負担の考え方.txt","text": "原状回復のガイドラインについて Ⅰ原状回復の定義と根拠 原状回復の定義:賃借人の居住、使用により発生した建物価値の減少のうち、賃借人の故意・過失、善管注意義務違反、その他通常の使用を超えるような使用による損耗等を復旧すること(国土交通省による) 原状回復義務の定義:賃借目的物を返還する際、賃借人が設置したものを取り除いて賃借人に返還すること(民法第 598 条による) 善管注意義務:社会通念上要求されると考えられる程度の注意義務。"} { "index" : { "_index": "kuromoji_index", "_id" : "9" } } {"title": "首都直下地震等に対応した支援物資物流システム_後半.txt","text": "'両の追加手配を行う。 物資集積拠点の在庫状況と空き情報を常に把握しておく必要がある。 需給状況や拠点の状況を踏まえた上で調達物資の数量・品目を決定し、各調達先へ要請する。 被災市区町村に備蓄物資を供給した被災地外の市区町村は、どこの市区町村に何をどれだけ送ったかの情報を必ず被災都県に連絡する。被災都県は連絡に基づき、被災市区町村への物資供給量の実績としてとりまとめておく。 図 32 需給調整の手順イメージ"} { "index" : { "_index": "kuromoji_index", "_id" : "10" } } {"title": "首都直下地震等に対応した支援物資物流システム_前半.txt","text": "'首都直下地震等に対応した 支援物資物流システムの構築に関する協議会 2 首都直下地震等に対応した支援物資物流システム 目 次 はじめに 1 第1編 支援物資物流システム 現況分析編 5 第1章 東日本大震災における支援物資供給の問題点 7 第2章 支援物資の物量を踏まえた物流システムの検証・評価 11 2-1.検討の目的と流れ 11 2-2.一次物資集積拠点へのアクセス可能性 12 2-3.支援物資の物量把握と必要な保管面積の推計"} |
“index”内でインデックス名と文書IDを設定します。”_index”に先ほど作成したインデックス名を、”_id”に一意なテキストを設定します。
“index”の下行に登録したい文書を入力します。今回はタイトルと本文をそれぞれ”title”、”text”として登録します。
ファイルを作る際、最後の行に改行がないとデータの登録ができません。必ず末尾に改行コードを残しておいてください。
それでは、実際に文書を登録します。コマンドプロンプトなどのコンソールから以下のコマンドを入力してください。
1 |
curl -XPUT -u "<username>:<password>" "<endpoint_url>/_bulk" --data-binary @<JSON_file_path> -H "Content-Type:application/x-ndjson" |
“endpoint_url”はOpenSearchのドメインエンドポイントのことです。”username”、”password”はきめ細やかなアクセスコントロールで設定したものと同一です。JSONファイルパスは自身の環境に合わせて指定してください。
コマンド実行後、以下のような画面が表示されればデータの登録は完了です。
最後に、実際に登録した文書をOpenSearch上で検索します。
Amazon OpenSearch Serviceで文書を検索
文書の検索は”GET _search”コマンドを利用します。今回は文書のタイトル、本文を検索対象とします。Dashboardsで以下のコマンドを入力し、再生ボタンを選択してください。
1 2 3 4 5 6 7 8 9 |
GET kuromoji_index/_search { "query": { "multi_match": { "fields": [ "title", "text"], "query": "地震発生時の家賃について教えて" } } } |
“fields”で検索したいフィールドを指定し、”query”に検索文を入力します。
実行すると、以下のような結果が返ってきます。
“_score”は検索文と登録されたドキュメントの関連度を表し、値が高いほど関連性が高い文書であると判定されています。
結果の通り、”地震”や”家賃”といった単語が含まれる文書のスコアが高く、自然言語の意図に沿った検索をすることができました。
まとめ
今回はOpenSearch を用いて単語の意図を理解した自然言語検索サービスを構築しました。シンプルな設定で自然言語にも対応した検索ができることがご理解いただけたかと思います。
今回はセキュリティの設定を簡素にしましたが、必要に応じて業務用の本番環境でも十分に対応できる強力なセキュリティ設定を実現することができます。この機会にOpenSearchを使った検索システムを検討してみてはいかがでしょうか。
執筆者プロフィール
- AIアセットのプリセールス活動やAI-OCRを用いた技術検証などに携わっています。近年はデータ分析業務に従事し、BIツールやデータエンジニアリングに取り組んでいます。