网站首页  词典首页

请输入您要查询的论文:

 

标题 基于Lucene的全文检索的研究及实现
范文

    徐诚皓

    摘要:Lucene是一个基于Java 设计的,高效开源的全文索引引擎工具包。它简单却足够强大,可以嵌入到各种应用中,实现针对全文的索引和多功能检索。文章介绍分析了Lucene的系统结构和实现机制,开发实现了一个基于Lucene的Web应用。

    关键词:全文检索;Lucene;中文分词;Web实现

    中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)10-0092-03

    Lucene是一个开源全文检索工具包,它具有优异的索引结构和良好的系统架构,提供了灵活的API函数接口和可以定制的数据存储结构,以实现具体的全文检索功能。Lucene完全由Java JDK开发而成,没有用到任何第三方开发包,因此,Lucene也具有良好的跨平台特性。文章对Lucene进行了研究和分析,以此为基础设计实现了一个手机信息检索的Web应用。

    1 全文检索引擎Lucene

    1.1 系统结构

    由于是基于Java设计的,Lucene也运用了面向对象的设计思想,定义了一种使不同平台间能够兼容共享的索引文件格式,并通过抽象将系统的核心组成部分设计为抽象类,具体平台的实现部分设计为实现类。此外,与平台相关的部分例如文件存储也封装为类,并通过逐层处理,形成了一个低耦合、高效率、易扩展的检索引擎系统。

    Lucene 由基础结构封装、索引核心、对外接口三大部分组成。系统结构图如图1 所示。

    如图1所示,Lucene包含七个组成结构:

    1. org.apache.lucene.analysis:语言分析器,主要用于分词;

    2. org.apache.lucene.document:存储索引的文档结构,类似oracle中的表结构

    3. org.apache.lucene.index:索引管理,主要包括建立,删除等

    4. org.apache.lucene.search:检索入口,根据查询条件,检索结果;

    5. org.apache.lucene.queryParser:查询分析器,根据关键词及其相互关系,提供自定义检索;

    6. org.apache.lucene.store:数据存储管理,主要包括底层I/O操作;

    7.org.apache.lucene.util:提供一些工具类。

    1.2 与关系型数据库的对比

    一般来说,信息可分为结构化信息和非结构化信息。结构化信息指的是具有固定格式和长度的信息;而非结构化信息指的是不定长,无格式的信息。现实生活中,大部分信息都是非结构化的,比如HTML页面,电子邮件等。

    关系型数据库,如oracle,它们在处理结构化信息时,有着高效快速的特点。但是在处理非结构化信息时,由于结构模型等原因的限制,往往力不从心。而Lucene就能够处理这些非结构化信息,它通过将这些文本数据解析成中间格式,再进行索引查询。

    1.3 检索实现机制

    Lucene中最基本的概念是索引(index), 文档(document), 域(field)和项(term)。索引包含了文档的序列, 文档是域的序列, 域是项的序列, 项就是字符串。为了使得基于项的搜索更有效率, 索引中项是静态存储的。Lucene的索引属于索引方式中的反向索引, 反向索引是一種以项为中心来组织文档的方式,每个索引项指向一个文档序列,这个序列中的文档都包含该项。这正是Lucene所采用的反向索引机制。

    1.4 中文分词

    分词是文本挖掘的基础与关键。由于Lucene自带的分词器对英文的分词效果较好,但对中文的分词效果并不如意。为了使检索系统能更好的处理中文信息,本文采用了IKAnalyzer作为分词器。IKAnalyzer是一个开源的,基于Java开发的轻量级的中文分词工具包。它最初以Lucene为应用主体的,3.0版本后独立于Lucene,同时对Lucene提供优化,是结合词典分词和文法分析算法的中文分词组件。

    本文使用的IKAnalyzer2012FF_u1的特性:

    采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;

    具有160万字/秒(3000KB/S)的高速处理能力;

    智能分词模式支持简单的分词排歧义处理和数量词合并输出;

    采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符;

    优化了词典存储,内存占用更小;

    用户词典扩展定义,支持中文,英文,数字混合词语

    提供针对Lucene全文检索优化的查询分析器IKQueryParser;

    采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

    2手机信息检索系统的实现

    本系统采用的是 MyEclipse10 + Struts2 + Tomcat6 的开发环境。

    2.1 构建文本库

    图2的数据是从中关村手机频道中整理的手机部分信息,包括厂商,型号,处理器,系统,内存容量,屏幕尺寸,摄像头最高像素,报价,特点等,组成以TAB分隔的tsv文件。

    2.2 创建索引

    一般全文检索有两个过程,创建索引和搜索索引。由此可见,索引是全文检索引擎中的关键,只有建立了索引才能进行全文检索。Lucene采用了Document逻辑文件和Field域来组织各种数据源。我们可以把Document逻辑文件想象成一个新闻HTML页面,把URL,新闻标题,作者,发布时间,正文等组成部分看做Field域,再根据属性配置进行相应的处理,就能建立索引。

    索引过程如下:

    1)创建IKAnalyzer中文分词器对象,用来从文本中提取出索引项。

    2)用IndexWriter类创建一个索引(index),并在之后能为索引添加文档(document)。

    3)创建Document类的实例,代表我们要索引的文档,它是由一个或多个域(field)组成。

    4)将不同的域加入到文档中。比如,一篇文档有多种信息,如题目,作者,修改时间,内容等,都可以域用来表示。

    5)IndexWriter类对象调用函数 addDocument 将索引写到索引文件夹中。

    6)提交保存索引文件。

    下面是建立索引的关键代码:

    // 创建分词器

    analyzer = new IKAnalyzer(true);

    // 根据指定的路径创建索引库,如果路径不存在就会创建

    directory = FSDirectory.open(new File(INDEX_PATH));

    // 创建IndexWriter

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);

    indexWriter = new IndexWriter(directory, config);

    for (File file : fileList) {

    // 读取文件的内容

    List content = file2String(file);

    // 創建Document对象

    for (int i = 0; i < content.size(); i++) {

    Document document = new Document();

    //Store配置field字段是否存储到索引库

    //YES:字段存储到索引库中

    //No:不存储到索引库中

    document.add(new TextField("contents", content.get(i), Store.YES));

    // 通过IndexWriter将文档添加到索引中

    indexWriter.addDocument(document); }}

    // 提交索引

    indexWriter.commit();

    2.3 搜索索引

    Lucene建立了功能强大的索引机制为搜索服务。

    搜索过程如下:

    1)使用DirectoryReader将磁盘上的文件夹中索引文件信息读入到内存。

    2)使用IndexSearcher创建查询对象,准备进行搜索。

    3)创建IKAnalyzer对象用来对查询语句进行中文词法分析和语言处理。

    4)创建MultiFieldQueryParser对象用来对查询语句进行语法分析。

    5)调用MultiFieldQueryParser对象的parser方法进行语法分析,形成查询语法树,放到Query对象中。

    6) 调用IndexSearcher对象的search方法,对查询语法树Query进行搜索,得到查询结果。

    下面是进行搜索的关键代码:

    //创建索引库

    directory = FSDirectory.open(new File(INDEX_PATH));

    //创建分词器

    analyzer = new IKAnalyzer(true);

    ireader = DirectoryReader.open(directory);

    //创建查询对象

    IndexSearcher isearcher = new IndexSearcher(ireader);

    //要查找的关键字字符串数组

    String[] stringQuery= keywords;

    //Occur.MUST表示对应字段必须有查询值, Occur.MUST_NOT 表示对应字段必须没有查询值

    String[] fields = new String[keywords.length];

    Occur[] occ = new Occur[keywords.length];

    //生成关键字与字段间的关系

    for (int i = 0; i < fields.length; i++) {

    fields[i] = "contents";

    occ[i] = Occur.MUST; }

    //查找

    Query query = MultiFieldQueryParser.parse(Version.LUCENE_40, stringQuery, fields, occ, analyzer);

    //返回查到的数据

    ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;

    2.4 系统演示

    3结论

    Lucene全文检索机制主要工作在搜索引擎的索引阶段和检索阶段。文章对Lucene在这两个阶段的应用做了初步的探讨,实现了一个手机信息检索系统的实例。可以看出,Lucene在搜索引擎领域的应用有很大发展前景。

    参考文献:

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

    [2] 管建和,甘剑峰.基于Lucene全文检索引擎的应用研究与实现 [J].计算机工程与设计,2007,28(2):489-491.

    [3] 向晖,郭一平,王亮. 基于Lucene的中文字典分词模块的设计与实现[J].现代图书情报技术,2006(8):46-50.

    [4] 朱小杰.Lucene教程[EB/OL].

    [2016-03-15].https://www.cnblogs.com/zhuxiaojie/p/5277219.html#autoid-5-1-0.

    [5] 徐宝文,张卫丰.搜索引擎与信息获取技术 [M].北京:清华大学出版社,2003.

    [6] 车东. 在应用中加入全文检索功能—基于Java的全文索引引擎Lucene简介[EB/OL].

    [2009.03.20]http://www.chedong.com/tech/lucene.html.

    [7] 李刚,宋伟.征服Ajax+Lucene构建搜索引擎 [M].北京:人民邮电出版社, 2006:220-245.

    [8] 文振威,秦晓.个性化搜索引擎的研究与设计[J].计算机工程与设计,2009,30(2):342-344.

    

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/2/5 22:11:29