【Lucene3.6.2入门系列】第10节_Tika
首先贴出来的是演示了借助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的更多相关文章
- 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器
首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...
- 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能
package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...
- 【Lucene3.6.2入门系列】第04节_中文分词器
package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...
- 【Lucene3.6.2入门系列】第15节_SolrJ高亮
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; i ...
- RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- ABP入门系列(10)——扩展AbpSession
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...
- ASP.NET AJAX入门系列(10):Timer控件简单使用
本文主要通过一个简单示例,让Web页面在一定的时间间隔内局部刷新,来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用. 主要内容 Timer控件的简单使用 1.添加新页面并切换到设计 ...
- arcgis jsapi接口入门系列(10):图形高亮
jsapi也有提供高亮的实现接口,但这里没用,而用的是一种改变图形(graphic)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...
随机推荐
- JVM 看不到某些异常的stacktrace问题(转)
在java 1.5的release notes里面可以看到这样一句话: The compiler in the server VM now provides correct stack backtra ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- C based
switch(ch){case '\n': lines += 1; /*fail thru*/case ' ':case '\t': words += 1;default: c ...
- tsm ANS0326E问题处理
备份tsm备份oracle 报错 ANS0326E This node has exceeded its maximum number of mount points. 查看所有节点详细信息 q no ...
- #include <boost/array.hpp>
Boost的array,元素可以是std::string #include <iostream> #include <string> #include <boost/ar ...
- xml中,button改变背景颜色方法
在画几个设置界面,用到了button控件,对于button空间的背景色在不同状态下的颜色改变方法,做了一下尝试,发现了两种背景颜色改变的方法,就总结了下. 方法一尝试了好多遍才好,要点在于,在sele ...
- OpenCms创建站点过程图解——献给OpenCms的刚開始学习的人们
非常多人都听说了OpenCms,知道了它的强大,索性的下载安装了,最终见到了久违OpenCms,看到了它简洁的界面,欣喜过后却不免一脸茫然,这个东西怎么用,我怎么用它来建站,从哪開始,无从下手,找资料 ...
- 线上操作使用tmux提高工作效率
对于常常在线上操作的人来说有一种烦恼,就是在操作过程中,有事离开了一下,电脑自己主动睡眠了.然后网络断开连接.这时候任务就要又一次跑.非常烦恼. tmux能够解决问题. tmux能够看成虚拟屏幕,不受 ...
- 图数据库之Pregel
/* 版权声明:能够随意转载,转载时请务必标明文章原始出处和作者信息 .*/ author: 张俊林 节选自<大数据日知录:架构与算法>十四章.书籍文件夹在此 Pre ...
- OA 权限控制
对于加入删除 初始化password等操作的权限 控制 第一种方法就是在每一个超链接前加 推断 如 <s:if test="#session.user.hasPrivilegeByNa ...