1. 程式人生 > >Lucene對pdf、word、html等檔案的處理

Lucene對pdf、word、html等檔案的處理

Lucene在建立索引的過程中,原生只支援純文字格式(但是你掃描的過程中,如果你不設定檔案格式,會發現不管啥檔案,他都會去啃兩口)

=====PDF

用到的庫: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。