1. 程式人生 > >Lucene筆記31-Lucene的擴充套件-Tika介紹

Lucene筆記31-Lucene的擴充套件-Tika介紹

一、Tika介紹

Tika是2008年由Apache組織開發的專案,主要用於開啟不同的文件。Tika的下載請點選這裡。在處理文件索引的時候,有時候會碰到pdf,html,word這種非純文字的內容,這些內容怎麼來建立索引呢,這就要用到Tika了,Tika像一個橋樑一樣,連通了IndexWriter和上層的各種檔案型別。

二、Tika的使用

使用java -jar命令來開啟剛剛下載的jar包。開啟一個word文件,在View標籤下,點選Formatted Text,可以檢視純文字的資訊,點選其他的可以看到其他樣式的資訊,自行點開檢視即可。

三、專案中的使用

匯入上面下載的tika-app-1.19.1.jar,先來看一種不使用Tika情況下對文件的索引,索引之後,發現成功了,也沒有報錯,好吧,那我們通過Luke來看看它索引的什麼東西吧。我們可以發現,索引資訊並沒有什麼價值,因為我們看不懂。之後,我們寫一個Tika的測試例子,將一個pdf中的文字提取出來。

package com.wsy;

import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.apache.tika.exception.TikaException;
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.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

import java.io.*;
import java.util.Date;

public class TikaTest {
    private static File file = new File("C:\\Users\\Chris\\Desktop\\自如租房合同.pdf");

    public void indexWithOutTika() {
        try {
            Directory directory = FSDirectory.open(new File("E:\\Lucene\\IndexLibrary"));
            IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new MMSegAnalyzer()));
            Document document = new Document();
            document.add(new Field("content", new FileReader(file)));
            indexWriter.addDocument(document);
            indexWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String fileToText(File file) {
        Parser parser = new AutoDetectParser();
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            ContentHandler contentHandler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            // 可以自定義metadata的值,同理,可以設定很多的值,這裡就不演示了
            // 對於下面輸出時候已經有了的值,不能修改,對於沒有展示的值,可以自定義設定
            metadata.set(Metadata.AUTHOR, "王劭陽");
            ParseContext parseContext = new ParseContext();
            parseContext.set(Parser.class, parser);
            parser.parse(inputStream, contentHandler, metadata, parseContext);
            for (String name : metadata.names()) {
                System.out.println(name + "-->" + metadata.get(name));
            }
            return contentHandler.toString();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (TikaException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    public static void main(String[] args) {
        TikaTest tikaTest = new TikaTest();
        tikaTest.indexWithOutTika();
        String text = tikaTest.fileToText(file);
        System.out.println(text);
    }
}