Lucene4.10使用教程(九):Tika

来源:互联网 发布:淘宝外卖 系统繁忙 编辑:程序博客网 时间:2024/06/05 14:33

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());    }}


0 0