Lucene的查询技术

点赞:32344 浏览:154408 近期更新时间:2024-03-12 作者:网友分享原创网站原创

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


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

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

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

1Lucene查询模型(LuceneQueryingModel)

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

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(∑iidfi*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的文档数量.

2Lucene查询过程(LuceneQueryingProcess)

2.1查询过程概述

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

2.2项、域查询

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

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

以QueryParser为例,代码如下:

Hitshits等于null,

try

{

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

QueryParserqueryparser等于newQueryParser("contents",newStandardAnalyzer()),

Queryquery等于queryparser.Parse(key),

hits等于searcher.Search(query),

}

2.3修饰符查询

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

3Lucene查询优化技术(LuceneQueryOptimizationTechnique)

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

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

Lucene的查询技术参考属性评定
有关论文范文主题研究: 数据库相关论文范文 大学生适用: 学院学士论文、函授毕业论文
相关参考文献下载数量: 98 写作解决问题: 如何怎么撰写
毕业论文开题报告: 论文提纲、论文题目 职称论文适用: 职称评定、中级职称
所属大学生专业类别: 如何怎么撰写 论文题目推荐度: 经典题目

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

4传统数据库的查询技术(QueryTechniquesinTraditionalDatabase)

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

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