【Lucene3.6.2入门系列】第10节_Tika
生活随笔
收集整理的這篇文章主要介紹了
【Lucene3.6.2入门系列】第10节_Tika
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先貼出來(lái)的是演示了借助Tika創(chuàng)建索引的HelloTikaIndex.java
PS:關(guān)于Tika的介紹及用法,詳見(jiàn)下方的HelloTika.java
?
package com.jadyer.lucene;import java.io.File; import java.io.IOException;import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.apache.tika.Tika;import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;/*** 【Lucene3.6.2入門系列】第10節(jié)_Tika* @create Aug 19, 2013 11:02:21 PM* @author 玄玉<http://blog.csdn.net/jadyer>*/ public class HelloTikaIndex {private Directory directory;private IndexReader reader;public HelloTikaIndex(){try {directory = FSDirectory.open(new File("myExample/myIndex/"));} catch (IOException e) {e.printStackTrace();}}/*** 創(chuàng)建索引*/public void createIndex(){Document doc = null;IndexWriter writer = null;File myFile = new File("myExample/myFile/");try{//這里的分詞器使用的是MMSeg4j(記得引入mmseg4j-all-1.8.5-with-dic.jar)//詳見(jiàn)http://blog.csdn.net/jadyer/article/details/10049525中對(duì)MMSeg4j的介紹writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new ComplexAnalyzer()));writer.deleteAll();for(File file : myFile.listFiles()){doc = new Document(); // //當(dāng)保存文件的Metadata時(shí),要過(guò)濾掉文件夾,否則會(huì)報(bào)告文件夾無(wú)法訪問(wèn)的異常 // if(file.isDirectory()){ // continue; // } // Metadata metadata = new Metadata(); // doc.add(new Field("filecontent", new Tika().parse(new FileInputStream(file), metadata)));doc.add(new Field("filecontent", new Tika().parse(file)));doc.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));writer.addDocument(doc);}}catch(Exception e) {e.printStackTrace();}finally{if(null != writer){try {writer.close();} catch (IOException ce) {ce.printStackTrace();}}}}/*** 獲取IndexSearcher實(shí)例*/private IndexSearcher getIndexSearcher(){try {if(reader == null){reader = IndexReader.open(directory);}else{//if the index was changed since the provided reader was opened, open and return a new reader; else,return null//如果當(dāng)前reader在打開(kāi)期間index發(fā)生改變,則打開(kāi)并返回一個(gè)新的IndexReader,否則返回nullIndexReader ir = IndexReader.openIfChanged(reader);if(ir != null){reader.close(); //關(guān)閉原readerreader = ir; //賦予新reader}}return new IndexSearcher(reader);}catch(Exception e) {e.printStackTrace();}return null; //發(fā)生異常則返回null}/*** 執(zhí)行搜索操作* @param fieldName 域名(相當(dāng)于表的字段名)* @param keyWords 搜索的關(guān)鍵字*/public void searchFile(String fieldName, String keyWords){IndexSearcher searcher = this.getIndexSearcher();Query query = new TermQuery(new Term(fieldName, keyWords));try {TopDocs tds = searcher.search(query, 50);for(ScoreDoc sd : tds.scoreDocs){Document doc = searcher.doc(sd.doc);System.out.print("文檔編號(hào)=" + sd.doc + " 文檔權(quán)值=" + doc.getBoost() + " 文檔評(píng)分=" + sd.score + " ");System.out.println("filename=" + doc.get("filename"));}} catch (IOException e) {e.printStackTrace();} finally {if(null != searcher){try {searcher.close(); //記得關(guān)閉IndexSearcher} catch (IOException e) {e.printStackTrace();}}}}/*** 測(cè)試一下效果* @see 測(cè)試前記得在myExample/myFile/目錄下預(yù)先準(zhǔn)備幾個(gè)doc,pdf,html,txt等文件*/public static void main(String[] args) {HelloTikaIndex hello = new HelloTikaIndex();hello.createIndex();hello.searchFile("filecontent", "java");} }
下面是描述Tika的介紹和用法的HelloTika.java
?
?
package com.jadyer.lucene;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream;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.xml.sax.ContentHandler;/*** Tika* @see 官網(wǎng):http://tika.apache.org/* @see 用途:打開(kāi)各種不同的文檔,包括PDF、Office、html、txt等等* @see 以往解析PDF時(shí)通常使用PDFBox(http://pdfbox.apache.org/),解析Office時(shí)使用POI(http://poi.apache.org/)* @see 而Tika則是對(duì)它們的封裝,使用Tika的API可以直接將PDF,Office等文件解析為文本字符串* @see 用法:1)雙擊tika-app-1.4.jar竟然打不開(kāi),通過(guò)命令行[java -jar tika-app-1.4.jar]則可以打開(kāi)* @see 2)在項(xiàng)目中使用時(shí),直接將tika-app-1.4.jar引入即可* @create Aug 7, 2013 8:57:49 AM* @author 玄玉<http://blog.csdn.net/jadyer>*/ public class HelloTika {public static String parseToStringByTikaParser(File file){//創(chuàng)建解析器,使用AutoDetectParser可以自動(dòng)檢測(cè)一個(gè)最合適的解析器Parser parser = new AutoDetectParser();//指定解析文件中的文檔內(nèi)容ContentHandler handler = new BodyContentHandler();//指定元數(shù)據(jù)存放位置,并自己添加一些元數(shù)據(jù)Metadata metadata = new Metadata(); metadata.set("MyAddPropertyName", "我叫玄玉");metadata.set(Metadata.RESOURCE_NAME_KEY, file.getAbsolutePath());//指定最基本的變量信息(即存放一個(gè)所使用的解析器對(duì)象)ParseContext context = new ParseContext();context.set(Parser.class, parser);InputStream is = null;try {is = new FileInputStream(file);//InputStream-----指定文件輸入流//ContentHandler--指定要解析文件的哪一個(gè)內(nèi)容,它有一個(gè)實(shí)現(xiàn)類叫做BodyContentHandler,即專門用來(lái)解析文檔內(nèi)容的//Metadata--------指定解析文件時(shí),存放解析出來(lái)的元數(shù)據(jù)的Metadata對(duì)象//ParseContext----該對(duì)象用于存放一些變量信息,該對(duì)象最少也要存放所使用的解析器對(duì)象,這也是其存放的最基本的變量信息parser.parse(is, handler, metadata, context);//打印元數(shù)據(jù)for(String name : metadata.names()){System.out.println(name + "=" + metadata.get(name));}//返回解析到的文檔內(nèi)容return handler.toString();} catch (Exception e) {e.printStackTrace();} finally {if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}}return null;}public static String parseToStringByTika(File file){//據(jù)Tika文檔上說(shuō),org.apache.tika.Tika的效率沒(méi)有org.apache.tika.parser.Parser的高Tika tika = new Tika();//可以指定是否獲取元數(shù)據(jù),也可自己添加元數(shù)據(jù)Metadata metadata = new Metadata(); metadata.set("MyAddPropertyName", "我叫玄玉");metadata.set(Metadata.RESOURCE_NAME_KEY, file.getAbsolutePath());try {String fileContent = tika.parseToString(file);//String fileContent = tika.parseToString(new FileInputStream(file), metadata);//打印元數(shù)據(jù)for(String name : metadata.names()){System.out.println(name + "=" + metadata.get(name));}return fileContent;} catch (Exception e) {e.printStackTrace();}return null;}/*** 小測(cè)試一下*/public static void main(String[] args) {System.out.println(parseToStringByTikaParser(new File("myExample/myFile/Java安全.doc")));System.out.println(parseToStringByTika(new File("myExample/myFile/Oracle_SQL語(yǔ)句優(yōu)化.pdf")));System.out.println(parseToStringByTika(new File("myExample/myFile/")));} }轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3271541.html
總結(jié)
以上是生活随笔為你收集整理的【Lucene3.6.2入门系列】第10节_Tika的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: POJ 2411 Mondriaan's
- 下一篇: 程序员职业生涯