Lucene在创建索引的过程中,原生只支持纯文本格式(但是你扫描的过程中,如果你不设定文件格式,会发现不管啥文件,他都会去啃两口)
用到的库: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
用到的库:tm-extractors-0.4
主要用到了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。