【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)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...
随机推荐
- grok 正则解析日志例子<1>
<pre name="code" class="html">下面是日志的样子 55.3.244.1 GET /index.html 15824 0. ...
- QT 绘制按钮 paintEvent enterEvent leaseEvent mouseEvent
案例2:绘制按钮 main.cpp #include<QApplication> #include “demoWidget.h” int main(int args , int arg ...
- curl几个选项
1.--cacert 选项请看https://curl.haxx.se/docs/sslcerts.html 2.CURL库怎样验证服务器证书 [复制链接] 中提到:你是客户端, 你希望的是: 你拿 ...
- JDK自带工具jps,jstat,jmap,jconsole使用
jps 与ps命令类似: ps -ef|grep java 用来显示本地的java进程,查看本地执行着几个java应用,并显示进程号. [root@SE43 ~]# jps //仅仅显示进程号 238 ...
- 【递推】【HDU2585】【hotel】
Hotel Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- meta 标签整理
<!-- 声明文档 --> <meta charset='utf-8'> <!-- 指示IE以目前可用的最高模式显示内容 --> <meta http-equ ...
- 基于zepto的手机焦点图touchstart touchmove
基于zepto的手机焦点图,查看地址:demo (建议使用手机浏览器查看)代码如下: <!DOCTYPE HTML> <html> <head> <title ...
- Android学习之简单的数据存储
在Android中,数据存储是开发人员不可以避免的.Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据.今天将介绍用SharedPreferences来存储数据 ...
- 用OpenCV实现Otsu算法
算法的介绍 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找 ...
- Powerdesigner逆向工程从sql server数据库生成pdm (完整版)
第一步:打开"控制面板"中的"管理工具" 第二步:点击"管理工具"然后双击"数据源(odbc)" 第三步:打开之后,点击 ...