1. 程式人生 > >Lucene4.10使用教程(九):Tika

Lucene4.10使用教程(九):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());
    }
}