
Elasticsearchには基本的にテキストデータしか投入しないつもりだったものの、PDFやExcelなんかを投入したくなることも出てくるかと思います。 微妙にやり方あるので、それをメモします。
この辺の記事を参考にさせて頂きました。
ingest
今回はPDFを想定して、やっていきます。
Dockerfileにこちらの一文を追加します。
RUN elasticsearch-plugin install ingest-attachment
ElasticSeearch6.2だとingest-attachmentによってファイルの中身をばらして登録できるようです。
Mapping 定義
$ curl -X PUT 'localhost:9200/_ingest/pipeline/attachment' -H 'Content-Type: application/json' -d'
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"indexed_chars" : -1,
"properties" : [
"content",
"content_type"
]
}
}
]
}
'
エンコーディング変更
$ file_path='/path/to/your/**.pdf'
$ file=$(base64 $file_path | perl -pe 's/\n//g')
$ echo -e "{ \"index\" : { \"index\" : \"shop\", \"type\" : \"goods\", \"_id\" : \"1\", \"pipeline\": \"attachment\" }\n{ \"data\" : \"$file\" }" > request_bulk.json
投入
$ curl -H "Content-type: application/x-ndjson" -X POST http://localhost:9200/bulk?refresh=false --data-binary @request_bulk.json $ curl -X POST 'localhost:9200/shop/refresh'
確認
$ curl -X GET 'localhost:9200/shop?pretty'
{
"shop" : {
"aliases" : { },
"mappings" : {
"goods" : {
"properties" : {
"attachment" : {
"properties" : {
"content" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"content_type" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"data" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1558211470064",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "EHqISnJpTwGOefPWoHf-yg",
"version" : {
"created" : "6020299"
},
"provided_name" : "shop"
}
}
}
}
感想
メモだったので特になし。
しかし、何がどうなってるかさっぱりわからない。。。