Amazon Kendra実装②:Kendraファセット検索やってみる
やること
Kendraでより詳細な検索ができるようになるというファセット検索を試してみる。
ファセット検索とは
Amazon Kendraのファセット検索は、検索結果を特定の属性やメタデータフィールドに基づいて絞り込む機能です。特定のカテゴリや値で検索結果をフィルタリングすることができます。
ファセット検索を使うことで検索結果の精度を上げることができそうです。
参考
- Amazon S3ドキュメントメタ情報
- フィルタリングとファセット検索
- クエリの提案
構築手順
(1)メタデータの作成
(2)S3バケットにデータおよびメタデータを格納
(3)Kendraインデックスを作成
(4)S3バケットへのコネクター作成
(5)Index fieldsにcategory属性を追加
(6)クロール実行
※ここまでで構築完了※
(7)aws cliコマンドで検索
(1)メタデータの作成
Amazon S3ドキュメントメタ情報 を参考にメタデータを作成します。
今回作成したデータとメタデータファイルはgithubに置きました。
たとえば、momo/item_list.csv
のメタデータmetadata/momo/item_list.csv.metadata.json
はこのようにcategory
という属性を追加しました。
{
"DocumentId": "document ID",
"Attributes": {
"category": "item"
},
"Title": "dagger",
"ContentType": "TXT"
}
(2)S3バケットにデータおよびメタデータを格納
作成したメタデータ含めS3バケットhogefuga-us-east-1
に格納します。リージョンはus-east-1にしました。
(3)Kendraインデックスを作成
S3バケットhogefuga-us-east-1
と同じリージョンでKendraインデックスを作成します。作成手順は省略します。
作成したKendraインデックスのIndex ID
は検索のaws cliコマンド実行時に必要になります。(今回のIndex ID
は12345678-1234-1234-1234-123456789012
です)
(4)S3バケットへのコネクター作成
以下のAdd data sources
ボタンをクリックしS3バケットhogefuga-us-east-1
へのコネクタを作成します。
(4-1)Default language of source documentsの設定
S3バケットにある検索対象のデータは日本語文字列を含むので、Japanese(ja)
を設定
(4-2)Metadata files prefix folder locationの設定
メタデータの格納パスを指定。今回使用したデータではmetadata/
を設定
(5)Index fieldsにcategory属性を追加
Amazon Kendra
ーFacet definition
ーIndex fields
のAdd field
ボタンでメタデータで設定したcategory属性を追加します。
Usage types
はとりあえず全部にチェックいれました。
このようにcategoryが追加されました
(6)クロール実行
作成したKendra IndexのSync now
ボタンでクロールを実行します。
クロールの実行が完了したら構築完了です。
(7)aws cliコマンドで検索
メタデータで追加したcategory属性で検索できるか検証します。以下はaws cliでKendraにクエリを発行する例です。
- 検索条件
- メタデータで追加した属性
category
の値がindex
- 検索文字列が
第1章
- 属性
_language_code
にja
を設定
- メタデータで追加した属性
aws kendra query --index-id 12345678-1234-1234-1234-123456789012 --query-text '第1章' --attribute-filter '{
"AndAllFilters":[
{
"EqualsTo":{
"Key":"category",
"Value":{
"StringValue":"index"
}
}
},
{
"EqualsTo":{
"Key":"_language_code",
"Value":{
"StringValue":"ja"
}
}
}
]
}'
- ※補足
- 属性
_language_code
はデフォルトで作成される属性で、デフォルト値はus
のようです。日本語を検索する場合はja
を指定します。 - 未検証ですが、検索結果を絞るなら
--page-size 1
みたいにオプションを設定するといけそうです。
- 属性
(参考)コマンド実行結果
Kendraにクエリを発行するaws cliコマンドの実行結果です。
iamusr0001:~/environment $ aws kendra query --index-id 12345678-1234-1234-1234-123456789012 --query-text 4 --attribute-filter '{
> "AndAllFilters":[
> {
> "EqualsTo":{
> "Key":"category",
> "Value":{
> "StringValue":"item"
> }
> }
> },
> {
> "EqualsTo":{
> "Key":"_language_code",
> "Value":{
> "StringValue":"ja"
> }
> }
> }
> ]
> }'
{
"QueryId": "00000000-8989-1212-1234-111111111111",
"ResultItems": [
{
"Id": "00000000-8989-1212-1234-111111111111-77a329ad-a63a-4803-ba57-a98ead8f2345",
"Type": "DOCUMENT",
"Format": "TEXT",
"AdditionalAttributes": [],
"DocumentId": "s3://hogefuga-us-east-1/momo/items/healing_robe.txt",
"DocumentTitle": {
"Text": "item name Healing Robe",
"Highlights": []
},
"DocumentExcerpt": {
"Text": "アイテム名:癒しの・・・ベル4となっています。",
"Highlights": [
{
"BeginOffset": 30,
"EndOffset": 31,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 238,
"EndOffset": 239,
"TopAnswer": false,
"Type": "STANDARD"
}
]
},
"DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/healing_robe.txt",
"DocumentAttributes": [
{
"Key": "category",
"Value": {
"StringValue": "item"
}
},
{
"Key": "_source_uri",
"Value": {
"StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/healing_robe.txt"
}
},
{
"Key": "s3_document_id",
"Value": {
"StringValue": "document ID"
}
}
],
"ScoreAttributes": {
"ScoreConfidence": "LOW"
},
"FeedbackToken": "AYADeCOnmmf5iWvLtBzr・・・8ead8f"
},
{
"Id": "00000000-8989-1212-1234-111111111111-b6165911-491e-465b-b3b1-cded96cad501",
"Type": "DOCUMENT",
"Format": "TEXT",
"AdditionalAttributes": [],
"DocumentId": "s3://hogefuga-us-east-1/momo/items/grandmothers_cane.txt",
"DocumentTitle": {
"Text": "item name Grandmother's Cane",
"Highlights": []
},
"DocumentExcerpt": {
"Text": "アイテム名:おばあさんの杖\n\nクラス: 癒し手専・・・しの力を象徴しています。",
"Highlights": [
{
"BeginOffset": 31,
"EndOffset": 32,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 241,
"EndOffset": 242,
"TopAnswer": false,
"Type": "STANDARD"
}
]
},
"DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/grandmothers_cane.txt",
"DocumentAttributes": [
{
"Key": "category",
"Value": {
"StringValue": "item"
}
},
{
"Key": "_source_uri",
"Value": {
"StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/items/grandmothers_cane.txt"
}
},
{
"Key": "s3_document_id",
"Value": {
"StringValue": "document ID"
}
}
],
"ScoreAttributes": {
"ScoreConfidence": "LOW"
},
"FeedbackToken": "AYADeCOnmmf5i・・・ded96"
}
],
"FacetResults": [
{
"DocumentAttributeKey": "category",
"DocumentAttributeValueType": "STRING_VALUE",
"DocumentAttributeValueCountPairs": [
{
"DocumentAttributeValue": {
"StringValue": "item"
},
"Count": 2
}
]
}
],
"TotalNumberOfResults": 2
}
iamusr0001:~/environment $
iamusr0001:~/environment $ aws kendra query --index-id 12345678-1234-1234-1234-123456789012 --query-text '第1章' --attribute-filter '{
> "AndAllFilters":[
> {
> "EqualsTo":{
> "Key":"category",
> "Value":{
> "StringValue":"index"
> }
> }
> },
> {
> "EqualsTo":{
> "Key":"_language_code",
> "Value":{
> "StringValue":"ja"
> }
> }
> }
> ]
> }'
{
"QueryId": "0b54cd52-4cde-7890-a01b-84b4acef9c21",
"ResultItems": [
{
"Id": "0b54cd52-4cde-7890-a01b-84b4acef9c21-5af2fbf7-365f-42d7-90b5-4b3a4c894f06",
"Type": "ANSWER",
"Format": "TEXT",
"AdditionalAttributes": [
{
"Key": "AnswerText",
"ValueType": "TEXT_WITH_HIGHLIGHTS_VALUE",
"Value": {
"TextWithHighlightsValue": {
"Text": "第1章: 桃太郎の・・・れ、村人たちを苦しめた。",
"Highlights": []
}
}
}
],
"DocumentId": "s3://hogefuga-us-east-1/momo/contents.txt",
"DocumentTitle": {
"Text": "Table of Contents of Momotaro",
"Highlights": []
},
"DocumentExcerpt": {
"Text": "第1章: 桃太郎の誕生\n\nある日、老夫婦が子供・・・、村人たちを苦しめた。",
"Highlights": [
{
"BeginOffset": 0,
"EndOffset": 214,
"TopAnswer": false,
"Type": "STANDARD"
}
]
},
"DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt",
"DocumentAttributes": [
{
"Key": "category",
"Value": {
"StringValue": "index"
}
},
{
"Key": "_source_uri",
"Value": {
"StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt"
}
},
{
"Key": "s3_document_id",
"Value": {
"StringValue": "document ID"
}
}
],
"ScoreAttributes": {
"ScoreConfidence": "MEDIUM"
},
"FeedbackToken": "AYADeDmYiJn8・・・4b3a4c894f06"
},
{
"Id": "0b54cd52-4cde-7890-a01b-84b4acef9c21-98b6f751-bd74-4752-be10-333333333333",
"Type": "DOCUMENT",
"Format": "TEXT",
"AdditionalAttributes": [],
"DocumentId": "s3://hogefuga-us-east-1/momo/contents.txt",
"DocumentTitle": {
"Text": "Table of Contents of Momotaro",
"Highlights": []
},
"DocumentExcerpt": {
"Text": "第1章: 桃太郎の誕生\n\nある日、老夫婦が子供・・・を苦しめた。",
"Highlights": [
{
"BeginOffset": 0,
"EndOffset": 1,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 1,
"EndOffset": 2,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 2,
"EndOffset": 3,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 106,
"EndOffset": 107,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 108,
"EndOffset": 109,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 181,
"EndOffset": 182,
"TopAnswer": false,
"Type": "STANDARD"
},
{
"BeginOffset": 183,
"EndOffset": 184,
"TopAnswer": false,
"Type": "STANDARD"
}
]
},
"DocumentURI": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt",
"DocumentAttributes": [
{
"Key": "category",
"Value": {
"StringValue": "index"
}
},
{
"Key": "_source_uri",
"Value": {
"StringValue": "https://hogefuga-us-east-1.s3.amazonaws.com/momo/contents.txt"
}
},
{
"Key": "s3_document_id",
"Value": {
"StringValue": "document ID"
}
}
],
"ScoreAttributes": {
"ScoreConfidence": "LOW"
},
"FeedbackToken": "AYADeDmYiJn8・・・333333333333"
}
],
"FacetResults": [
{
"DocumentAttributeKey": "category",
"DocumentAttributeValueType": "STRING_VALUE",
"DocumentAttributeValueCountPairs": [
{
"DocumentAttributeValue": {
"StringValue": "index"
},
"Count": 1
}
]
}
],
"TotalNumberOfResults": 2
}
iamusr0001:~/environment $
おわりです。
Discussion