實現原理node
咱們採用以下的方法來實現把一個 .pdf 文件導入到 Elasticsearch 的數據節點中:json
如上圖所示,咱們首先把咱們的 .pdf 文件進行 Base64 處理,而後上傳到 Elasticsearch 中的 ingest node 中進行處理。咱們能夠經過 Ingest attachment plugin 來使得 Elasticsearch 提取通用格式的文件附件好比 PPT、XLS及PDF。最終,數據進入到 Elasticsearch 的 data node 中以便讓咱們進行搜索。數組
導入PDF文件到Elasticsearch中bash
# 準備PDF文件app
咱們可使用 Word 或其它編輯軟件來生產一個 PDF 文件,暫且咱們叫這個文件的名字爲 sample.pdf,而它的內容很是簡單,在 sample.pdf 文件中,咱們只有一句話:「I like this useful tool」。curl
# 安裝 Ingest attachment pluginelasticsearch
Ingest attachment plugin 容許 Elasticsearch 經過使用 Apache 文本提取庫 Tika 提取通用格式(例如:PPT,XLS 和 PDF)的文件附件。Apache Tika 工具包可從一千多種不一樣的文件類型中檢測並提取元數據和文本。全部這些文件類型均可以經過一個界面進行解析,從而使 Tika 對搜索引擎索引,內容分析,翻譯等有用。工具
須要注意的是,源字段必須是 Base64 編碼的二進制,若是不想增長在 Base64 之間來回轉換的開銷,則可使用 CBOR 格式而不是 JSON,並將字段指定爲字節數組而不是字符串表示形式,這樣處理器將跳過 Base64 解碼。網站
可使用插件管理器安裝此插件,該插件必須安裝在集羣中的每一個節點上,而且每一個節點必須在安裝後從新啓動。this
bin/elasticsearch-plugin install ingest-attachment
#查看是否安裝成功
./bin/elasticsearch-plugin list
# 建立 attachment pipeline
咱們能夠在咱們的 ingest node 上建立一個叫作 pdfattachment 的 pipleline:
PUT _ingest/pipeline/pdfattachment { "description": "Extract attachment information encoded in Base64 with UTF-8 charset", "processors": [ { "attachment": { "field": "file" } } ] }
# 轉換並上傳PDF文件的內容到Elasticsearch中
對於 Ingest attachment plugin 來講,它的數據必須是 Base64 的。咱們能夠在網站Base64 encoder 來進行轉換,咱們能夠直接經過下面的腳原本進行操做:
#!/bin/bash encodedPdf=`cat sample.pdf | base64` json="{\"file\":\"${encodedPdf}\"}" echo "$json" > json.file curl -XPOST 'http://localhost:9200/pdf-test1/_doc?pipeline=pdfattachment&pretty' -H 'Content-Type: application/json' -d @json.file
在上面的腳本中,咱們針對 sample.pdf 進行 Base64 的轉換,並生成一個叫作 json.file 的文件。在最後,咱們把這個 json.file 文件的內容經過 curl 指令上傳到 Elasticsearch 中,咱們能夠在 Elasticsearch 中查看一個叫作 pdf-test1 的索引。
查看索引並搜索
咱們能夠經過以下的命令來查詢 pdf-test1 索引:
GET pdf-test1/_search
在上面咱們能夠看出來,咱們的索引中有一個叫作 content 的字段,它包含了咱們的 pdf 文件的內容,這個字段能夠同咱們進行搜索。在上面咱們也看到了一個很大的一個字段 file,它含有咱們轉換過的 Base64 格式的內容。若是咱們不想要這個字段,咱們能夠經過添加另一個 remove processor 來除去這個字段:
PUT _ingest/pipeline/pdfattachment { "description": "Extract attachment information encoded in Base64 with UTF-8 charset", "processors": [ { "attachment": { "field": "file" } }, { "remove": { "field": "file" } } ] }
這樣咱們除去了那個叫作 file 的字段,那麼修正後的索引內容爲: