lucene 反向索引原理

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)。索引中不仅只有关键字, 还有频率, 位置。一些指导信息可以能过关键字和位置找到。

猜你喜欢

转载自laravel.iteye.com/blog/1601405