首先贴出来的是演示了借助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,否则返回null
IndexReader ir = IndexReader.openIfChanged(reader);
if(ir != null){
reader.close(); //关闭原reader
reader = 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/")));
}
}

【Lucene3.6.2入门系列】第10节_Tika的更多相关文章

  1. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

    首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...

  2. 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能

    package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...

  3. 【Lucene3.6.2入门系列】第04节_中文分词器

    package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...

  4. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...

  5. 【Lucene3.6.2入门系列】第15节_SolrJ高亮

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; i ...

  6. RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

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

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...

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

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

  9. arcgis jsapi接口入门系列(10):图形高亮

    jsapi也有提供高亮的实现接口,但这里没用,而用的是一种改变图形(graphic)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...

随机推荐

  1. Android ListView A~Z快速索引(改进版)

    上一篇文章虽然实现了ListView 快速索引的效果,但是有一个小小的Bug.这个Bug我在前面也说了,这篇文章就来解决这个Bug. 我研究的时候发现只要showBg值为true,中间的字母就显示,而 ...

  2. (十二)boost库之多线程高级特性

    (十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...

  3. linux之SQL语句简明教程

    本教程参考http://www.1keydata.com/cn/sql/ 目的是让初学者了解linux下Mysql的操作,但是我仍想侧重于SQL语句的讲解 sql语句的学习将按照下图的流程: 当然在这 ...

  4. 开源 iOS 项目分类索引大全

    GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义 ...

  5. c++错误崩溃3

    使用了new申请了内存但是没有释放内存, 在程序长时间运行过程中不断的申请内存导致内存满了,再向内存写数据的时候回崩溃

  6. C和指针 (pointers on C)——第五章:操作符和表达式

    第五章 操作符和表达式 这一章假设没做过玩过单片机.汇编的话,读起来可能比較吃力,尤其是在移位运算符.位运算符应用上.另外多注意一下左值和右值的理解. 总结: 算术操作符.赋值操作符.关系操作符.条件 ...

  7. About

    about: Thanks to NetEase company, the people contribute to NetEase online course, Stephen Prata(< ...

  8. _cdel stdcall

    __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用函数不会要求调用者 ...

  9. PHPMailer发送邮件方法

    /** * * 测试邮件发送s * @param 服务器 $Host * @param 端口 $Port * @param 昵称 $Fromname * @param 身份验证用户名 $Usernam ...

  10. 树莓派设置成无线路由(AP)

    1.安装需要的包 sudo apt-get install hostpad uhdcpd 2.配置/etc/network/interfaces文件 配置wlan0为静态地址 格式如下: iface ...