Elasticsearch:如何對PDF文件進行搜索

實現原理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 的字段,那麼修正後的索引內容爲:

相關文章
相關標籤/搜索