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

x33g5p2x  于2021-12-24 转载在 其他  
字(6.3k)|赞(0)|评价(0)|浏览(488)

完整版见https://jadyer.github.io/2013/08/19/lucene-tika/

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

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

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

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

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

相关文章