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

时间:2021-08-16 03:10:36

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