Lucene對pdf、word、html等檔案的處理
阿新 • • 發佈:2019-01-05
Lucene在建立索引的過程中,原生只支援純文字格式(但是你掃描的過程中,如果你不設定檔案格式,會發現不管啥檔案,他都會去啃兩口)
=====PDF
=====HMTL/XML等檔案
小工具:索引檔案檢視器Luke。
用到的庫:PDFBox / XPdf
PDFBox是一個在java環境中對pdf檔案進行解析處理的開源軟體,同時它也提供了一個豐富的類庫支援對pdf檔案的操作。PDFBox為使 用Lucene的開發者專門提供了LucenePDFDocument類,它的static方法getDocument(ps:該方法被過載三次)能夠直 接返回一個Lucene的Document型別結果。所以在為一個pdf檔案(例子中為File型別例項pdfFile)建立索引時只要寫下如下語句就可 以了:
Document document = LucenePDFDocument.getDocument(file);
該方法傳入引數file是一個pdf檔案,返回一個lucene的document物件。
PDFBox 提供的下載包是0.7.3版本,這個版本里面有上面那個函式的所在的jar。最新的pdfbox在apache的官網下載,裡面已經沒有上面所要用到的jar包。
=====WORD
主要用到了WordExtractor類的成員方法extractor,該方法用來抽取word檔案的內容,並返回。
需要自己構建getDocument函式,來構建lucene的document物件。
參考如下程式碼:
public class LuceneDOCDocument { public static Document getDocument(File doc) { String docPath = doc.getAbsolutePath(); String title = doc.getName(); InputStream inputStream = null ; Reader contents = null ; Document document = new Document(); try { inputStream = new FileInputStream(doc); } catch (FileNotFoundException e) { e.printStackTrace(); } WordExtractor extractor = new WordExtractor(); try { contents = new StringReader(extractor.extractText(inputStream)); } catch (Exception e) { e.printStackTrace(); } document.add( new Field( " title " , title, Field.Store.YES, Field.Index.TOKENIZED)); document.add( new Field( " contents " , contents)); document.add( new Field( " path " , docPath, Field.Store.YES, Field.Index.NO)); return document; } }
=====HMTL/XML等檔案
HTML,XML等檔案雖然是純文字形式存在,但是由於其內部是有一些標籤的,而lucene在讀取這些檔案的時候,會將標籤也當做內容讀取,所以在處理這些檔案的時候需要對其進行一個去標籤操作。
用到的庫:htmlparser
參考如下程式碼:
public class LuceneHTMLDocument { public static Document getDocument(File html) { String htmlPath = html.getAbsolutePath(); String text = "" ; Parser parser = null ; try { parser = new Parser(htmlPath); } catch (ParserException e) { e.printStackTrace(); } try { parser.setEncoding( " UTF-8 " ); } catch (ParserException e) { e.printStackTrace(); } HtmlPage visitor = new HtmlPage(parser); try { parser.visitAllNodesWith(visitor); } catch (ParserException e) { e.printStackTrace(); } NodeList nodes = visitor.getBody(); int size = nodes.size(); for ( int i = 0 ;i < size;i ++ ) { Node node = nodes.elementAt(i); text += node.toPlainTextString(); } String title = visitor.getTitle(); Reader contents = new StringReader (text); Document document = new Document(); document.add( new Field( " title " , title, Field.Store.YES, Field.Index.TOKENIZED)); document.add( new Field( " contents " , contents)); document.add( new Field( " path " , htmlPath, Field.Store.YES, Field.Index.NO)); return document; } }
小工具:索引檔案檢視器Luke。