【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)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...
随机推荐
- 【csdn】文章很好 - system函数遇到的问题
system函数遇到的问题http://blog.csdn.net/yangzhenzhen/article/details/51505176
- 关于xxx.h file not found 的问题
在引用第三方库的时候,经常会遇到xxx.h file not found的问题. 首先,我们要知道在引用第三方的时候,我们使用的第三方的库的类型. .a静态库 使用方式:#import "x ...
- hdu - 4709 - Herding
题意:给出N个点的坐标,从中取些点来组成一个多边形,求这个多边形的最小面积,组不成多边形的输出"Impossible"(测试组数 T <= 25, 1 <= N < ...
- -bash: ulimit: max user processes: cannot modify limit: Operation not permitted
安装oracle时候在创建oracle用户后,切换oracle用户时,报如下错 [root@localhost ~]# su - oracle-bash: ulimit: max user proce ...
- gateone安装(web版本ssh)
前言: 好久都没来写博客,最近忙啥去了呢? 一是忙于saltstack的二次开发,二是云计算的学习研究中,所以就一直没写东西,今天给大家介绍个工具. 好了,开始正文! 1.首先来说一下为什么要web ...
- C# 获取类似java gettime() 的时间格式
今天做了一个面向Java的接口,需要做到时间的统一,C#提供了System.DateTime.UtcNow 但是需要自己做下处理,记录一下自己的方法, 留着以后查阅方便. /// <summar ...
- c#简单缓存使用,添加和修改
private void SetCache(string CacheKey, object objObject, DateTime dt) { System.Web.Caching.Cache obj ...
- 反编译C#的dll文件并修改,再重新生成dll
1.把dll文件导入到ildasm工具中,ildasm是由微软提供的.net程序反编译工具,位于“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A ...
- poj3292-类素数筛选法
#include<iostream>using namespace std;const int N=1000002;int array[N]={0};int main(){ int n; ...
- BZOJ 3503: [Cqoi2014]和谐矩阵( 高斯消元 )
偶数个相邻, 以n*m个点为变量, 建立异或方程组然后高斯消元... O((n*m)^3)复杂度看起来好像有点大...但是压一下位的话就是O((n*m)^3 / 64), 常数小, 实际也跑得很快. ...