浅析Lucene的查询技术

时间:2022-08-08 05:36:52

浅析Lucene的查询技术

摘要:Lucene是一个强大的全文索引引擎工具包,它的全文检索技术是信息检索领域广泛使用的基本技术,具有访问索引时间快、多用户访问、跨平台使用的特点。该文着重分析了Lucene的查询模型,研究了Lucene的查询方式,并提出了Lucene查询优化的方法。

关键词:查询模型;查询评分方式;查询过程;查询优化方式

中图分类号:TP393文献标识码:A文章编号:1009-3044(2012)11-2524-02

Lucene的检索算法属于索引检索,即用空间来换取时间,主要适用于文档集的全文检索,以及海量数据库的模糊检索。搜索就是查找一条索引里的单词出现的文档的过程。一个搜索的质量是用精度和回调法来描述的。回调测量搜索系统查找相关的文档的质量,然而精度测量系统过滤出不相关文档的质量,但是在思考搜索的时候必须考虑许多其他因素。Lucene已经提及速度和快速搜索大量文本的能力。支持单个的和多个词汇的查询,短语查询,通配符,结果分级,以及排序功能。Lucene的强大的软件库提供许多查询特性。

1 Lucene查询模型(Lucene Querying Model)

查询模型是一个四元组[D,Q,F,R(qi,dj)],D为文档集的机内表示,Q为用户需求的机内表示,F为文档表示、查询表示和它们之间的关系的模型框架(Frame),R(qi,dj)给query qi和document dj评分

1.1向量模型

向量空间模型将文档映射为一个特征向量V(d)=(t1,w1(d);…; tn,wn(d)),其中ti(i=1,2,…n)为一列互不相同的词条项,wi(d)为ti在d中的权值,一般被定义为ti在d中出现频率tfi(d)的函数。向量模型的优点在于,术语权重的算法提高了检索的性能;部分匹配的策略使得检索的结果文档集更接近用户的检索需求;根据结果文档对于查询串的相关度并通过公式对结果文档进行排序[1-2]。

Lucene把索引中的每个词作为空间的一个维度;把每一篇文档作为空间中的一个向量;把每一个查询也作为空间中的一个向量;通过计算文档和查询的内积或余弦等来表示文档和查询的相关程度。

1.2布尔模型

BooleanQuery是一种复合式的Query支持多种不同Query的逻辑组合,可以对不同的query赋予不同的boost值表示该query在整个BooleanQuery中的重要程度。

qerynorm=boost/sqrt(∑i idfi*idfi*boosti*boosti)

计算每个查询的Term和匹配文档的分值:

Weight=queryWeight*fieldWeight;

queryWeight=boost*idf*querynorm;

fieldWeight=tf*idf*fieldnorm;

每篇匹配文档计算总得分:

score=coord*(∑iweighti);coord=匹配词项数/总词项数;

qerynorm为一个修正因子,用来使不同查询间的分数更可比较。

boost为该query被赋予的权值。

tf为该query中的term在某文档中出现的次数。

idf为lg(N/df),其中N为文档总数,df为含term的文档数量。

2 Lucene查询过程(Lucene Querying Process)

2.1查询过程概述

Lucene的搜索采用二元搜索算法快速定位关键词,这是由于Lucene倒排索引关键词是按字母字符顺序排列的。找到相应关键词后,通过指向频率文件的指针读出所有的文档号,然后对所得文档进行评分(Lucene的评分机制基于向量空间模型),最终把相关度高的前100个查询结果以文档引用的方式存储在Hits对象中,这些得分较高的文档基本可以满足用户对查询信息的要求[4]。

2.2项、域查询

一条搜索语句被拆分为一些项(term)和操作符(operator)。项有两种类型:单独项和短语。单独项就是一个单独的单词,例如"test","hello"。短语是一组被双引号包围的单词,例如"hello world"。多个项可以用布尔操作符连接起来形成复杂的查询语句。

Lucene支持域。指定在某一个域中搜索,或者就使用默认域。域名及默认域是由具体索引器来决定的。

以QueryParser为例,代码如下:

Hits hits = null;

try

{

//contents为检索字段,key为检索词

QueryParser queryparser = new QueryParser("contents",new StandardAnalyzer());

Query query = queryparser.Parse(key);

hits = searcher.Search(query);

……

}

……

2.3修饰符查询

Lucene支持单个与多个字符的通配搜索。使用符号"?"表示单个任意字符的通配。使用符号"*"表示多个任意字符的通配。单个任意字符匹配的是所有可能单个字符。多个任意字符匹配的是0个及更多个可能字符。可以在字符窜中间使用多个任意字符通配符,不能在搜索项的开始使用*或者?符号。

3 Lucene查询优化技术(Lucene Query Optimization Technique)

Lucene支持内存索引:这样的搜索比基于文件的I/O有数量级的速度提升。而尽可能减少IndexSearcher的创建和对搜索结果的前台的缓存也是必要的。

Lucene面向全文检索的优化在于首次索引检索后,并不把所有的记录(Document)具体内容读取出来,而起只将所有结果中匹配度最高的头100条结果(TopDocs)的ID放到结果集缓存中并返回,这里可以比较一下数据库检索:如果是一个10,000条的数据库检索结果集,数据库是一定要把所有记录内容都取得以后再开始返回给应用结果集的。所以即使检索匹配总数很多,Lucene的结果集占用的内存空间也不会很多。对于一般的模糊检索应用是用不到这么多的结果的,头100条已经可以满足90%以上的检索需求[5]。

如果首批缓存结果数用完后还要读取更后面的结果时Searcher会再次检索并生成一个上次的搜索缓存数大1倍的缓存,并再重新向后抓取。所以如果构造一个Searcher去查1-120条结果,Searcher其实是进行了2次搜索过程:头100条取完后,缓存结果用完,Searcher重新检索,构造一个200条的结果缓存,依此类推,400条缓存,800条缓存。由于每次Searcher对象消失后,这些缓存也访问不到了,你有可能想将结果记录缓存下来,缓存数尽量保证在100以下以充分利用首次的结果缓存,不让Lucene浪费多次检索,而且可以分级进行结果缓存。

4传统数据库的查询技术(Query Techniques in Traditional Database)

数据库在非精确查询的时候使用查询语言“like %keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行“%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。

王学辉等人曾对比Lucene检索与数据库模糊查询的速度:检索21668条体检记录(只是信息的简单罗列,数据量并不是特别大),在相同的情况下, Lucene用时60ms,数据库模糊查询用时361ms。可以想象,如果将Lucene用在海量数据检索(比方说文献检索)上,相对模糊查询来说,速度优势是可想而知的。

参考文献:

[1]林永民.向量空间模型征加权的研究[J].情报杂志,2008,27(3):5-10.

[2]刘斌.向量空间模型信息检索技术讨论[J].情报杂志,2006,25(7):91-94.

[3]申剑.基于Lucene的搜索策略研究[J].现代计算机,2008,25(12):98-99.

[4]朱学昊.基于Lucene的站内搜索设计与实现[J].计算机应用与软件,2008,25(10):6-8.

[5]周登朋.Lucene搜索引擎[J].计算机工程,2007,33(18):95-96.

上一篇:职校生计算机课程绩效多元评价 下一篇:军队院校《数据库》课程案例驱动教学改革探索