使用Tika、Luke工具解析多种类型(word、pdf、txt 等)索引文件

Tika 是2008年才产生的apache的一个项目,主要用于打开各种不同类型的文档,获取其文本信息。可以解析多种类型(word、pdf、txt 、html等)文件! 甚至可以通过解析url,获取其网页信息。最后把其文本信息提起出来。这方面Tika有点像Jsoup。。一般情况下,直接对word、pdf等文件直接创建索引是不对的,用luke工具查看之后,出现一大推乱七八糟的term。这个时候就可以用Tika
去在对其创建索引之前,转化处理其文本信息。

package hhc;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
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;

import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;

public class IndexUtil {

	public void index(boolean hasNew) throws IOException{
		File f=new File("E:\\lucene\\learn\\example_tika");
		Directory directory = FSDirectory.open(new File("E:\\lucene\\learn\\index_tika"));
		IndexWriter writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new MMSegAnalyzer()));
		if(hasNew){
			writer.deleteAll();
		}
		for(File file:f.listFiles()){
			Document d=new Document();
            d.add(new Field("content",tikaParseFileToString(file),Field.Store.YES,Field.Index.ANALYZED));
            d.add(new Field("filename",file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));
            d.add(new Field("path",file.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));
            d.add(new Field("size",String.valueOf(file.length()),Field.Store.YES,Field.Index.NOT_ANALYZED));
		    writer.addDocument(d);
		}
		writer.close();
	}

	/**
	 * 直接创建tika对象,但是效率不高
	 * @param file
	 * @return
	 * @throws IOException
	 * @throws TikaException
	 */
	public static String tikaAutoString(File file) throws IOException, TikaException{
		Tika tika=new Tika();
		//tika.parse(stream, metadata); 设置概要
		return tika.parseToString(file);
	}
	/**
	 * 这种方式的效率比较高
	 * @param file
	 * @return
	 */
	public static String tikaParseFileToString(File file) {
		// 自动获取最适合的解析器
		Parser parser = new AutoDetectParser();
		InputStream stream = null;
		try {
			stream = new FileInputStream(file);
			// 所有解析出来的内容都会放入这个里面handler
			ContentHandler handler = new BodyContentHandler();
			//加载解析器
			ParseContext context = new ParseContext();
			context.set(Parser.class, parser);
			//获取概要数据
			Metadata data=new Metadata();
			parser.parse(stream, handler, data, context);
			/**
			 * 可以设置概要数据的属性
			 */
			data.set(data.AUTHOR, "胡慧超");
			data.set(data.RESOURCE_NAME_KEY, file.getName());
			System.out.println(data.toString());
			for(String name:data.names()){
				System.out.println(name);
			}
			return handler.toString();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			if(stream!=null)
				try {
					stream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
		return "";
	}

	public static void main(String[] args) {
		tikaParseFileToString(new File("E:\\lucene\\learn\\example_tika\\AILK_OFFER_胡慧超_2014-06-26.pdf"));
	}
}

Luke  这个工具很强大,luke是一个查询索引的工具,使用时必须注意版本要与lucene版本一致,否则可能打不开索引信息。选择索引所在的目录,就可以查询和操作相应的索引信息,并且在searche中根据|Queryparser来查询对应的信息。同时可以管理索引信息。

以下是luke4.10.2版本截图:

以下是使用Tika的两种方式

时间: 2024-12-19 20:46:16

使用Tika、Luke工具解析多种类型(word、pdf、txt 等)索引文件的相关文章

数据字典生成工具(生成Excel, Word,PDF,html)

转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据字典文档生成工具.NPOI入门.NPOI下载.NPOI中文教程.NPOI实例.DocX组件操作Word.PowerDesign读取.WORD读取和操作.NVelocity模版文件生成.数据字典生成工具之旅 导游 数据字典生成工具会根据模版文件生成创建表的SQL语句,包含SQL自动提示功能,操作更加快

1、Python django 框架下的word Excel TXT Image 等文件的上传

1.文件上传(input标签) (1)html代码(form表单用post方法提交) 1 <input class="btn btn-primary col-md-1" style="margin:0px 15px 25px 15px;" id="submitForm" type="button" value="提交" /> 2 <form id="picture_form&qu

Android中解析读取复杂word,excel,ppt等的方法

前段时间在尝试做一个Android里的万能播放器,能播放各种格式的软件,其中就涉及到了最常用的office软件.查阅了下资料,发现Android中最传统的直接解析读取word,excel的方法主要用了java里第三方包,比如利用tm-extractors-0.4.jar和jxl.jar等,下面附上代码和效果图. 读取word用了tm-extractors-0.4.jar包,代码如下: package com.example.readword; import java.io.File; impor

C# 获取与解析枚举类型的 DescriptionAttribute

原文:C# 获取与解析枚举类型的 DescriptionAttribute System.ComponentModel.DescriptionAttribute 这个 Attribute,经常被用来为属性或事件提供说明,这个说明是可以被本地化的.在一些用户界面中,就可以利用这个 Attribute 提供一些额外的信息,就像 Visual Studio 中所做的,如图 1 所示: 图 1 可以看到,对 AutoSizeMode 的说明,被显示在了下面的框中. 但是,界面中的枚举项就没这么好的待遇了

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib.当然本文还会介绍自定义插件的使用. ------------------------------------------------------------------------------------------------- 第一部分 控件 目前官方支持的控件包含:缩放控制条-地图

逗我玩吗?ViewBag.XXX 找不到编译动态表达式所需的一种或多种类型

现在接手的项目是用 .NET 4 + MVC4 做的. 我尝试着用 Unity 变更一下其中的一个功能的实现. 但是 Unity.MVC4 依赖于 Unity 3 以上的版本, Unity 3 又依赖于 .NET 4.5, Unity.MVC3 又只能用于 MVC3 的项目 . 按我的性格就是要把整个工程改为 .NET 4.5 的算球了, 但是有有同事说 .NET 4.5 是新东西,不知道稳定不稳定. 至于稳定不稳定, 我无从考证. 不用 .NET 4.5 , 那只好自己实现对 Controll

Xcode7.3工具解析App崩溃日志(.crash文件)

Xcode7.3工具解析App崩溃日志(.crash文件) 原文链接:http://blog.csdn.net/u011056605 开发的App或者游戏提交审核后,偶尔会收到测试反馈的消息,说应用崩溃了,bug偶尔出现,难以找到确定的重现方法. 怎么办?可以分析崩溃文件啊,也就是app崩溃后,自动保存在设备本地的.crash文件. 获得崩溃日志的方式,在 获取设备上的调试信息与崩溃日志分析 中有说. 在环境ok的情况下,xcode中是可以自动解析.crash文件的.旧版本的xcode甚至可以导

最终版-perl工具解析数据库的报告文件0120

********************需要根据自己的实际环境修改哦**************************** ******************** 1. 收集awr报告样本   awrreport.sql --该脚本请用具有 dba 权限的用户执行,普通用户没有权限访问数据库的基表 conn &usr/ &pass @ &oracle_sid set linesize 1200 ;set pagesize 0;set long 99999;set heading

js之第三方工具解析JSON

1.JSON 仅仅是一种文本字符串.它被存储在 responseText 属性中 为了读取存储在 responseText 属性中的 JSON 数据,须要依据 JavaScript 的 eval 函数.函数 eval 会把一个字符串当作它的參数. 然后这个字符串会被当作 JavaScript 代码来运行.由于 JSON 的字符串就是由 JavaScript 代码构成的,所以它本身是可运行的 比如例如以下方式: String json = "{username:'一叶扁舟',age:22}&quo