~~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}}