~~NOCACHE~~
## 11.日本語ファイルを登録する
日本語ファイル(PDFやxlsx、pptxなど)をElasticSearch(AWSマネージドサービス)に登録する際に苦労したのでメモ
## 前提
### ElasticSearchのバージョン及びプラグイン
ElasticSearchのバージョンは7.10を利用しています、バージョンごとのプラグインは[[https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/aes-supported-plugins.htmlm|公式]]を参照
インストールされているプラグインは以下のコマンドで確認可能です。(ingest-attachmentとanalysis-kuromoji入っています。)
curl -X GET -H 'Content-type: application/json' '{Elasticsearchエンドポイント}/_cat/plugins?v'
### ElasticSearchへのdocument(データ)登録方法
以下の2パターンで試しました。
・Bulk API
・Logstash
### 構成図
操作は以下の構成/ルートで実施しています。
{{:Aws:ElasticSearch:pasted:20210713-102755.png?direct 500x0}}
### Template、Pipeline
TemplateとPipelineは下記を参考に設定願います。
[[Aws:ElasticSearch:Template|Aws/ElasticSearch/3.Template]]
[[Aws:ElasticSearch:Pipeline|Aws/ElasticSearch/4.Pipeline]]
## Bulk API
### パイプラインの作成
Bulk APIでdocument(データ)をElasticSearchに登録する際は、目的のデータを[data]として渡します。
パラメータは[[https://www.elastic.co/guide/en/elasticsearch/plugins/current/using-ingest-attachment.html|ElasticSearch公式]]を参照
#パイプラインの設定
curl -X PUT -H 'Content-type: application/json' '{Elasticsearchエンドポイント}/_ingest/pipeline/{pipeline名}?pretty' -d'
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"indexed_chars" : -1,
"properties" : [
"content",
"content_type"
]
}
}
]
}
'
#パイプラインの確認
curl -X GET -H 'Content-type: application/json' '{Elasticsearchエンドポイント}/_ingest/pipeline?pretty
### 投入データの加工、登録
・[data]で渡すファイルは、Base64でエンコードして渡します。
・[[https://qiita.com/nettle0010/items/85f552879804da21b1c8|こちら]]のページを参考に、[[https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-gsg-upload-data.html#es-gsg-multiple-document|AWS公式]]の登録方法でAPIを実行しています。
%%・AWSのElasticSearchでは[_type]は[_doc]です。%%
#投入データの加工、登録ファイルの作成
file_path='{投入データのパス}'
file=$(base64 $file_path | perl -pe 's/\n//g')
echo -e "{ \"index\" : { \"_index\" : \"{インデックス名}\", \"_type\" : \"_doc\", \"_id\" : \"{ID}\", \"pipeline\": \"{pipeline名}\" }\n{ \"@timestamp\" : \"`date +'%Y-%m-%dT%H:%M:%S.%NZ'`\", \"data\" : \"$file\" }" > input.json
#加工したファイルからdocument(データ)登録
curl -X POST -H 'Content-Type: application/json' '{Elasticsearchエンドポイント}/_bulk?pretty' --data-binary @input.json
## Logstash
### パイプラインの作成
Logstashでdocument(データ)をElasticSearchに登録する際は、目的のデータを[message]として渡します。
パラメータは[[https://www.elastic.co/guide/en/elasticsearch/plugins/current/using-ingest-attachment.html|ElasticSearch公式]]を参照
#パイプラインの設定
curl -X PUT -H 'Content-type: application/json' '{Elasticsearchエンドポイント}/_ingest/pipeline/{pipeline名}?pretty' -d'
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "message",
"indexed_chars" : -1,
"properties" : [
"content",
"content_type"
]
}
}
]
}
'
#パイプラインの確認
curl -X GET -H 'Content-type: application/json' '{Elasticsearchエンドポイント}/_ingest/pipeline?pretty
### 投入データの加工、登録
・[message]で渡すファイルは、Base64でエンコードして渡します。
・[[https://shin0higuchi.hatenablog.com/entry/2017/06/06/014015|こちら]]のページと、[[https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-managedomains-logstash.html|AWS公式]]を参考にしています。
・Logstash設定ファイルの中で{投入データのパス}を定義できますが、今回はコマンドで渡しています。
※base64でエンコードして%%[perl -pe 's/\n//g']%%で改行を削除していますが、変換したデータの末尾に改行が必要なようなので[grep ^]をつけています。
#Logstash設定ファイルの作成
vi logstash.conf
input {
stdin {}
}
output {
elasticsearch {
hosts => ["{Elasticsearchエンドポイント}:443"]
ssl => true
index => "{インデックス名}"
pipeline => "{pipeline名}"
ilm_enabled => false #Amazon ESのバージョン7以降を利用する場合は、記載しないとエラーになるらしい
}
}
#ファイルからdocument(データ)登録
base64 {投入データのパス} | perl -pe 's/\n//g' | grep ^ | /usr/share/logstash/bin/logstash -f logstash.conf
#テキストからdocument(データ)登録(テスト用)
echo "{テキスト}" | base64 | perl -pe 's/\n//g' | grep ^ | /usr/share/logstash/bin/logstash -f logstash.conf
{{tag>AWS ElasticSearch}}