基于Tika语义分析的文档内容检索服务研究

2013-03-15 02:20丁振凡
关键词:全文检索视图文档

丁振凡



基于Tika语义分析的文档内容检索服务研究

丁振凡

(华东交通大学信息工程学院,江西,南昌 330013)

介绍了利用Lucene结合Tika实现站点内容的全文检索设计的编程过程。用Tika获取文档的元数据以及文档内容的文本提取。用Lucene实现文档的索引创建和检索服务,结合实例详细分析了Lucene API的具体使用特点。利用Spring MVC实现搜索服务的Web访问处理。可对网站的HTML、PDF、word、PPT、mht等各种类型的文档提供统一的内容检索服务。在该论文研究基础上可建立个性化的内容搜索服务系统。

Spring MVC;Lucene;Tika;文档元数据;全文检索

0 引言

在各类信息资源网站中均含有类型各异的文档资源。如:HTML 文档、PDF 文档、Word文档、PPT文档等。随着网站信息资源的不断丰富,对站内信息资源建立全文搜索也就很有必要。Lucene是目前最为流行的开源全文检索工具包。只要能将文档的数据内容进行文本理解,Lucene 就能对其进行索引和搜索。

本文利用 Lucene 对Web服务器上某个目录中的文档进行语义分析的基础上建立索引,利用Tika获取文档的元数据并实现文档内容的文本分析。然后在建立好的索引中进行基于内容的全文检索。工作流程如图1所示。中文分词采用IK Analyzer。涉及的jar包有:tika-app-1.0.jar;lucene-core-3.1.0.jar;IKAnalyzer2012.jar。

1 对站点指定目录的文档建立索引

1.1 用Tika实现内容元数据提取

Apache Tika是一个开源的文档语义提取工具包,支持众多格式的文档(例如HTML, PDF, Doc等)的元数据提取和内容分析。针对不同类型的文档,Tika能自动甄别文件类型,调用相应的解析器进行分析,并能自动识别文档的编码和语言。Tika 的parse 方法接受要被解析文档的文件名,并将分析结果写入Metadata元数据集合中。利用tika 对象的parseToString方法可分析提取文件的文本内容。

图1 Lucene和Tika结合构建搜索应用

1.2 利用Lucene建立索引

索引是现代搜索引擎的核心,Lucene采用倒排索引结构,以词作为索引的中心,建立词到文档的映射关系。Lucene索引文件中包含段(segment)、文档(document)、域(field)和项(term)。索引包含多个段,每个段包含多个文档,每个文档又包含多个域,而每个域又包含多个项。段相当于一个子索引,只是段之间并不像索引之间是相互独立的[1]。

Lucene提供的用于索引和查询的API接口可以非常方便地实现全文索引和搜索功能[2]。为了对文档进行索引,Lucene 提供了Document, Field, IndexWriter, Analyzer, Directory五个基础的类。其中,Document用来描述文档;Field用来描述文档的属性;Analyzer实现分词处理;IndexWriter把各个Document 对象加到索引中,Lucene 对IndexWriter 的不断优化,使Lucene对索引的创建能更加自如和高效[3];Directory表示索引存储位置,有FSDirctory 和 RAMDirectory两个子类。以下代码给出了索引建立过程:

Metadata met = new Metadata(); //存放元数据

Tika tika= new Tika(); // 创建Tika对象

File indexDir = new File("e:\index1"); //定义索引存储位置

File dataDir = new File("f:\cai\java"); //被处理的文件资源所在某目录

IndexWriterConfig fsConfig = new IndexWriterConfig(Version.LUCENE_31,

new IKAnalyzer() ); // 用IKAnalyzer分词工具

fsConfig.setOpenMode(OpenMode.CREATE);

IndexWriter writer = new IndexWriter(new SimpleFSDirectory(indexDir),

fsConfig); //采用文件目录存储索引

File[] dataFiles = dataDir.listFiles(); //获取目录下的所有文件列表

Document document = new Document();

for (int i = 1; i < dataFiles.length; i++) { //对所有文件进行遍历

InputStream is = new FileInputStream(file);

tika.parse(is, met); // 利用tika分析出文档的元数据信息

Document document = new Document(); //每个文件对应一个Document对象

document.add(new Field("filename", file.getName(), Store.YES,

Index.ANALYZED)); //将文件名对应的域加入document对象中

document.add(new Field("title", met.get("title"),

Store.YES, Index.NOT_ANALYZED)); //从元数据中获取文档标题加入索引

document.add(new Field("content", tika.parseToString(file), Store.YES,

Index.ANALYZED)); //利用tika分析文件的文本内容,并存储在content域

writer.addDocument(document); //将Document对象写入索引文件中

}

为提高检索效率,可在代码中添加限制,只对某些文件类型进行处理。

2 建立基于Web的内容搜索服务

2.1 实现内容搜索服务业务逻辑

Lucene 提供了几个基础的类来实现索引上的搜索访问。IndexSearcher允许在给定的目录中的索引提供搜索服务,其Search 方法可返回一个按分值排序的文档集合。Term是搜索的基本单位,它由两部分组成:单词文本和出现该文本的字段名称。Query用来实现对查询字符串的封装。常见子类有:TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、RangeQuery、 MultiTermQuery、FilteredQuery等。TopDocs对象封装最顶部的若干搜索结果以及 ScoreDoc的总数。主要步骤如下:

(1) 利用QueryParser构建一个查询分析器,通过选择的分词工具来对查询关键字进行分析。

(2) 利用IndexSearcher建立索引搜索对象。通过执行对象的search方法实现对具体查询对象的查询。返回TopDocs对象为查询结果中的顶部若干记录。

(3) 通过遍历TopDocs对象得到搜索结果文档,对结果包装处理。

以下搜索服务是将查询词与content字段进行匹配,从而实现全文搜索,搜索结果存储在FileItem文件项组成的列表中,这里的FileItem类含文件名、内容摘要、标题3个属性。

程序中高亮显示需要用到lucene-highlighter- 3.0.1.jar。利用Highlighter对象的getBestFragment方法可获取内容的摘要,并对摘要中的搜索词进行加亮处理。

public class SearcherService {

public static List search(String queryStr){ //方法参数为查询关键词

List items=new ArrayList ();//存放搜索到的文档项目

File indexDir = new File("e:\index1");

FSDirectory directory = FSDirectory.open (indexDir); //索引文件位置

IndexSearcher searcher = new IndexSearcher (directory); //建立索引搜索对象

Analyzer me = new IKAnalyzer(); // 用IKAnalyzer分词工具进行分词

QueryParser m= new QueryParser(Version. LUCENE_31,"content",me);

Query luceneQuery = m.parse(queryStr.toLower Case());//查询词分析

// 以下创建高亮显示模板

SimpleHTMLFormatter shf = new SimpleHTMLFormatter("");

// 以下构造高亮对象

Highlighter highlighter = new Highlighter(shf, new QueryScorer(luceneQuery));

highlighter.setTextFragmenter(new SimpleFragmenter(200));

Filter filter =null;

TopDocs topDocs = searcher.search(lucene Query, filter, 10); //进行搜索

for (ScoreDoc scoreDoc : topDocs.scoreDocs) {

int index = scoreDoc.doc;

Document doc = searcher.doc(index);

String title = doc.get("title"); //获取文档对象的标题

String summary = highlighter. getBestFragment (me, "content",

doc.get("content")); //提取文档摘要,并对搜索词用高亮显示

items.add(new FileItem(doc.get("filename"), summary,title));

//这里每个文件对应有文件名、内容摘要、标题3个数据域。

}

return items; //返回存放包装结果的列表对象

}

}

2.2 Spring MVC控制器的代码

应用采用Spring MVC方式实现Web访问服务,以下为基于注解的Spring控制器设计。控制器的Mapping方法中给出了REST风格的路径标识[4],请求URI匹配该路径时将执行程序中的disp方法,通过调用查询搜索服务,将查询结果存入模型中,供视图文件进行显示处理[6]。

@Controller

public class myappController {

// 用户输入查询关键词提交后的处理

@RequestMapping(value="/index", method=RequestMethod.POST)

public ModelAndView disp(@RequestParam ("keyword") String key ) {

ModelMap dataModel= new ModelMap();

List items= SearcherService. search(key); //调用搜索服务

dataModel.put("keyword",key);

dataModel.put("result",items); //结果加入模型

return new ModelAndView("/result", dataModel); // result.jsp为视图文件

}

}

具体应用中要通过XML配置文件配置视图解析器,并通过解析器的参数注入定义视图文件的存储路径及视图文件的默认后缀类型。以下为解析器Bean的配置:

< bean class="org.springframework.web.servlet.view. InternalResourceViewResolver">

2.3 显示视图

显示视图(文件名为result.jsp)中要给出查询提交表单和查询结果,以下程序中采用JSTL实现模型数据访问处理,用EL表达式输出模型数据。应用界面如图2所示。

value="${keyword}" >

显示结果中提供了一个超链,以便访问某个文档。超链中“docs”可以是一个控制器的REST路径的前缀,也可以是配置文件中定义的资源映射路径。采用控制器路径更灵活,尤其是文件名为汉字时需要进行编码转换处理。

图2 Web搜索界面

从搜索结果可以看出,Tika提取的网页文档标题来自于网页的title标签,由网页制作工具自动产生的title标签不能很好反映文档的标题,文献[6]给出了改进处理。进一步,为了实现分页显示,需要传递分页信息,包括页的大小、页码等。分页显示要修改服务业务逻辑和控制器、视图三方面内容[8],限于篇幅不展开。

3 小结

Lucene是一个广泛使用的全文检索设计工具。Tika则可实现各类文档的元数据信息提取和文档内容文本分析。利用Lucene结合Tika可简化网站文档搜索服务设计的实现过程。该研究已应用于Java课程资源全文检索,在此基础上读者可建立个性化的搜索服务系统,除了根据内容进行搜索外,还可根据标题、文档类型等进行搜索。进一步研究可考虑根据应用主题对检索词进行语义扩展[8-9],从而提高查全率和查准率。

[1] 郎小伟,王申康.基于Lucene 的全文检索系统研究与开发[J].计算机工程,2008,35( 6) : 94-96.

[2] 周凤丽,林晓丽. 基于Lucene的Web搜索引擎的研究和实现[J].计算机技术与发展,2012,22(1):140-142.

[3] 劳志佳. 基于Lucene 3.5 搜索技术的研究与实现[J].现代计算机(专业版),2012,2:70-72.

[4] 丁振凡.Spring REST风格Web服务的Json消息封装及解析研究[J].智能计算机与应用,2012,2(2):9-10.

[5] 张宇,王映辉,张翔南.基于Spring的MVC框架设计与实现[J].计算机工程,2010,36(4):59-62.

[6] 丁振凡.基于Tika语义分析的文档标题提取研究[J].长沙大学学报,2012,26(5):69-71.

[7] 丁振凡.用Spring MVC实现数据分页显示处理[J].智能计算机与应用,2012,2(5):20-22.

[8] 位传海,范太华.基于本体的学习资源语义检索系统研究与设计[J].电化教育研究,2012,2:70-74

[9] 郭广军,周显光,陈代武.基于本体和Lucene 的网络教育资源管理检索系统[J].计算机应用与软件,2012,29(7): 116-118.

RESEARCH OF DOCUMENT RETRIEVAL SERVICE BASED ON Tika SEMANTIC ANALYSIS

DING Zhen-fan

(School of Information Engineering, East China Jiao Tong University, Nanchang,Jianxi 330013, China)

The programming process of full text retrieval design exploiting Lucene and Tika is introduced. Tika is used for get Metadata and extract text from documents. The index creating and retrieval service is realized by Lucene, we analyze the specific characteristics of Lucene API. Web access processing of search service is implemented using Spring MVC. The service can provide uniform retrieval service for documents in forms of HTML, PDF, WORD, PPT, mht and so on in web sites. Personalized content retrieval service system can be created based on this paper.

spring MVC; lucene; tika; document metadata; full text retrieval

1674-8085(2013)02-0060-05

TP393

A

10.3969/j.issn.1674-8085.2013.02.014

20012-10-29,

2012-11-09

丁振凡(1965-),男,江西丰城人,教授,硕士生导师,主要从事语义Web,分布式计算,计算机辅助教学研究(E-mail: zfding@ecjtu.jx.cn).

猜你喜欢
全文检索视图文档
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
5.3 视图与投影
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
Word文档 高效分合有高招
Oracle数据库全文检索性能研究
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
全文检索引擎Lucene系统模型与应用研究