Tika可以用来提取office、PDF、HTML、txt等常用文件中得文本(在提取文本时,图片是无法提取的,会被丢弃),方便Lucene进行文本的生成索引和检索。
Tika的用法很简单,但是依赖包有些多,导入包后,使用方法如下:
package com.johnny.lucene05.lucene_plugin.tika;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.DoubleField;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.tika.Tika;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.junit.Test;
import org.xml.sax.ContentHandler;
public class TikaTest {
/**使用Tika解析文件,并将其中的文本提取出来
*
* 注意:图片是无法解析的
* **/
@Test
public void fileToTxt() throws Exception {
//使用AutoDetectParser可以使用Tika根据实际情况自动转换需要使用的parser,不需要再手工指定
Parser tikaParser = new AutoDetectParser();
File file = new File("/Users/ChinaMWorld/Desktop/WorkSpace/Johnny/lucene/lucene/src/main/java/resources/lucene05/SDK接口项目部署文档.docx");
InputStream is = new FileInputStream(file);
/*/
* 参数的含义为:
* inputStream:文件输入流
* ContentHandler:所有解析出来的内容会放到它的子类BodyContentHandler中
* Metadata :Tika解析文档时会生成的一组说明数据
* ParseContext:用来存储需要填入的参数,最少需要设置tikaParser本身
* **/
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
/**设定文档名称,
* 对于deprecate属性的内容表示无法通过在metadata中设置进行修改**/
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());//可以用来设定文档名称
ParseContext parseContext = new ParseContext();
parseContext.set(Parser.class, tikaParser);
tikaParser.parse(is, handler, metadata, parseContext);
System.out.println(handler.toString());
System.out.println("---------------------------");
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
}
/**
* 使用Tika的第二种方式进行解析,但是官方文档认为直接使用第二种方案效率不如上面一种效率高
* 如果在tika.parse方法中不放置metadata,那么可以自己设定的所有metadata都会生效
*/
@Test
public void filetoTxt2() throws Exception{
Tika tika = new Tika();
File file = new File("/Users/ChinaMWorld/Desktop/WorkSpace/Johnny/lucene/lucene/src/main/java/resources/lucene05/SDK接口项目部署文档.docx");
InputStream is = new FileInputStream(file);
Metadata metadata =new Metadata();
metadata.add(Metadata.AUTHOR,"abc");
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
String s = tika.parseToString(is,metadata);
System.out.println("---------------------------");
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(s);
}
/**
* 使用Tika生成索引,并查询结果,
* tika生成索引参见方法:Document com.johnny.lucene05.lucene_plugin.tika.FileIndexUtils.fileToDoc(File file) throws Exception
*/
@Test
public void testTikaToIndex(){
FileIndexUtils.index(true);
FileIndexUtils fu = new FileIndexUtils();
fu.searchByTerm("content", "log4j".toLowerCase());
}
}