前提: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)鍵代碼,如果有什么不懂的或者是有什么錯誤,請在文章的評論下方指出來
熱門工具 換一換