全文检索技术是信息检索技术的一种,主要是用户的查询请求和全文中的每一个词进行比较,不考虑查询请求和文档的语法上的匹配,在信息检索工具中,全文检索技术是最通用的和实用的。简单的说先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text  Search)

我们把每次从结构化和非结构化的数据中提取出来的信息然后重写组合成信息,这部分信息叫索引

建立索引一般使用倒排索引技术,每次先把文档生产索引数据,查询时使用相同的分词效果使用同一个分词器进行分词

由于更新单个文档,工作量很大,我们使用先删除再插入文档建立索引。将文档中的常用的语气词什么的‘的’、‘和’这样一类词设置在停用字典中不对他进行生产,在搜索时也能加快搜索速度。

lucene 的官网: http://lucene.apache.org/core/index.html

这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。

在这里我们使用的是反向索引从字符串到文件,字符组成的字符串和每个字符指向一个倒排索引列的文档,共同组成了字典

创建索引的过程:将文档分成一个个单词,去除标点符号,去除停用词,经过分词(Tokenizer)后得到词元(Token)

将词元转换为语言处理组件主要是对得到的词元(Token)做一些语言相关的处理

1.变为小写

2. 将单词缩减为词根形式,如“cars ”到“car ”等。这种操作称为:stemming 。

3. 将单词转变为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization 。

找出词对文档的重要过程称为计算词的权重过程

计算词的权重(term weight)有两个参数,第一个是词(Term),第二个是文档(Document)。

词的权重(Term weight)表示此词(Term)在此文档中的重要程度,越重要的词(Term)有越大的权重(Term weight),因而在计算文档之间的相关性中将发挥更大的作用

判断词之间的关系从而得到文档相关性的过程应用一种叫做向量空间模型的算法(Vector Space Model)

计算权重:Term frequency:表明term在文档中出现了多少次tf越大越重要,document  Frquency 表示多少个文档出现过这个term,df越大越不重要

权重=tf×log(n/df)  -----------------------------n为在所有文档中这个词出现的总的次数

这只是term的权重计算

 

这仅仅只term weight计算公式的简单典型实现。实现全文检索系统的人会有自己的实现,Lucene就与此稍有不同。

2. 判断Term之间的关系从而得到文档相关性的过程,也即向量空间模型的算法(VSM)。

我们把文档看作一系列词(Term),每一个词(Term)都有一个权重(Term weight),不同的词(Term)根据自己在文档中的权重来影响文档相关性的打分计算。

于是我们把所有此文档中词(term)的权重(term weight) 看作一个向量。

Document = {term1, term2, …… ,term N}
Document Vector = {weight1, weight2, …… ,weight N}
同样我们把查询语句看作一个简单的文档,也用向量来表示。
Query = {term1, term 2, …… , term N}
Query Vector = {weight1, weight2, …… , weight N}

我们把所有搜索出的文档向量及查询向量放到一个N维空间中,每个词(term)是一维。

如图:

 

我们认为两个向量之间的夹角越小,相关性越大。

所以我们计算夹角的余弦值作为相关性的打分,夹角越小,余弦值越大,打分越高,相关性越大。

有人可能会问,查询语句一般是很短的,包含的词(Term)是很少的,因而查询向量的维数很小,而文档很长,包含词(Term)很多,文档向量维数很大。你的图中两者维数怎么都是N呢?

在这里,既然要放到相同的向量空间,自然维数是相同的,不同时,取二者的并集,如果不含某个词(Term)时,则权重(Term Weight)为0。

 

相关性打分公式如下:

 

举个例子,查询语句有11个Term,共有三篇文档搜索出来。其中各自的权重(Term weight),如下表格。

 

t1

t2

t3

t4

t5

t6

t7

t8

t9

t10

t11

D1

0

0

.477

0

.477

.176

0

0

0

.176

0

D2

0

.176

0

.477

0

0

0

0

.954

0

.176

D3

0

.176

0

0

0

.176

0

0

0

.176

.176

Q

0

0

0

0

0

.176

0

0

.477

0

.176

于是计算,三篇文档同查询语句的相关性打分分别为:

 

于是文档二相关性最高,先返回,其次是文档一,最后是文档三。

到此为止,我们可以找到我们最想要的文档了。

说了这么多,其实还没有进入到Lucene,而仅仅是信息检索技术(Information retrieval)中的基本理论,然而当我们看过Lucene后我们会发现,Lucene是对这种基本理论的一种基本的的实践。所以在以后分析Lucene的文章中,会常常看到以上理论在Lucene中的应用。

在进入Lucene之前,对上述索引创建和搜索过程所一个总结,如图:

此图参照http://www.lucene.com.cn/about.htm 中文章《开放源代码的全文检索引擎Lucene》

1. 索引过程:

1) 有一系列被索引文件

2) 被索引文件经过语法分析和语言处理形成一系列词(Term) 。

3) 经过索引创建形成词典和反向索引表。

4) 通过索引存储将索引写入硬盘。

2. 搜索过程:

a) 用户输入查询语句。

b) 对查询语句经过语法分析和语言分析得到一系列词(Term) 。

c) 通过语法分析得到一个查询树。

d) 通过索引存储将索引读入到内存。

e) 利用查询树搜索索引,从而得到每个词(Term) 的文档链表,对文档链表进行交,差,并得到结果文档。

f) 将搜索到的结果文档对查询的相关性进行排序。

g) 返回查询结果给用户