lucene分析与应用:Lucene Payload 的研究和应用

  Lucene 是最初是由 Douglass R. Cutting 博士发布在自己主页上个 Java 全文信息检索工具包后来成为 Apache Jakarta 家族中个开源项目目前已经成为 Apache 基金会顶级项目索引是现代搜索引擎核心建立索引过程就是把源数据处理成方便查询索引文件过程 Lucene 采用种被称为倒排索引 (Inverted Index) 机制倒排索引也是大多现代搜索引擎基础

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

  Payload 出现

  倒排索引就是说我们维护了个词条表对于这个表中每个词条都有个链表描述了有哪些文档包含了这个词条假定我们有 3篇文档 D0D1D2:

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索引结构



  整理总结

  Payload 是 Lucene 个允许在索引中为词条储存元数据信息希望通过阅读本文你可以对Payload 功能有个整体了解进而可以灵活运用 Payload 功能来优化具体应用



Tags:  payloadtype payload lucene应用实例 lucene分析与应用

延伸阅读

最新评论

发表评论