首先贴出来的是演示了借助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. EPiServer 简单项目总结

    国内用到的EPiServer应该不多,所以记录点用到过的东西,以便分享 1.EPiServer office site http://www.episerver.com/ 2.EPiServer CM ...

  2. JS函数的四种调用模式

    函数在js中具有四种身份,分别为函数.方法.构造函数.apply或call调用 函数调用    函数调用模式中this指全局对象(window) var f1 = function() { alert ...

  3. php之Cookie与Session详解

    Cookie管理 Cookie是在HTTP协议下,通过服务器或脚本语言可以维护客户浏览器上信息的一种方式,Cookie的使用很普遍,许多提供个人化服务的网站都是利用Cookie来区别不同用户,以显示与 ...

  4. Android学习之listview的下拉刷新、上拉载入

    本例是在上例的基础上完成的.本例实现的listview上拉载入.下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header. 1. ...

  5. C#.net 摄像头驱动程序,用avicap32.dll

    装了摄像头后一般会有 avicap32.dll文件,没有一样可以用这些代码. 不需要在解决方案里面引用这个.dll文件. 下面有二种写法的例子: 例一: using System;using Syst ...

  6. Spark Streaming 实现读取Kafka 生产数据

    在kafka 目录下执行生产消息命令: ./kafka-console-producer  --broker-list nodexx:9092 --topic  201609 在spark bin 目 ...

  7. c++的getline()和get()函数

    这两个函数都是面向行的输入: getline()函数读取整行,它使用通过回车符来确定输入结尾.要调用这种方法,可以使用cin.getline().该函数有两个参数, 第一个参数用来存储输入行的数组的名 ...

  8. gcc 编译和链接

    1.现在对两个文件生成可执行文件 //thanks.c #include <stdio.h> int main(void) { printf("Hello World\n&quo ...

  9. 用Struts2标签实现Map的迭代

    最近在做一个论坛,论坛通常分为几个主版块,每一个主版块下面又有几个子版块. 想不出更好的展现方式,最终采用了如下的方法来实现: 用一个Map,HashMap或者Treemap承载之.一个子版块名字对应 ...

  10. 浏览器加载模式:window.onload和$(document).ready()的区别(详解)

    jQuery库文件是在body元素之前加载的,必须等待所有的DOM元素加载后,延迟支持DOM操作,否则就无法获取到. 在延迟等待加载,JavaScript提供了一个事件为load,方法如下: wind ...