lucene是一个高性能的全文搜索工具, 使用反向索引结构。 下面将介绍lucene结构与算法.
例子:
有两篇文章:
文章 1 : Tom lives in Guangzhou, I live in Guangzhou too.
文章 2 : He once lived in Shanghai.
1)
既然lucene是使用关键字索引和查询, 我们会采用下面的步骤处理这些关键字
A. 先要逐字识别出文章的字, 英文通常是用空格分割的。中文两个字却是在一起的。
B. 英文文章中的"in, 'once', 'too'没有什么实际的意义, 中文文章的"和", “是”也没什么意义, 也要根据语境去过滤掉
C.大小写会当成同一个字, 比如"He","he"
D. 单复数, 过去式也要简化成原型。 比如"lives"=>"live", "lived"=>live,
E.文章标点要能通过路lucene的分词器过滤掉
根据上面的处理:
文章 1 中的关键字: [tom] [live] [guangzhou] [i] [live] [guangzhou]
文章 2 中的关键字: [he] [live] [shanghai]
2)
根据这些关键字, 我们可以建立反射索引。 正向的索引是 “文章”里包含“所有的关键字”。 反向索引是指反转这种关系,变成“关键字” 在“所有包含这个关键字”。 这两篇文章反向索引之后,
关键字 文章
Guangzhou 1
He 2
I 1
Live 1,2
Shanghai 2
Tom 1
我们仅仅知道关键字在哪一些文章之中还是不够的, 我们还需要知道关键字在文章的频率和位置, 通常这里有两个位置:
a) 字符位置
b)关键字位置
添加文章的频率和位置后, 我们的索引变为:
Key words | the article appeared | frequency | position |
Guangzhou | 1 | 2 | 3,6 |
He | 2 | 1 | 1 |
I | 1 | 1 | 4 |
Live | 1 | [2] | 2 |
Shanghai | 2 | 1 | 3 |
Tom | 1 | 1 | 1 |
live 还有一个位置是2,5,2
Lucene的索引结构是最核心部分。 我们可以看到关键字是按字母排序的,lucene的二分法查找能很快找到关键的位置。
从上可以看出一个索引由三部分组成 document (Term Dictionary), frequency document (frequencies), the position paper (positions)。索引中不仅只有关键字, 还有频率, 位置。一些指导信息可以能过关键字和位置找到。