前提:pdf的內(nèi)容是文字形式而不是圖片形式!

          一.方法

          ? ? ? ?Elasticsearch實現(xiàn)pdf的全文檢索,原理是將pdf轉(zhuǎn)換為Base64,然后提取pdf的文字內(nèi)容然后將其存儲起來.

          ? ? ? ?Elasticsearch已有相關(guān)Api提供,也給出了例子.鏈接如下:

          ? ? ? ?7.0 java api 例子
          <https://www.elastic.co/guide/en/elasticsearch/plugins/7.0/using-ingest-attachment.html>

          ? ? ? ?我們來解讀以下
          //定制一個管道,用于將Base64轉(zhuǎn)換為文字形式 PUT _ingest/pipeline/attachment { "description" :
          "Extract attachment information",//管道的描述 "processors" : [ { "attachment" : {
          "field" : "data"//配置在哪個字段獲取Base64數(shù)據(jù),然后進(jìn)行轉(zhuǎn)換 } } ] } //后面我們索引文檔的時候
          ?pipeline=attachment,就要指定這個參數(shù),表明索引一個文檔的時候要 使用這個管道 PUT my_index
          /_doc/my_id?pipeline=attachment { "data":
          "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="//base64數(shù)據(jù) } ?
          那么獲取那篇剛剛索引的數(shù)據(jù),返回的json就為
          "attachment": { "content_type": "application/rtf", "language": "ro",
          "content": "Lorem ipsum dolor sit amet", "content_length": 28 }
          ?

          其中content就是轉(zhuǎn)換后的文字

          注意,上述操作的前提之下是裝了ingest-attachment插件,可以再es的根目錄下直接運(yùn)行下面的命令進(jìn)行安裝
          ./bin/elasticsearch-plugin install ingest-attachment
          ?

          二. Java Api 7.0的實現(xiàn)


          我pdf都存儲在遠(yuǎn)程服務(wù)器上,以https://*******.pdf路徑進(jìn)行存儲著,所以如果你跟我一樣,必須先根據(jù)http鏈接獲取這個pdf然后轉(zhuǎn)換為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(); //
          將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對其進(jìn)行Base64編碼處理 byte[] data = null; // 讀取圖片字節(jié)數(shù)組 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類中直接調(diào)用就行,如果你是pdf存儲在本地,直接通過File獲取然后轉(zhuǎn)換,網(wǎng)上有很多,在這就不說了.
          //將http鏈接作為參數(shù) 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創(chuàng)建的管道
          .source(jsonMap); esClient.index(request, RequestOptions.DEFAULT);//執(zhí)行
          ?

          ?這樣我們就對pdf的內(nèi)容進(jìn)行提取然后索引到Elasticsearch中了.后面怎么搜索就不要再說了

          ?這里我只貼出了關(guān)鍵代碼,如果有什么不懂的或者是有什么錯誤,請在文章的評論下方指出來

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                恋综被各种啪小说h | 成人毛片在线观看视频 | 一级尻逼视频 | 国产成人91一区二区三区APP | 成人AV一区二区三区婷婷 |