一种基于Lucene的中文全文检索系统
- 格式:pdf
- 大小:84.40 KB
- 文档页数:3
基于Lucene全文检索系统的研究与实现[摘要] lucene是一个开放源代码的全文检索引擎工具包,利用它可以快速地开发一个全文检索系统。
利用lucene开发了一个全文检索系统,通过其特殊的索引结构,实现了传统数据库不擅长的全文索引机制,提供了对非结构化信息的检索能力。
[关键词] lucene 信息检索全文检索索引一、引言计算机技术及网络技术的迅速发展,使得internet成为人类有史以来资源最多、品种最全、规模最大的信息资源库。
如何在这海量的信息里面快速、全面、准确地查找所需要的资料信息已经成了人们关注的焦点,也成了研究领域内的一个热门课题。
这些信息基本上可以分做两类:结构化数据和非结构化数据(如文本文档、word 文档、pdf文档、html文档等)。
现有的数据库检索,是以结构化数据为检索的主要目标,实现相对简单。
但对于非结构化数据,即全文数据,由于复杂的数据事务操作以及低效的高层接口,导致检索效率低下。
随着人们对信息检索的要求也越来越高,而全文检索因为检索速度快、准确性高而日益受到广大用户的欢迎, lucene是一个用java写的全文检索引擎工具包,可以方便地嵌入到各种应用中实现针对应用的全文索引和检索功能。
这个开源项目的推出及发展,为任何应用提供了对非结构化信息的检索能力。
二、全文检索策略通常比较厚的书籍后面常常附关键词索引表(比如,北京:12,34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。
而数据库索引能够大大提高查询的速度原理也是一样,由于数据库索引不是为全文索引设计的,因此,使用like “%keyword%”时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,like对性能的危害是极大的。
如果是需要对多个关键词进行模糊匹配:like“%keyword1%”and like “%keyword2%”……其效率也就可想而知了。
es深度分页原理
ES (Elasticsearch) 是一种基于Lucene的全文搜索引擎,它的深度分页原理涵盖了搜索、文档管理、索引和调优等多个方面。
下面简单介绍ES的深度分页原理。
在ES中,分页的原理是基于搜索结果的检索,ES默认返回10条文档。
当用户需要获取更多的结果时,就需要翻页。
ES最初使用的是深分页方法,即当用户请求某一页时,ES需要搜索所有之前的结果,直到找到请求的结果页,由于这种方法需要大量的内存,查询效率低下,ES不建议使用。
ES推荐的分页方法是基于搜索上下文(Scroll)的深度分页,它会在第一次检索时建立一个只客户端可见的索引上下文,并返回一个scroll_id(或上下文ID),在客户端不断使用scroll_id分页,直到得到需要的结果为止。
当用户请求第一页时,ES创建一个初始搜索上下文,并返回第一页的结果和scroll_id,客户端使用scroll_id获取下一页的结果,这个搜索上下文可以捕捉到所有未返回的搜索结果。
当用户请求下一页时,ES会给搜索上下文提供下一页的搜索结果并更新上下文,客户端通过scroll_id获取下一页的结果。
这种方法相对于深分页方法速度更快,因为查询只需要作用于新加入的文档。
总之,ES的深度分页原理是通过建立一个只数据库能确定的上下文来获取需要的数据,之后只需根据上下文ID循环获取,避免不必要的搜索,提高检索效率。
使用Apache Lucene进行全文检索和信息检索随着数据量的日益增长,信息的获取和管理也变得越来越困难。
在这样的背景下,全文检索技术备受关注。
全文检索是指通过对文本内容进行扫描和分析,快速地查找出包含指定关键字或短语的文本,以满足用户的需求。
Apache Lucene是一款强大的全文检索引擎,具有高效、可靠、易于扩展等特点,广泛被运用于信息检索、文本分类、数据挖掘等领域。
一、Lucene的基本原理Lucene是一款基于Java语言的全文检索引擎,能够快速地在海量数据中查找指定的文本。
Lucene的检索原理可以简单地描述为:将需要检索的文本输入Lucene,Lucene建立索引文件,用户查询文本时,Lucene在索引文件中查找匹配结果,返回用户所需的信息。
Lucene的基本原理如下:1. 建立索引建立索引是Lucene进行全文检索的第一步。
在索引过程中,Lucene会对文本进行解析、分词、词语过滤等处理,然后将这些处理后的词语和其所在的文档信息存储到索引文件中。
通过如此的操作,Lucene做到了在指定时间内,快速地查找指定文本。
2. 查询当用户输入需要检索的文本时,Lucene会对该文本进行同样的预处理,得到其中的每个单独词语,并在索引文件中查找与该词语相匹配的文档。
Lucene采用了先搜索后排名的检索策略,即先找到与关键词匹配的文档,然后再通过算法对得到的结果进行排序,得出匹配度最高的文档。
3. 返回结果Lucene的返回结果是一个文档对象,其中包含了原始文本、关键词匹配的位置和得分等信息。
在大多数情况下,返回的文档对象并不是用户真正想要的结果,需要进行二次过滤和排序,才能得出目标结果。
二、Lucene的基本使用Lucene的使用可以简单地分为以下几个步骤:1. 创建索引创建索引是Lucene进行全文检索的第一步,也是最重要的一步。
在创建索引前,需要准备好需要检索的文本文件。
Lucene支持的文本格式包括txt、doc、pdf等。
es全文检索字段类型
ES(Elasticsearch)是一种基于Lucene的分布式全文搜索引擎,它具有强大的搜索和分析能力。
在ES中,可以使用不同类型的字段来定义索引中的数据类型。
以下是ES常用的字段类型:
1、Text(文本类型):用于存储长文本数据,会分词并建立倒排索引,支持全文搜索和模糊匹配。
2、Keyword(关键词类型):用于存储短文本数据,不会分词,支持精确匹配和聚合操作。
3、Numeric(数值类型):包括整型(integer)、长整型(long)、短整型(short)、字节型(byte)、双精度浮点型(double)、单精度浮点型(float)等。
4、Date(日期类型):用于存储日期和时间数据,支持包括范围查询、日期格式化和日期计算等操作。
5、Boolean(布尔类型):用于存储布尔值(true/false)。
6、Object(对象类型):用于存储复杂结构的数据,可以嵌套其他字段。
7、Geo(地理位置类型):用于存储经纬度等地理位置信息,支持地理位置查询和距离计算。
8、Binary(二进制类型):用于存储二进制数据,如图片、音频或视频等。
这些是ES中常用的字段类型,根据实际需求,可以选择合适的字段类型来存储数据,并为搜索和聚合操作提供更好的支持。
全文分两部分:一:Lucene简介Lucene版本:3.0.2全文检索大体分两个部分:索引创建(Indexing)和搜索索引(Search)1. 索引过程:1) 有一系列被索引文件(此处所指即数据库数据)2) 被索引文件经过语法分析和语言处理形成一系列词(Term)。
3) 经过索引创建形成词典和反向索引表。
4) 通过索引存储将索引写入硬盘。
2. 搜索过程:a) 用户输入查询语句。
b) 对查询语句经过语法分析和语言分析得到一系列词(Term)。
c) 通过语法分析得到一个查询树。
d) 通过索引存储将索引读入到内存。
e) 利用查询树搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交,差,并得到结果文档。
f) 将搜索到的结果文档对查询的相关性进行排序。
g) 返回查询结果给用户。
• 索引过程如下:◦创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR 就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。
◦创建一个Document代表我们要索引的文档。
◦将不同的Field加入到文档中。
我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。
不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。
其中FileReader的SRC_FILE就表示要索引的源文件。
◦ IndexWriter调用函数addDocument将索引写到索引文件夹中。
• 搜索过程如下:◦IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。
◦创建IndexSearcher准备进行搜索。
◦创建Analyer用来对查询语句进行词法分析和语言处理。
◦创建QueryParser用来对查询语句进行语法分析。
◦QueryParser调用parser进行语法分析,形成查询语法树,放到Query 中。
—94—一种基于Lucene 的中文全文检索系统苏潭英1,郭宪勇2,金 鑫3(1. 解放军信息工程大学电子技术学院,郑州 450004;2. 北京飞燕技术公司,北京 100072;3. 解放军通信指挥学院,武汉 430010)摘 要:在开源全文索引引擎Lucene 的基础上,设计了一个中文全文检索系统模型,该模型系统由7个模块组成,索引模块、检索模块是其中的核心部分。
论述了模型的整体结构,分析设计了索引及检索模块,通过具体的索引技术和检索技术来提高整个系统的检索效率。
该系统增加了加密模块,实现对建立的全文索引进行加密处理,增强了信息的安全性。
关键词:全文检索;Lucene ;倒排索引Chinese Full-text Retrieval System Based on LuceneSU Tan-ying 1, GUO Xian-yong 2, JIN Xin 3(1. Institute of Electronic Technology, PLA Information Engineering University, Zhengzhou 450004; 2. Technology Company of Beijing Feiyan,Beijing 100072; 3. Institute of PLA Communication Command, Wuhan 430010)【Abstract 】This paper proposes a model of Chinese full-text retrieval system based on Lucene which is an open source full-text retrieval engine,and expatiates its frame. This model is composed of seven modules, among which the index module and the search module are the core parts. It designs them concretely, and improves the search efficiency of the full-text retrieval system with index technology and search technology. The system model concludes an encryption module to encrypt the index and increases the system security. 【Key words 】full-text retrieval; Lucene; inverse index计 算 机 工 程Computer Engineering 第33卷 第23期Vol.33 No.23 2007年12月December 2007·软件技术与数据库· 文章编号:1000—3428(2007)23—0094—03文献标识码:A中图分类号:TP3911 中文全文检索系统全文检索技术是一个最普遍的信息查询应用,人们每天在网上使用Google 、百度等搜索引擎查找自己所需的信息,这些搜索引擎的核心技术之一就是全文检索。
随着文档处理电子化、无纸化的发展,图书馆、新闻出版、企业甚至个人的电子数据激增,如何建立数据库、管理好自己的数据,是亟待解决的问题,而全文检索是其中一个非常实用的功能。
全文检索产品实际上是一个内嵌该项技术的数据库产品[1]。
西文的全文检索已有许多成熟的理论与方法,其中,开放源代码的全文检索引擎Lucene 是Apache 软件基金会Jakarta 项目组的一个子项目,它的目的是为软件开发人员提供一个简单易用的工具包,方便在目标系统中实现全文检索的功能。
很多项目使用了Lucene 作为其后台的全文索引引擎,比较著名的有:(1)Jive :Web 论坛系统;(2)Cocoon :基于XML 的Web 发布框架,全文检索部分使用了Lucene ;(3)Eclipse :基于Java 的开放开发平台,帮助部分的全文索引使用了Lucene 。
Lucene 不支持中文,但可以通过扩充它的语言分析器实现对中文的检索。
本文在深入学习研究Lucene 的前提下,设计了一个中文的全文检索系统,对其核心的索引模块和检索模块进行了阐释,并添加了加密模块对索引信息加密,增强了系统的安全性。
2 系统的总体结构本模型总体上采用了Lucene 的架构。
Lucene 的体系结构如表1所示,它的源代码程序由7个模块组成。
表1 Lucene 的组成结构模块名功能 org.apache.Lucene.search 搜索入口 org.apache.Lucene.index 索引入口 org.apache.Lucene.analysis 语言分析器 org.apache.Lucene.queryParser 查询分析器 org.apache.Lucene.document 存储结构 org.apache.Lucene.store 底层IO/存储结构 org.apache.Lucene.util一些公用的数据结构本文通过扩充Lucene 系统来完成中文的全文检索系统,Lucene 包含了大量的抽象类、接口、文档类型等,需要根据具体应用来定义实现,本文对其作了如下扩充修改:(1)按照中文的词法结构来构建相应的语言分析器。
Lucene 的语言分析器提供了抽象的接口,因此,语言分析(analyser)是可以定制的。
Lucene 缺省提供了2个比较通用的分析器SimpleAnalyser 和StandardAnalyser ,但这2个分析器缺省都不支持中文,因此,要加入对中文语言的切分规则,需要对其进行修改。
(2)按照被索引的文件的格式对不同类型的文档进行解析,进而建立全文索引。
例如HTML 文件,通常需要把其中的内容分类加入索引,这就需要从org.apache.lucene.子document 中定义的类Document 继承,定义自己的HTMLDocument 类,然后将之交给org. apache.lucene.index 模块写入索引文件。
Lucene 没有规定数据源的格式,只提供作者简介:苏潭英(1981-),女,硕士研究生,主研方向:数据库全文检索;郭宪勇,高级工程师;金 鑫,硕士研究生 收稿日期:2007-01-10 E-mail :sutanyingwendy@了一个通用的结构(Document对象)来接受索引的输入,因此,输入的数据源可以是数据库,WORD文档、PDF文档、HTML 文档等,只要能够设计相应的解析转换器将数据源构造成Docuement对象,即可进行索引。
(3)设计具体的搜索查询。
Lucene提供了方便自建查询的API,通过QueryParser提供了强大的查询语言。
在实际应用中,要按Lucene查询语句解析器的语法设计具体的搜索器,其功能包括默认域的指定、搜索域的接收、索引库位置的接收、操作符的接收以及多个查询通过布尔操作符连接起来形成复杂的查询语句。
(4)设计检索结果的相关度。
这一部分设定文档与相关主题的准确程度,即文档符合查询要求的相似度,输出结果按此排序。
但Lucene对此不如扩充词法解析和文档类型那样条理清晰,没有留下很好的接口,因此,需要仔细地分析其源代码的实现,自行扩充。
经过扩充与设计,本文的中文全文检索引擎系统结构如图1所示。
图1 系统结构本系统中包含了语言分析模块、查询分析模块、检索结果排序模块、索引建立模块、检索模块、存储抽象模块等6个模块,它们是进行检索必备的部分。
另外,本系统充分考虑了信息的安全性,增加了一个加密模块,对所建立的全文索引进行加密。
3 系统中模块的分析与设计3.1 索引建立模块索引是全文检索的关键机制之一。
中文全文检索索引的建立比英文复杂得多,建立和维护全文检索索引库需要从以下3个方面考虑:(1)索引组织单元在西文中,文档的基本组成单元是单词,单词之间以空格间隔,而以单词为单位的索引实现起来比较简单,因此,西文的全文检索方面有许多比较成熟的理论,应用也很广泛。
中文全文检索技术在原理上同西文全文检索一致,但由于中文的词与词之间没有分隔符,因此其实现过程复杂得多。
在中文文档中,基本元素可以是单个汉字字符,也可以是词。
相应地,建立索引时就有2种基本的索引结构:基于字表的索引和基于词表的索引。
字表法把源文档中的每一个字的出现位置记录到索引库中,索引库对每个不同的字符都保存了一个字表,记录同一个字在文档中的所有出现位置。
词表法以能表达一定意义的词为基本独立单位建立索引库。
也有一些学者将2种方法结合,提出基于单元词的索引,但目前没有被广泛应用。
本文选用了字表法。
字表法对每个字的出现位置进行统计,并依据位置信息进行检索,不采用分词,实用性很强,查准率较高。
但单个汉字经常不具有独立的含义,因此,字表法在特定情况下会出现多检。
(2)索引组织方式无论是字索引还是词索引,全文检索的索引组织有正排表和倒排表2种方式[2]。
正排表是以文档的ID为关键字,表中记录项记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
正排表结构如图2所示[3]。
图2 正排表的索引结构这种组织方法的结构比较简单,建立比较方便且易于维护,但是在查询时需要对所有文档进行扫描,以确保没有遗漏,这就大大延长了检索时间,降低了检索效率。
与大多数全文检索系统一样,本文的全文检索系统采用倒排表来组织索引。
倒排表以字或词为关键字进行索引,关键字对应的表项记录出现这个字或词的所有文档,每个表项记录着该文档的ID和所对应的关键字在该文档中出现的位置情况。
倒排表的组织结构如图3所示[3]。
图3 倒排表的索引结构因为每个字或词对应的文档数量是动态变化的,所以倒排表的建立和维护都较为复杂,但是在查询时可以一次得到查询关键字所对应的所有文档,因此效率高于正排表。
在全文检索中,检索的快速响应是最关键的性能之一,而索引的建立在后台进行,效率相对较低,不会影响整个搜索引擎的效率[3]。
(3)索引压缩在全文检索系统中,存储的数据信息是动态增加的。
由于索引记录了关键字每一次出现的位置信息,随着信息的不断增加,需要索引的内容会不断增加,索引量也将不断增大,如果不进行压缩处理,索引的大小会和原文档相当甚至是其的几倍,这必然会占用较多的存储空间[3]。
更重要的是,查询时需要读入的索引量也在增加,降低了查询速度。