使用Elasticsearch7 java api實現pdf全文檢索
阿新 • • 發佈:2019-09-10
前提: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中了.後面怎麼搜尋就不要再說了
這裡我只貼出了關鍵程式碼,如果有什麼不懂的或者是有什麼錯誤,請在文章的評論下方指出來