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


前提: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中了.后面怎么搜索就不要再說了

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM