Lucene 是最初是由 Douglass R. Cutting 博士发布在自己主页上
![](/icons/55457de.gif)
![](/icons/55457yi.gif)
个 Java 全文信息检索工具包
![](/icons/55457dou.gif)
后来成为 Apache Jakarta 家族中
![](/icons/55457de.gif)
![](/icons/55457yi.gif)
个开源项目
![](/icons/55457dou.gif)
目前已经成为 Apache 基金会
![](/icons/55457de.gif)
顶级项目
![](/icons/55457dou2.gif)
索引是现代搜索引擎
![](/icons/55457de.gif)
核心
![](/icons/55457dou.gif)
建立索引
![](/icons/55457de.gif)
过程就是把源数据处理成方便查询
![](/icons/55457de.gif)
索引文件
![](/icons/55457de.gif)
过程
![](/icons/55457dou2.gif)
Lucene 采用
![](/icons/55457de.gif)
是
![](/icons/55457yi.gif)
种被称为倒排索引 (Inverted Index)
![](/icons/55457de.gif)
机制
![](/icons/55457dou.gif)
倒排索引也是大多现代搜索引擎
![](/icons/55457de.gif)
基础
![](/icons/55457dou2.gif)
Payload (元数据) 诞生于 Lucene
![](/icons/55457de.gif)
2.2 版本
![](/icons/55457dou.gif)
它是在 Lucene 2.1 索引文件格式
![](/icons/55457de.gif)
基础上扩展而来
![](/icons/55457dou.gif)
提供了
![](/icons/55457yi.gif)
种可以灵活配置
![](/icons/55457de.gif)
高级索引技术
![](/icons/55457dou2.gif)
本文重点研究了 Payload
![](/icons/55457de.gif)
实现原理、索引结构
![](/icons/55457de.gif)
变化、接口 API
![](/icons/55457dou.gif)
在本文
![](/icons/55457de.gif)
最后举例介绍说明了 Payload 是如何帮助改善搜索体验
![](/icons/55457de.gif)
![](/icons/55457dou2.gif)
Payload
![](/icons/55457de.gif)
出现
倒排索引就是说我们维护了
![](/icons/55457yi.gif)
个词条表
![](/icons/55457dou.gif)
对于这个表中
![](/icons/55457de.gif)
每个词条
![](/icons/55457dou.gif)
都有
![](/icons/55457yi.gif)
个链表描述了有哪些文档包含了这个词条
![](/icons/55457dou2.gif)
假定我们有 3篇文档 D0
![](/icons/55457dou.gif)
D1
![](/icons/55457dou.gif)
D2:
D0 = "it is what it is"
D1 = "what is it"
D2 = "it is a banana"
那么
![](/icons/55457dou.gif)
我们可以创建如下倒排索引结构:
Term Posting-list
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
![](/icons/55457yi.gif)
般情况下
![](/icons/55457dou.gif)
将
![](/icons/55457yi.gif)
个词条所索引
![](/icons/55457de.gif)
文档(
![](/icons/55457yi.gif)
般用文档编号表示)称的为 Posting
![](/icons/55457dou.gif)
那么
![](/icons/55457yi.gif)
个词条索引
![](/icons/55457de.gif)
多个文档就称的为 Posting-list
![](/icons/55457dou2.gif)
除了在 Posting-list 中记录文档编号
![](/icons/55457dou.gif)
Lucene 也在Posting-list 中添加了词频和位置信息
![](/icons/55457dou2.gif)
词频
![](/icons/55457de.gif)
添加有助于结果
![](/icons/55457de.gif)
排序
![](/icons/55457dou.gif)
位置信息
![](/icons/55457de.gif)
添加解决了短语检索
![](/icons/55457de.gif)
问题
![](/icons/55457dou2.gif)
在Lucene 2.1 中
![](/icons/55457dou.gif)
记录位置信息
![](/icons/55457de.gif)
即 .prx 文件
![](/icons/55457dou.gif)
它
![](/icons/55457de.gif)
格式如下:
ProxFile (.prx) --> <TermPositions> TermCount
TermPositions --> <Positions> DocFreq
Positions --> <PositionDelta> Freq
PositionDelta --> VInt
仔细观察我们可以发现
![](/icons/55457dou.gif)
文档 D0 中 what 词条是加粗显示而文档 D1 中
![](/icons/55457de.gif)
what 则没有
![](/icons/55457dou2.gif)
显然
![](/icons/55457dou.gif)
Lucene 2.1
![](/icons/55457de.gif)
索引结构是无法表示出两者
![](/icons/55457de.gif)
差异
![](/icons/55457dou2.gif)
为了解决这个问题
![](/icons/55457dou.gif)
从 Lucene2.2 开始
![](/icons/55457dou.gif)
引入了 Payload
![](/icons/55457de.gif)
概念
![](/icons/55457dou2.gif)
Payload 即词条 (Term)
![](/icons/55457de.gif)
元数据或称载荷
![](/icons/55457dou.gif)
Lucene 支持用户在索引
![](/icons/55457de.gif)
过程中将词条
![](/icons/55457de.gif)
元数据添加
![](/icons/55457de.gif)
索引库中
![](/icons/55457dou.gif)
同时也提供了在检索结果时读取 Payload 信息
![](/icons/55457de.gif)
功能
![](/icons/55457dou2.gif)
Payload
![](/icons/55457de.gif)
诞生为用户提供了
![](/icons/55457yi.gif)
种可灵活配置
![](/icons/55457de.gif)
高级索引技术
![](/icons/55457dou.gif)
为支持更加丰富
![](/icons/55457de.gif)
搜索体验创造了条件
![](/icons/55457dou2.gif)
那么 Lucene 是如何改进索引文件以支持 Payload 功能
![](/icons/55457de.gif)
呢?
索引结构
![](/icons/55457de.gif)
变化
为了更加形象
![](/icons/55457de.gif)
描述改进后
![](/icons/55457de.gif)
索引结构
![](/icons/55457dou.gif)
我们用区别
![](/icons/55457de.gif)
颜色表示出文档 ID
![](/icons/55457dou.gif)
词频
![](/icons/55457dou.gif)
位置和 Payload
![](/icons/55457dou.gif)
如图 1 所示
![](/icons/55457dou.gif)
(U表示下划线
![](/icons/55457dou.gif)
B表示粗体)
图 1:Lucene
![](/icons/55457de.gif)
索引结构
![](http://www.crazycoder.cn/WebFiles/20091/fbc24daf-07de-46ad-85f0-b8f6b5a35fae.g<img src='/icons/55457if.gif' />)
整理总结
Payload 是 Lucene
![](/icons/55457yi.gif)
个允许在索引中为词条储存元数据信息
![](/icons/55457dou2.gif)
希望通过阅读本文
![](/icons/55457dou.gif)
你可以对Payload 功能有
![](/icons/55457yi.gif)
个整体
![](/icons/55457de.gif)
了解
![](/icons/55457dou.gif)
进而可以灵活运用 Payload
![](/icons/55457de.gif)
功能来优化具体
![](/icons/55457de.gif)
应用
延伸阅读
最新评论