Lucene索引前对doc pdf html文件的预处理

时间:2022-04-25 14:51:27

初学Lucene,写下点小小的心得:

Lucene提供的API能够方便地对文本文档创建索引,但当需要为像.doc 、.pdf 这样的非文本文档创建索引时就必须先把文档转换为纯文本。

对.pdf文件的处理

lib:PDFBox

PDFBox是一个在java环境中对pdf文件进行解析处理的开源软件,同时它也提供了一个丰富的类库支持对pdf文件的操作。PDFBox为使用Lucene的开发者专门提供了LucenePDFDocument类,它的static方法getDocument(ps:该方法被重载三次)能够直接返回一个Lucene的Document类型结果。所以在为一个pdf文件(例子中为File类型实例pdfFile)创建索引时只要写下如下语句就可以了:

Lucene索引前对doc pdf html文件的预处理document = LucenePDFDocument.getDocument(pdfFile);

getDocument方法的这种形式很好,接下来对.doc以及对.html文件的处理也参照这种形式。

对.doc文件的处理

lib:tm-extractors-0.4

这原是Apache的POI类库的一部分——HWPF,POI提供了一组操作MS-word/excel等文件的方法,在最近的release版本中HWPF被移出,需要下载独立的tm-extractors-0.4。下面的代码中实现了static方法getDocument(File)返回Lucene的Document类型结果,主要通过调用WordExtractor类的成员方法extractor,该方法能返回一个包含所解析doc文件内容的String类型实例。

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理public class LuceneDOCDocument 
Lucene索引前对doc pdf html文件的预处理
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理    
public static Document getDocument(File doc){
Lucene索引前对doc pdf html文件的预处理        String docPath 
= doc.getAbsolutePath();
Lucene索引前对doc pdf html文件的预处理        String title 
= doc.getName();
Lucene索引前对doc pdf html文件的预处理        InputStream inputStream 
= null;
Lucene索引前对doc pdf html文件的预处理        Reader contents 
= null;
Lucene索引前对doc pdf html文件的预处理        Document document 
= new Document();
Lucene索引前对doc pdf html文件的预处理        
try
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
{
Lucene索引前对doc pdf html文件的预处理            inputStream 
= new FileInputStream(doc);
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理        
catch (FileNotFoundException e)
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
{
Lucene索引前对doc pdf html文件的预处理            e.printStackTrace();
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理        WordExtractor extractor 
= new WordExtractor();
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
try{
Lucene索引前对doc pdf html文件的预处理            contents 
= new StringReader(extractor.extractText(inputStream));
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
catch(Exception e){
Lucene索引前对doc pdf html文件的预处理            e.printStackTrace();
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理    
Lucene索引前对doc pdf html文件的预处理        document.add(
new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));
Lucene索引前对doc pdf html文件的预处理        document.add(
new Field("contents", contents));
Lucene索引前对doc pdf html文件的预处理        document.add(
new Field("path", docPath, Field.Store.YES, Field.Index.NO));
Lucene索引前对doc pdf html文件的预处理        
return document;
Lucene索引前对doc pdf html文件的预处理    }

Lucene索引前对doc pdf html文件的预处理
Lucene索引前对doc pdf html文件的预处理}

 HTML文件虽然是文本,但是由于其中包含的标记无法被Lucene识别,导致也会被编入索引,而用户在搜索时并不希望搜索到这些标签,所以在对HTML文件创建所以前必须对其进行去标签的处理。

对HTML的处理(去标签)

lib:htmlparser

原本Lucene的DEMO中也附带了一个HtmlParser,只是这个html解析器功能比较弱。另外不知道是不是笔者使用上的错误,在使用索引文件管理器Luke查看时发现,DEMO带的HtmlParser的成员方法getReader所返回的字符流的内容并非是html文件的全部文本内容,而仅仅是标题内容。

在下面的例子中,笔者使用了更为强大的htmlparser,同样在代码中定义了static方法getDocument(File)返回Document类型。

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理public class LuceneHTMLDocument{
Lucene索引前对doc pdf html文件的预处理
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理    
public static Document getDocument(File html){
Lucene索引前对doc pdf html文件的预处理        String htmlPath 
= html.getAbsolutePath();
Lucene索引前对doc pdf html文件的预处理        String text 
= "";
Lucene索引前对doc pdf html文件的预处理        Parser parser 
= null;
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
try{
Lucene索引前对doc pdf html文件的预处理            parser 
= new Parser(htmlPath);
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
catch(ParserException e){
Lucene索引前对doc pdf html文件的预处理            e.printStackTrace();
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
try{
Lucene索引前对doc pdf html文件的预处理            parser.setEncoding(
"UTF-8");
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
catch(ParserException e){
Lucene索引前对doc pdf html文件的预处理            e.printStackTrace();
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理        HtmlPage visitor 
= new HtmlPage(parser);
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
try{
Lucene索引前对doc pdf html文件的预处理            parser.visitAllNodesWith(visitor);
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
catch(ParserException e){
Lucene索引前对doc pdf html文件的预处理            e.printStackTrace();
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理        NodeList nodes 
= visitor.getBody();
Lucene索引前对doc pdf html文件的预处理        
int size = nodes.size();
Lucene索引前对doc pdf html文件的预处理Lucene索引前对doc pdf html文件的预处理        
for(int i=0;i<size;i++){
Lucene索引前对doc pdf html文件的预处理            Node node 
= nodes.elementAt(i);
Lucene索引前对doc pdf html文件的预处理            text 
+= node.toPlainTextString();
Lucene索引前对doc pdf html文件的预处理        }

Lucene索引前对doc pdf html文件的预处理        String title 
= visitor.getTitle();
Lucene索引前对doc pdf html文件的预处理        Reader contents 
= new StringReader (text);
Lucene索引前对doc pdf html文件的预处理        Document document 
= new Document();
Lucene索引前对doc pdf html文件的预处理        document.add(
new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));
Lucene索引前对doc pdf html文件的预处理        document.add(
new Field("contents", contents));
Lucene索引前对doc pdf html文件的预处理        document.add(
new Field("path", htmlPath, Field.Store.YES, Field.Index.NO));
Lucene索引前对doc pdf html文件的预处理        
return document;
Lucene索引前对doc pdf html文件的预处理    }

Lucene索引前对doc pdf html文件的预处理
Lucene索引前对doc pdf html文件的预处理}