Amazon KendraでDBをデータソースとして検索・複数のデータソースを選択して検索した結果

# はじめに
こんにちは。株式会社ジールの@is_zealです。
前回の投稿で、Amazon Kendraを使用してS3に保存したテキストファイルをデータソースとして検索しましたが、その中でさらに気になったことがあったので、追加で検証をしてみました。

【前回投稿した記事】
https://qiita.com/is_zeal/items/fdc976de108c369f7f56

# 今回検証する内容

① DB(RDS)をデータソースとして検索した場合、作成したテーブルの値を読み取って結果を返してくれるのか？
② 複数のデータソースを選択して検索した場合、1つのデータソースにしか存在しないデータでも結果を返してくれるのか？

# 検証準備

今回の検証では、RDSとS3をデータソースとして使用します。

<b>〈環境構成図〉</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/93b7be7e-9a88-3879-ae93-33f4eeed8552.png)

〈検証準備〉

a.　RDSに検証用のテーブルを作成する。
b.　S3にバケットを作成し、そのバケットに検証用テキストファイルを格納する。
c.　Amazon Kendraで検証用のインデックスを作成する。
d.　作成した検証用インデックスに、RDSコネクタを使用して、検証用のテーブルをデータソースとして追加する
e.　作成した検証用インデックスに、S3コネクタを使用して、S3バケットをデータソースとして追加する
f.　追加したデータソースを同期させる

検証準備 b、c、e、f については、前回投稿した記事と同じように実施します。
検証準備 a については、以下の記事を参考に検証用のテーブルを作成しました。
〈参考記事〉
https://qiita.com/saki-engineering/items/b4a5f61d5632c952a6cb

〈作成した検証用のテーブル：Sales〉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/b6a5024f-da77-5436-a6da-94911fd3bc38.png)

今回は検証準備 d の手順を記載します。
※画面は日本語に翻訳して表示しています。

<b>検証準備 d. 
作成した検証用インデックスに、RDSコネクタを使用して、検証用のテーブルをデータソースとして追加する</b>

①データソースの追加画面から、Amazon RDSコネクタの「コネクタの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/2f940cdc-a51f-b4e5-af4c-90ab6a1eb0ae.png)

②任意のデータソース名を入力し、言語を選択して「次に」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/5ac5210a-d744-29b3-d65d-89aedc8c5ca6.png)

③データソースとして追加したいRDSの情報、AWS Secrets Managerの選択、VPCとセキュリティグループ、IAMロールを入力して、「次に」をクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/5a7c1f3d-d5ae-dcba-7c10-3b69ed53ae07.png)

④使用するデータベースエンジンを選択して、ACL列と検出列(データソースとして追加するテーブルの項目名)を追加し、同期実行スケジュールを選択して「次に」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/c8a807b4-8d39-a008-5a9a-52e0d90c99ab.png)
※全角文字を入力すると、以下のようなエラー表示が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/d2186579-d729-dceb-058a-115ec82cfcff.png)
※テーブルの項目名が間違っていると、同期時にエラーが発生し同期が失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/78c735cd-aecb-3762-0834-ca986d2b1569.png)

⑤Amazon Kendraのフィールドマッピング設定を行います。
追加するテーブルの列名とデータ型を選択し、Amazon Kendraがデータをマッピングして読み取れるように設定を行います。今回はデータソースとして追加する全ての列をマッピングします。

マッピングの設定後、「次に」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/2a4d8c6c-fc67-d005-0c77-f3194a74bcd4.png)
フィールドのマッピング設定にミスがあると、データソースの追加やデータの同期を行う際にエラーとなります。
<b>[失敗例]</b>
・データベース列名がテーブルの項目名と異なっている
・データ型が間違っている

⑥「データソースの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/d8f70b64-04ab-cbe0-94b8-596e0d7d3039.png)


# 検証① 
<b>DB(RDS)をデータソースとして検索した場合、作成したテーブルの値を読み取って結果を返してくれるのか？</b>

今回、検証で使用するテーブルは以下の「Sales」テーブルです。

〈Sales〉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/dc0ba288-20e9-90ac-9d1a-3ace260895aa.png)

まずは自然言語で「りんごの値段は？」と検索してみると、以下のように結果が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/da8e09c7-6fd8-7227-3c1f-65a2e9b34598.png)
Amazon Kendraから答えを提案はしてくれず、「文書フィールド」で検索ワードに当てはまるデータを表示しています。
また、name列が「ばなな」のデータも表示されています。
(関連性のあるものでソートしましたが、なぜか「ばなな」のデータも関連性があると判断されています...)

自然言語ではなく、「りんご」という単語だけを入力して検索してみると、以下のように結果が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/388df476-e863-b0fd-7db6-1b2e0527aa57.png)
自然言語で検索した時と同じように、Amazon Kendraが答えを提案することはありませんでしたが、大きく異なるのはname列が「りんご」のデータのみが表示されました。(「値段」という言葉が検索結果に影響してしまったのかもしれません...)

テーブルにあるデータを読み取ってくれているようですが、自然言語での検索だと情報の絞り込みが難しいようです。

「1月のりんごの売上額は？」といったような、集計が必要となる検索についても試してみましたが、Amazon Kendraは答えを提案してくれず、「りんごの値段は？」と検索した時と同じように文書フィールドのみを結果として表示しました。

# 検証②
<b>複数のデータソースを選択して検索した場合、1つのデータソースにしか存在しないデータでも結果を返してくれるのか？</b>

Amazon Kendraではデータソースを1つだけでなく、複数追加することができます。
実際に、データソースとして検証①で使用したRDSのテーブルと、S3バケットに格納したxlsxファイルを追加して検索してみました。
〈データソース①：Salesテーブル(RDS)〉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/3b064df0-3768-6ac2-0816-0d3295b62058.png)
〈データソース②：test.xlsx(S3)〉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/64948c73-64d0-9810-6b8f-039a8f138be1.png)

データソース②：test.xlsxには、RDS側も持っているりんごの価格と、RDS側が持っていないみかんの価格を記載しています。

2つのデータソースを追加して、「みかんの値段は？」と検索したところ、以下のような結果が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/1686d48c-5b36-5589-2004-25e02469c1cd.png)
S3のファイルからみかんの値段を検索し、答えを提案してくれました。

また、RDSとS3のどちらもデータを保持している「りんご」について、「りんごの値段は？」と検索してみると、結果は「S3の検索結果」＋「RDSの検索結果」という結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/7d3a3992-8793-fb48-8095-42dfaca96d30.png)

複数のデータソースを追加した際の結果は、データソースのどれか1つでも検索に引っかかるデータを持っていれば、検索結果として表示してくれることが分かります。

# まとめ
今回はRDSに作成したテーブルへの検索と、複数のデータソースに対しての検索を試してみました。RDSのテーブルについての検索は単語のみの検索の場合はデータを絞って検索してくれるものの、回答の提案や集計が必要な回答は得られませんでした。
また、複数のデータソースを追加しての検索はテキスト形式のデータソースであれば問題なく検索できました。
テーブルに登録したデータを読み取って答えを提案してくれたり、表やテーブルを読み取って集計して答えを提案してくれるようになると、さらに便利になると感じました。



# 
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area