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

PS:关于Tika的介绍及用法,详见下方的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节_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();}}/*** 创建索引*/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)//详见http://blog.csdn.net/jadyer/article/details/10049525中对MMSeg4j的介绍writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new ComplexAnalyzer()));writer.deleteAll();for(File file : myFile.listFiles()){doc = new Document();
//              //当保存文件的Metadata时,要过滤掉文件夹,否则会报告文件夹无法访问的异常
//              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实例*/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//如果当前reader在打开期间index发生改变,则打开并返回一个新的IndexReader,否则返回nullIndexReader ir = IndexReader.openIfChanged(reader);if(ir != null){reader.close(); //关闭原readerreader = ir;    //赋予新reader}}return new IndexSearcher(reader);}catch(Exception e) {e.printStackTrace();}return null; //发生异常则返回null}/*** 执行搜索操作* @param fieldName 域名(相当于表的字段名)* @param keyWords  搜索的关键字*/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("文档编号=" + sd.doc + "  文档权值=" + doc.getBoost() + "  文档评分=" + sd.score + "    ");System.out.println("filename=" + doc.get("filename"));}} catch (IOException e) {e.printStackTrace();} finally {if(null != searcher){try {searcher.close(); //记得关闭IndexSearcher} catch (IOException e) {e.printStackTrace();}}}}/*** 测试一下效果* @see 测试前记得在myExample/myFile/目录下预先准备几个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 官网:http://tika.apache.org/* @see 用途:打开各种不同的文档,包括PDF、Office、html、txt等等* @see     以往解析PDF时通常使用PDFBox(http://pdfbox.apache.org/),解析Office时使用POI(http://poi.apache.org/)* @see     而Tika则是对它们的封装,使用Tika的API可以直接将PDF,Office等文件解析为文本字符串* @see 用法:1)双击tika-app-1.4.jar竟然打不开,通过命令行[java -jar tika-app-1.4.jar]则可以打开* @see     2)在项目中使用时,直接将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){//创建解析器,使用AutoDetectParser可以自动检测一个最合适的解析器Parser parser = new AutoDetectParser();//指定解析文件中的文档内容ContentHandler handler = new BodyContentHandler();//指定元数据存放位置,并自己添加一些元数据Metadata metadata = new Metadata(); metadata.set("MyAddPropertyName", "我叫玄玉");metadata.set(Metadata.RESOURCE_NAME_KEY, file.getAbsolutePath());//指定最基本的变量信息(即存放一个所使用的解析器对象)ParseContext context = new ParseContext();context.set(Parser.class, parser);InputStream is = null;try {is = new FileInputStream(file);//InputStream-----指定文件输入流//ContentHandler--指定要解析文件的哪一个内容,它有一个实现类叫做BodyContentHandler,即专门用来解析文档内容的//Metadata--------指定解析文件时,存放解析出来的元数据的Metadata对象//ParseContext----该对象用于存放一些变量信息,该对象最少也要存放所使用的解析器对象,这也是其存放的最基本的变量信息parser.parse(is, handler, metadata, context);//打印元数据for(String name : metadata.names()){System.out.println(name + "=" + metadata.get(name));}//返回解析到的文档内容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){//据Tika文档上说,org.apache.tika.Tika的效率没有org.apache.tika.parser.Parser的高Tika tika = new Tika();//可以指定是否获取元数据,也可自己添加元数据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);//打印元数据for(String name : metadata.names()){System.out.println(name + "=" + metadata.get(name));}return fileContent;} catch (Exception e) {e.printStackTrace();}return null;}/*** 小测试一下*/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语句优化.pdf")));System.out.println(parseToStringByTika(new File("myExample/myFile/")));}
}

转载于:https://www.cnblogs.com/pangblog/p/3271541.html

【Lucene3.6.2入门系列】第10节_Tika相关推荐

  1. 【ENVI入门系列】10.图像裁剪

    [ENVI入门系列]10.图像裁剪 (2014-09-26 10:08:15) 转载▼ 标签: 杂谈 分类: ENVI 版权声明:本教程涉及到的数据仅供练习使用,禁止用于商业用途. 目录 图像裁剪 1 ...

  2. (视频+图文)机器学习入门系列-第10章 人工神经网络

    机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...

  3. RabbitMQ 入门系列(10)— RabbitMQ 消息持久化、不丢失消息

    消息要保持"持久化",即不丢失,必须要使得消息.交换器.队列,必须全部 "持久化". 1. 生产者怎么确认 RabbitMQ 已经收到了消息? # 打开通道的确 ...

  4. ABP入门系列(10)——扩展AbpSession

    一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发现Session是定义在Controller中的类型为HttpSessionStateBase的属性. ...

  5. ASP.NET AJAX入门系列(10):Timer控件简单使用

    本文主要通过一个简单示例,让Web页面在一定的时间间隔内局部刷新,来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用. 主要内容 Timer控件的简单使用 1.添加新页面并切换到设计 ...

  6. C语言入门系列之10.结构体和共用体

    文章目录 一.结构体变量的基本使用 1.概述 2.定义结构体类型变量的方法 3.结构体变量的引用 4.结构体变量的初始化 二.结构体的高级应用 1.结构体数组 Ⅰ定义结构体数组 Ⅱ结构体数组的初始化 ...

  7. Flowable入门系列文章10 - 基本配置四

    1.映射的诊断上下文 Flowable支持SLF4j的Mapped Diagnostic Contexts功能.这些基本的信息会被传递到底层的记录器,以及将要记录的内容: processDefinit ...

  8. C语言入门系列 -运算符

    C语言入门系列 - 运算符 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构造数 ...

  9. Python编程入门系列课程

    原文:https://mc.dfrobot.com.cn/thread-309195-1-1.html Python编程入门系列课程--教程目录: Python编程入门系列课程--01 智能绘星 Py ...

最新文章

  1. HDU 4609 3-idiots FFT
  2. oop中构造函数编写的注意事项
  3. SPSS的数据T检验
  4. oracle 中 start tran,The value (30) of MAXTRANS parameter ignored
  5. 实例:使用纹理对象创建Sprite对象
  6. java未释放资源_DruidDataSource关闭资源未释放
  7. 阿里云服务器企业该如何选择
  8. HTML网页设计期末课程大作业~旅游住宿酒店的HTML网页设计(14页) ~学生网页设计作业源码 旅游网页代码 学生网页设计与制作期末作业下载 DW旅游网页作业代码下载...
  9. Word高效指南 - 中文文档首行自动缩进2个字符
  10. qlv格式怎么打开,把qlv格式转换成mp4的方法
  11. es6之扩展运算符 三个点(...)
  12. js正则表达式限定输入框内容为非负数
  13. 蓝桥杯单片机(八)DS18B20温度测量(整数显示)
  14. 【LaTex-错误和异常】\verb ended by end of line.原因是因为闭合边界符没有在\verb命令所属行中出现;\verb命令的正确和错误用法、verbatim环境的用法
  15. 电大2019秋c语言程序设计,中央电大秋C语言程序设计A试题
  16. python-igraph创建网络(图)
  17. 谈谈c语言中delay的用法
  18. 基于JAVA江西婺源旅游文化推广系统计算机毕业设计源码+数据库+lw文档+系统+部署
  19. centos7重启桌面服务_centos7安装ghome桌面以及配置vcn服务
  20. NRF51822-QFAC/NRF51822-QFAA/NRF51822-QFAB

热门文章

  1. mongodb中分页显示数据集的学习
  2. How to publish more papaers?
  3. identification for completing the census
  4. 出国留学想申请国家留学基金委的奖学金?传说中的csc! 从这里入手就对了!
  5. Java并发编程的艺术(一)——并发编程需要注意的问题
  6. 政府安全资讯精选 2017年第六期 车联网和移动安全可能成为未来监管重点
  7. 数据蒋堂 | 怎样看待存储过程的移植困难
  8. 上海往事之与初中同学YS见面
  9. TCP/IP详解学习笔记(7)-广播和多播,IGMP协议
  10. Siege的线程模型-基于版本2.56