使用Elasticsearch7 java api實現pdf全文檢索

  • 2019 年 10 月 3 日
  • 筆記

前提:pdf的內容是文字形式而不是圖片形式!

一.方法

       Elasticsearch實現pdf的全文檢索,原理是將pdf轉換為Base64,然後提取pdf的文字內容然後將其存儲起來.

       Elasticsearch已有相關Api提供,也給出了例子.鏈接如下:

       7.0 java api 例子

       我們來解讀以下

//定製一個管道,用於將Base64轉換為文字形式    PUT _ingest/pipeline/attachment  {    "description" : "Extract attachment information",  //管道的描述    "processors" : [      {        "attachment" : {          "field" : "data"        //配置在哪個字段獲取Base64數據,然後進行轉換        }      }    ]  }      //後面我們索引文檔的時候 ?pipeline=attachment,就要指定這個參數,表明索引一個文檔的時候要  使用這個管道    PUT my_index/_doc/my_id?pipeline=attachment  {    "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=" //base64數據  }

 

那麼獲取那篇剛剛索引的數據,返回的json就為

"attachment": {        "content_type": "application/rtf",        "language": "ro",        "content": "Lorem ipsum dolor sit amet",        "content_length": 28      }

 

其中content就是轉換後的文字

注意,上述操作的前提之下是裝了ingest-attachment插件,可以再es的根目錄下直接運行下面的命令進行安裝

./bin/elasticsearch-plugin install ingest-attachment

 

二. Java Api 7.0的實現

我pdf都存儲在遠程服務器上,以https://*******.pdf路徑進行存儲着,所以如果你跟我一樣,必須先根據http鏈接獲取這個pdf然後轉換為Base64,代碼如下

 public static String pdfToBase64(String contentpath) throws IOException {          InputStream is = null;          String url = contentpath;          URL url2 = new URL(url);          HttpURLConnection conn = (HttpURLConnection) url2.openConnection();          conn.setDoInput(true);          conn.connect();          is =  conn.getInputStream();             // 將圖片文件轉化為位元組數組字符串,並對其進行Base64編碼處理          byte[] data = null;          // 讀取圖片位元組數組          try {              ByteArrayOutputStream swapStream = new ByteArrayOutputStream();              byte[] buff = new byte[100];              int rc = 0;              while ((rc = is.read(buff, 0, 100)) > 0) {                  swapStream.write(buff, 0, rc);              }              data = swapStream.toByteArray();          } catch (IOException e) {              e.printStackTrace();          } finally {              if (is != null) {                  try {                      is.close();                  } catch (IOException e) {                      e.printStackTrace();                  }              }          }          return new BASE64Encoder().encode(data).replace("n", "").replace("r", "");      }

這個代碼你放在一個Util類中直接調用就行,如果你是pdf存儲在本地,直接通過File獲取然後轉換,網上有很多,在這就不說了.

//將http鏈接作為參數  String base64Contentpath = Base64Util.pdfToBase64("http://******.pdf");

 

然後我們就可以將其存在一個pdf的索引中,但是別忘記指定管道

    RestHighLevelClient esClient = esClient();      Map<String,Object> jsonMap = new HashMap<>();        jsonMap.put("base64Contentpath", base64Contentpath);          IndexRequest request = new IndexRequest("pdf")                                  .setPipeline("管道名稱")   //這裡就是前面通過json創建的管道                                  .source(jsonMap);        esClient.index(request, RequestOptions.DEFAULT);   //執行

 

 這樣我們就對pdf的內容進行提取然後索引到Elasticsearch中了.後面怎麼搜索就不要再說了

 這裡我只貼出了關鍵代碼,如果有什麼不懂的或者是有什麼錯誤,請在文章的評論下方指出來