【Lucene3.6.2入门系列】第10节_Tika

首先贴出来的是演示了借助Tika创建索引的HelloTikaIndex.java

PS:关于Tika的介绍及用法,详见下方的HelloTika.java

[java]  view plain copy print ?
  1. package com.jadyer.lucene;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import org.apache.lucene.document.Document;  
  7. import org.apache.lucene.document.Field;  
  8. import org.apache.lucene.index.IndexReader;  
  9. import org.apache.lucene.index.IndexWriter;  
  10. import org.apache.lucene.index.IndexWriterConfig;  
  11. import org.apache.lucene.index.Term;  
  12. import org.apache.lucene.search.IndexSearcher;  
  13. import org.apache.lucene.search.Query;  
  14. import org.apache.lucene.search.ScoreDoc;  
  15. import org.apache.lucene.search.TermQuery;  
  16. import org.apache.lucene.search.TopDocs;  
  17. import org.apache.lucene.store.Directory;  
  18. import org.apache.lucene.store.FSDirectory;  
  19. import org.apache.lucene.util.Version;  
  20. import org.apache.tika.Tika;  
  21.   
  22. import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;  
  23.   
  24. /** 
  25.  * 【Lucene3.6.2入门系列】第10节_Tika 
  26.  * @create Aug 19, 2013 11:02:21 PM 
  27.  * @author 玄玉<http://blog.csdn.net/jadyer> 
  28.  */  
  29. public class HelloTikaIndex {  
  30.     private Directory directory;  
  31.     private IndexReader reader;  
  32.       
  33.     public HelloTikaIndex(){  
  34.         try {  
  35.             directory = FSDirectory.open(new File("myExample/myIndex/"));  
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40.       
  41.     /** 
  42.      * 创建索引 
  43.      */  
  44.     public void createIndex(){  
  45.         Document doc = null;  
  46.         IndexWriter writer = null;  
  47.         File myFile = new File("myExample/myFile/");  
  48.         try{  
  49.             //这里的分词器使用的是MMSeg4j(记得引入mmseg4j-all-1.8.5-with-dic.jar)  
  50.             //详见http://blog.csdn.net/jadyer/article/details/10049525中对MMSeg4j的介绍  
  51.             writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new ComplexAnalyzer()));  
  52.             writer.deleteAll();  
  53.             for(File file : myFile.listFiles()){  
  54.                 doc = new Document();  
  55. //              //当保存文件的Metadata时,要过滤掉文件夹,否则会报告文件夹无法访问的异常  
  56. //              if(file.isDirectory()){  
  57. //                  continue;  
  58. //              }  
  59. //              Metadata metadata = new Metadata();  
  60. //              doc.add(new Field("filecontent", new Tika().parse(new FileInputStream(file), metadata)));  
  61.                 doc.add(new Field("filecontent"new Tika().parse(file)));  
  62.                 doc.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));  
  63.                 writer.addDocument(doc);  
  64.             }  
  65.         }catch(Exception e) {  
  66.             e.printStackTrace();  
  67.         }finally{  
  68.             if(null != writer){  
  69.                 try {  
  70.                     writer.close();  
  71.                 } catch (IOException ce) {  
  72.                     ce.printStackTrace();  
  73.                 }  
  74.             }  
  75.         }  
  76.     }  
  77.       
  78.       
  79.     /** 
  80.      * 获取IndexSearcher实例 
  81.      */  
  82.     private IndexSearcher getIndexSearcher(){  
  83.         try {  
  84.             if(reader == null){  
  85.                 reader = IndexReader.open(directory);  
  86.             }else{  
  87.                 //if the index was changed since the provided reader was opened, open and return a new reader; else,return null  
  88.                 //如果当前reader在打开期间index发生改变,则打开并返回一个新的IndexReader,否则返回null  
  89.                 IndexReader ir = IndexReader.openIfChanged(reader);  
  90.                 if(ir != null){  
  91.                     reader.close(); //关闭原reader  
  92.                     reader = ir;    //赋予新reader  
  93.                 }  
  94.             }  
  95.             return new IndexSearcher(reader);  
  96.         }catch(Exception e) {  
  97.             e.printStackTrace();  
  98.         }  
  99.         return null//发生异常则返回null  
  100.     }  
  101.       
  102.       
  103.     /** 
  104.      * 执行搜索操作 
  105.      * @param fieldName 域名(相当于表的字段名) 
  106.      * @param keyWords  搜索的关键字 
  107.      */  
  108.     public void searchFile(String fieldName, String keyWords){  
  109.         IndexSearcher searcher = this.getIndexSearcher();  
  110.         Query query = new TermQuery(new Term(fieldName, keyWords));  
  111.         try {  
  112.             TopDocs tds = searcher.search(query, 50);  
  113.             for(ScoreDoc sd : tds.scoreDocs){  
  114.                 Document doc = searcher.doc(sd.doc);  
  115.                 System.out.print("文档编号=" + sd.doc + "  文档权值=" + doc.getBoost() + "  文档评分=" + sd.score + "    ");  
  116.                 System.out.println("filename=" + doc.get("filename"));  
  117.             }  
  118.         } catch (IOException e) {  
  119.             e.printStackTrace();  
  120.         } finally {  
  121.             if(null != searcher){  
  122.                 try {  
  123.                     searcher.close(); //记得关闭IndexSearcher  
  124.                 } catch (IOException e) {  
  125.                     e.printStackTrace();  
  126.                 }  
  127.             }  
  128.         }  
  129.     }  
  130.       
  131.       
  132.     /** 
  133.      * 测试一下效果 
  134.      * @see 测试前记得在myExample/myFile/目录下预先准备几个doc,pdf,html,txt等文件 
  135.      */  
  136.     public static void main(String[] args) {  
  137.         HelloTikaIndex hello = new HelloTikaIndex();  
  138.         hello.createIndex();  
  139.         hello.searchFile("filecontent""java");  
  140.     }  
  141. }  

下面是描述Tika的介绍和用法的HelloTika.java

[java]  view plain copy print ?
  1. package com.jadyer.lucene;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7.   
  8. import org.apache.tika.Tika;  
  9. import org.apache.tika.metadata.Metadata;  
  10. import org.apache.tika.parser.AutoDetectParser;  
  11. import org.apache.tika.parser.ParseContext;  
  12. import org.apache.tika.parser.Parser;  
  13. import org.apache.tika.sax.BodyContentHandler;  
  14. import org.xml.sax.ContentHandler;  
  15.   
  16. /** 
  17.  * Tika 
  18.  * @see 官网:http://tika.apache.org/ 
  19.  * @see 用途:打开各种不同的文档,包括PDF、Office、html、txt等等 
  20.  * @see     以往解析PDF时通常使用PDFBox(http://pdfbox.apache.org/),解析Office时使用POI(http://poi.apache.org/) 
  21.  * @see     而Tika则是对它们的封装,使用Tika的API可以直接将PDF,Office等文件解析为文本字符串 
  22.  * @see 用法:1)双击tika-app-1.4.jar竟然打不开,通过命令行[java -jar tika-app-1.4.jar]则可以打开 
  23.  * @see     2)在项目中使用时,直接将tika-app-1.4.jar引入即可 
  24.  * @create Aug 7, 2013 8:57:49 AM 
  25.  * @author 玄玉<http://blog.csdn.net/jadyer> 
  26.  */  
  27. public class HelloTika {  
  28.     public static String parseToStringByTikaParser(File file){  
  29.         //创建解析器,使用AutoDetectParser可以自动检测一个最合适的解析器  
  30.         Parser parser = new AutoDetectParser();  
  31.         //指定解析文件中的文档内容  
  32.         ContentHandler handler = new BodyContentHandler();  
  33.         //指定元数据存放位置,并自己添加一些元数据  
  34.         Metadata metadata = new Metadata();   
  35.         metadata.set("MyAddPropertyName""我叫玄玉");  
  36.         metadata.set(Metadata.RESOURCE_NAME_KEY, file.getAbsolutePath());  
  37.         //指定最基本的变量信息(即存放一个所使用的解析器对象)  
  38.         ParseContext context = new ParseContext();  
  39.         context.set(Parser.class, parser);  
  40.         InputStream is = null;  
  41.         try {  
  42.             is = new FileInputStream(file);  
  43.             //InputStream-----指定文件输入流  
  44.             //ContentHandler--指定要解析文件的哪一个内容,它有一个实现类叫做BodyContentHandler,即专门用来解析文档内容的  
  45.             //Metadata--------指定解析文件时,存放解析出来的元数据的Metadata对象  
  46.             //ParseContext----该对象用于存放一些变量信息,该对象最少也要存放所使用的解析器对象,这也是其存放的最基本的变量信息  
  47.             parser.parse(is, handler, metadata, context);  
  48.             //打印元数据  
  49.             for(String name : metadata.names()){  
  50.                 System.out.println(name + "=" + metadata.get(name));  
  51.             }  
  52.             //返回解析到的文档内容  
  53.             return handler.toString();  
  54.         } catch (Exception e) {  
  55.             e.printStackTrace();  
  56.         } finally {  
  57.             if(is != null){  
  58.                 try {  
  59.                     is.close();  
  60.                 } catch (IOException e) {  
  61.                     e.printStackTrace();  
  62.                 }  
  63.             }  
  64.         }  
  65.         return null;  
  66.     }  
  67.       
  68.       
  69.     public static String parseToStringByTika(File file){  
  70.         //据Tika文档上说,org.apache.tika.Tika的效率没有org.apache.tika.parser.Parser的高  
  71.         Tika tika = new Tika();  
  72.         //可以指定是否获取元数据,也可自己添加元数据  
  73.         Metadata metadata = new Metadata();   
  74.         metadata.set("MyAddPropertyName""我叫玄玉");  
  75.         metadata.set(Metadata.RESOURCE_NAME_KEY, file.getAbsolutePath());  
  76.         try {  
  77.             String fileContent = tika.parseToString(file);  
  78.             //String fileContent = tika.parseToString(new FileInputStream(file), metadata);  
  79.             //打印元数据  
  80.             for(String name : metadata.names()){  
  81.                 System.out.println(name + "=" + metadata.get(name));  
  82.             }  
  83.             return fileContent;  
  84.         } catch (Exception e) {  
  85.             e.printStackTrace();  
  86.         }  
  87.         return null;  
  88.     }  
  89.       
  90.       
  91.     /** 
  92.      * 小测试一下 
  93.      */  
  94.     public static void main(String[] args) {  
  95.         System.out.println(parseToStringByTikaParser(new File("myExample/myFile/Java安全.doc")));  
  96.         System.out.println(parseToStringByTika(new File("myExample/myFile/Oracle_SQL语句优化.pdf")));  
  97.         System.out.println(parseToStringByTika(new File("myExample/myFile/")));  
  98.     }  
  99. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值