`
sealbird
  • 浏览: 572501 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Lucene Payload 的研究与应用<一>

阅读更多

http://www.ibm.com/developerworks/cn/opensource/os-cn-lucene-pl/index.htmlLucene Payload 的研究与应用 

  文档选项
  打印本页

   将此页作为电子邮件发送




级别: 初级

杨 筱强 (yangxq@cn.ibm.com), 软件工程师, IBM
马 蕤 (marui@cn.ibm.com), 软件工程师, IBM
赵 胜 (zhaos@cn.ibm.com), WebSphere Information Integrator部门经理, IBM中国软件开发中心


2008 年 11 月 06 日

Payload (元数据) 诞生于 Lucene 的2.2 版本,它是在 Lucene 2.1 索引文件格式的基础上扩展而来,提供了一种可以灵活配置的高级索引技术,在某些特定应用场景下能优化基于 Lucene 构建的应用的搜索性能。本文重点研究了 Payload 的实现原理、索引结构的变化、接口 API ,在本文的最后举例说明了 Payload 是如何帮助改善搜索体验的。
Lucene 是最初是由 Douglass R. Cutting 博士发布在自己主页上的一个 Java 全文信息检索工具包,后来成为 Apache Jakarta 家族中的一个开源项目,目前已经成为 Apache 基金会的顶级项目。索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成方便查询的索引文件的过程。 Lucene 采用的是一种被称为倒排索引 (Inverted Index) 的机制,倒排索引也是大多现代搜索引擎的基础。

Payload (元数据) 诞生于 Lucene 的2.2 版本,它是在 Lucene 2.1 索引文件格式的基础上扩展而来,提供了一种可以灵活配置的高级索引技术。本文重点研究了 Payload 的实现原理、索引结构的变化、接口 API ,在本文的最后举例说明了 Payload 是如何帮助改善搜索体验的。

Payload 的出现

倒排索引就是说我们维护了一个词条表,对于这个表中的每个词条,都有一个链表描述了有哪些文档包含了这个词条。假定我们有三篇文档 D0,D1,D2:

D0 = "it is what it is"
D1 = "what is it"
D2 = "it is a banana"



那么,我们可以创建如下倒排索引结构:

Term      Posting-list
"a":      {2}
"banana": {2}
"is":     {0, 1, 2}
"it":     {0, 1, 2}
"what":   {0, 1}



一般情况下,将一个词条所索引的文档(一般用文档编号表示)称之为 Posting,那么一个词条索引的多个文档就称之为 Posting-list。除了在 Posting-list 中记录文档编号,Lucene 也在Posting-list 中添加了词频和位置信息。词频的添加有助于结果的排序,位置信息的添加解决了短语检索的问题。

在Lucene 2.1 中,记录位置信息的即 .prx 文件,它的格式如下:

ProxFile (.prx) --> <TermPositions> TermCount
TermPositions --> <Positions> DocFreq
Positions --> <PositionDelta> Freq
PositionDelta --> VInt



仔细观察我们可以发现,文档 D0 中 what 词条是加粗显示而文档 D1 中的 what 则没有。显然,Lucene 2.1 的索引结构是无法表示出两者的差异。为了解决这个问题,从 Lucene2.2 开始,引入了 Payload 的概念。 Payload 即词条 (Term) 的元数据或称载荷, Lucene 支持用户在索引的过程中将词条的元数据添加的索引库中,同时也提供了在检索结果时读取 Payload 信息的功能。Payload 的诞生为用户提供了一种可灵活配置的高级索引技术,为支持更加丰富的搜索体验创造了条件。

那么 Lucene 是如何改进索引文件以支持 Payload 功能的呢?






回页首




索引结构的变化

为了更加形象的描述改进后的索引结构,我们用不同的颜色表示出文档 ID ,词频,位置和 Payload,如图 1 所示,(U表示下划线,B表示粗体)


图 1:Lucene的索引结构


对比 Lucene2.1 的索引结构,Lucene2.2 的索引结构的表达式如下:

ProxFile (.prx) --> <TermPositions> TermCount
TermPositions --> <Positions> DocFreq
Positions --> <PositionDelta,Payload?> Freq
Payload --> <PayloadLength?,PayloadData>
PositionDelta --> VInt
PayloadLength --> VInt
PayloadData --> bytePayloadLength



从上面的索引表达式中可以看出只有当一个词汇包含 Payload 信息时,Lucene 才会为之分配相应的 Payload 存储空间,这是一种高效率的空间实现。Lucene2.2 之后的 Payload 特指词条的元数据,那么文档的元数据如何表示呢?

我们知道,Lucene 中 Document 由 Field 组成,而 Field 由 Term 组成,文档的 Payload 可以用存储的 Field 表示。这样存在的问题是,如果需要读取大量的文档的元数据,因为 Field 的索引信息与存储信息是分开的,那么 I/O 效率将是较差的。而 Payload 信息则是直接存储在索引中,因此可以利用词条的 Payload 功能存储文档级别的元数据。文档级 Payload 可表示为如下图2所示格式(省略了词频和位置信息):


图 2:文档级的 Payload 表示


如图2所示,以文档的 url 信息为例,通过为每一个文档构造一个特殊的词条 ”url” ,将每个文档的 ur l值作为 payload 信息,把 Payload 与文档编号关联起来,这样就可以实现文档级的 Payload。






回页首




Payload 相关的 API

从 Lucene2.2 的索引结构可以看出,Payload 的存储与词条的位置信息是紧密联系在一起的,因此 Payload 的存储和检索 API 位于Token类和 TermPositions 类当中。

向词条中存储 Payload 信息

org.apache.lucene.analysis.Token
void setPayload(Payload payload)



Payload 信息的构造函数

org.apache.lucene.index.Payload
Payload(byte[] data)

Payload(byte[] data,
        int offset,
        int length)



从位置信息中检索 Payload

org.apache.lucene.index.TermPositions
boolean next();
int doc()
int freq();

int nextPosition();

int getPayloadLength();
byte[] getPayload(byte[] data,
                  int offset)







回页首




Payload 的应用场景举例

场景一:改进的 Lucene 的区间检索

日期检索是区间检索的常见例子,如用户需要在图书馆中检索特定年代的图书,满足如下条件:

Date>1954/08/01 & Date<1955/08/01



常见的做法就是将日期作为一个独立 Field 进行存储,利用 RangeQuery 进行区间检索,Posting-list 的格式如图3中左图所示。如果图书日期分布区间很广,用 Field 存储日期信息,我们需要将日期细化到年月日进行存储,因此词条数目是非常庞大的。这种情况下,我们可以利用 Payload 功能来减少词条的数目,提高检索效率,可以将日期的年月作为词条,日作为 Payload 信息,这几乎将词条数目减小了近 30 倍,改进后的存储结构如图3右图所示:


图 3:使用 Payload 存储日期信息


场景二:提高特定词汇的评分

利用 Payload 功能,还可以提高文档中特定词汇的评分,如黑体词汇、斜体词汇等,从而优化搜索结果排序。

下面还以文档 D0 和 D1 为例说明如何设置和检索 Payload。

D0 = "it is what it is"
D1 = "what is it"



Step1:在 Analyzer 处理过程中,为特殊词汇添加评分 Payload

final byte BoldBoost = 5;

final byte ItalicBoost = 5;

Token token = new Token(…);

if (isBold) {//如果是黑体字
  token.setPayload(
    new Payload(new byte[] {BoldBoost}));
}else if(isItalic){//如果是斜体字
  token.setPayload(
    new Payload(new byte[] { ItalicBoost }));
}

return token;



Step2:重写 Similarity (主要负责排名和评分)

Similarity boostingSimilarity =
  new DefaultSimilarity() {
    // @override
    public float scorePayload(byte [] payload,
                              int offset,
                              int length) {

      //读取payload的值,payload存储的即为词汇的评分。
      if (length == 1) return payload[offset];
    };



Step3:使用重写的 boostingSimilarity 进行检索

Query btq = new BoostingTermQuery(
                new Term(“field”, “what”));



Searcher searcher = new IndexSearcher(…);
Searcher.setSimilarity(boostingSimilarity);

Hits hits = searcher.search(btq);


分享到:
评论

相关推荐

    Java搜索引擎的研究与实现(含文档+源码)

    Java搜索引擎的研究与实现(含文档+源码)&lt;br&gt;目录 1&lt;br&gt;摘要 3&lt;br&gt;第一章 引言 4&lt;br&gt;第二章 搜索引擎的结构 5&lt;br&gt;2.1系统概述 5&lt;br&gt;2.2搜索引擎的构成 5&lt;br&gt;2.2.1网络机器人 5&lt;br&gt;2.2.2索引与搜索 5&lt;br&gt;2.2.3 Web...

    jive.chm

    &lt;br&gt; 2 jcs学习笔记 &lt;br&gt; 3 关于Hibernate的Cache问题 &lt;br&gt; 4 用缓冲技术提高JSP应用的性能和稳定性 &lt;br&gt; 5 SwarmCache入门 &lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;源代码研究&lt;br&gt; 1 Jive中的全局配置 &lt;br&gt; 2 Jive源代码情景分析-index....

    Lucene中文分词器包

    &lt;br&gt;1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP)&lt;br&gt;2. 对数量词、地名、路名的优化处理&lt;br&gt;3. 对未知词汇采用自识别结合二元切分算法,确保搜索召回率&lt;br&gt;(使用方法...

    lucene-1.4.3

    包括lucene-1.4.3.src和lucene-1.4.3.zip&lt;br&gt;其中lucene-1.4.3.zip中含有lucene-1.4.3.jar&lt;br&gt;

    Lucene查询工具LQT.zip

    Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出。 使用方法: $ ./lqt usage: LuceneQueryTool [options] --analyzer &lt;arg&gt; for query, (KeywordAnalyzer | ...

    X3-BLOG 0.8beta

    * 增加个人档案&lt;br&gt; * 加入相册评论和评论管理&lt;br&gt; * 增加了日志的快速收藏功能&lt;br&gt; * 优化了模拟下拉列表和窗口拖动代码&lt;br&gt; * 评论的验证码设定为点击验证码输入框时才载入,节省服务器资源&lt;br&gt; * 调整了DataSource...

    Lucene:基于Java的全文检索引擎简介

    &lt;br&gt;Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET...

    基于Lucene的搜索引擎的研究与应用

    基于Lucene的搜索引擎的研究与应用基于Lucene的搜索引擎的研究与应用

    compass包及相关学习资料

    Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.内容包括compass的jar包及从网上搜集的相关学习资料.&lt;br&gt;附两个不错的资料地址:&lt;br&gt;...

    开发自己的搜索引擎《lucene2.0+heritrix》一书对应的源码资料

    开发自己的搜索引擎《lucene2.0+heritrix》一书对应的源码资料,总共有30M,只上传了几个例子.&lt;br&gt;ch2-lucene入门小例子&lt;br&gt;myReserch-可用的网络搜索引擎

    基于Lucene的全文检索系统的研究与应用

    基于Lucene的全文检索系统的研究与应用&lt;br/&gt;大连理工大学硕士论文

    lucene-pdf:一个能够轻松对 PDF 文本和元数据进行 Lucene 索引的库

    lucene-pdf lucene-pdf 是一个 JVM(Java、Scala、Groovy、Clojure 等)库,通过与集成,可以轻松地对 PDF 文本和元数据进行 Lucene 索引。“安装” lucene-pdf 在 Maven 中心可用; 将它添加到您的 Maven 项目的pom...

    2个开源的BLOG

    &gt;3.1.3, Strus-&gt;1.2.9, Lucene 2.0.0 &lt;br/&gt;采用最新的可视化编辑器FCKEditor,兼容包括IE,FireFox,Netscape等浏览器 &lt;br/&gt;支持个人一级域名与空间之间的绑定 &lt;br/&gt;采用客户端标识码充分确保表单数据的有效性 &lt;br/&gt;...

    semantic-vectors-lucene-tools:用于为语义向量建立Lucene索引的工具

    用于语义向量的Lucene工具允许根据有关Seldon MySQL数据库中项目(例如电影,文章)的元数据创建Lucene索引。...item-limit &lt;item&gt; -jdbc &lt;JDBC&gt;&lt;lucene&gt; :在其中重新创建lucene索引的文件夹&lt;attr&gt;

    基于Lucene的全文检索引擎研究与应用

    基于Lucene的全文检索引擎研究与应用

    BBS-CS 天乙社区 v6.0.1(含源码)

    &lt;br&gt; 4、全文检索:天乙社区6.0采用Lucene全文检索,并支持完全国际化多语言的全文检索。 &lt;br&gt; 5、MVC框架:天乙社区6.0继续了5.x的Struts框架,但经过优化,WEB端更加简洁高效。 &lt;br&gt; 6、集群支持:系统可以运行在...

    基于Lucene的全文检索引擎研究与应用.pdf

    快速有效地索引企业累积的大量的信息资源,是提供高质量检索服务的基础。Lucene 是一个用Java 写的全文索 引引擎工具包,访问索引时间快,支持多用户...Lucene 的索引文件格式,实现了一个基于Lucene 文档检索的应用实例。

    LoremIpsumSearch:包含与 lucene 和 solr 一起使用的搜索算法

    LoremIpsum搜索 包含与 lucene 和 solr 一起使用的搜索算法... export CLASSPATH="&lt;lucene&gt;/lucene/replicator/lib/*:&lt;nutch&gt;/build/*:&lt;nutch&gt;/build/lib/*:&lt;lucene&gt;/solr/dist/*:&lt;lucene&gt;/solr/ dist/solrj-lib/*:*:.

    基于Lucene的搜索引擎应用与研究

    基于Lucene的搜索引擎应用与研究

    LuceneInAction源码

    Lucene In Action 即&lt;&lt;Lucene实战&gt;&gt;的源码

Global site tag (gtag.js) - Google Analytics