一.如何对索引进行搜索
搜索主要分为以下几步:
第一步:用户输入查询语句
举个例子,用户输入语句:lucene AND learned NOT Hadoop
第二步:对查询语句进行词法分析,语法分析,及语言处理
词法分析主要用来识别单词和关键字。
如上述例子中,经过词法分析,得到单词有lucene,learned,hadoop, 关键字有AND, NOT。
如果在词法分析中发现不合法的关键字,则会出现错误。如lucene AMD learned,其中由于AND拼错,导致AMD作为一个普通的单词参与查询。
** 语法分析主要是根据查询语句的语法规则来形成一棵语法树**
如上述例子,lucene AND learned NOT hadoop形成的语法树如下:
** 语言处理同索引过程中的语言处理几乎相同**
如learned变成learn等。
经过第二步,我们得到一棵经过语言处理的语法树
第三步:搜索索引,得到符合语法树的文档
首先,在反向索引表中,分别找出包含lucene,learn,hadoop的文档链表。
其次,对包含lucene,learn的链表进行合并操作,得到既包含lucene又包含learn的文档链表。
然后,将此链表与hadoop的文档链表进行差操作,去除包含hadoop的文档,从而得到既包含lucene又包含learn而且不包含hadoop的文档链表。
此文档链表就是我们要找的文档
第四步:根据得到的文档和查询语句的相关性,对结果进行排序
**二.如何判断文档之间的关系 **
首先,一个文档有很多词(Term)组成 ,如search, lucene, full-text, this, a, what等。
其次对于文档之间的关系,不同的Term重要性不同 ,比如对于本篇文档,search, Lucene, full-text就相对重要一些,this, a , what可能相对不重要一些。所以如果两篇文档都包含search, Lucene,fulltext,这两篇文档的相关性好一些,然而就算一篇文档包含this, a, what,另一篇文档不包含this, a, what,也不能影响两篇文档的相关性。
因而判断文档之间的关系,首先找出哪些词(Term)对文档之间的关系最重要,如search, Lucene, fulltext。然后判断这些词(Term)之间的关系。
找出词(Term) 对文档的重要性的过程称为计算词的权重(Term weight) 的过程。
计算词的权重(term weight)有两个参数,第一个是词(Term),第二个是文档(Document)。
词的权重(Term weight)表示此词(Term)在此文档中的重要程度,越重要的词(Term)有越大的权重(Term weight),因而在计算文档之间的相关性中将发挥更大的作用。
判断词(Term) 之间的关系从而得到文档相关性的过程应用一种叫做向量空间模型的算法(Vector Space Model)
- 计算权重(Term weight)的过程。
影响一个词(Term)在一篇文档中的重要性主要有两个因素:
Term Frequency (tf):即此Term在此文档中出现了多少次。tf 越大说明越重要。
Document Frequency (df):即有多少文档包含次Term。df 越大说明越不重要。
- 判断Term之间的关系从而得到文档相关性的过程,也即向量空间模型的算法(VSM)。
我们把文档看作一系列词(Term),每一个词(Term)都有一个权重(Term weight),不同的词(Term)根据自己在文档中的权重来影响文档相关性的打分计算。
三.总结
- 索引过程:
-
有一系列被索引文件
-
被索引文件经过语法分析和语言处理形成一系列词(Term) 。
-
经过索引创建形成词典和反向索引表。
-
通过索引存储将索引写入硬盘。
- 搜索过程:
a) 用户输入查询语句。
b) 对查询语句经过语法分析和语言分析得到一系列词(Term) 。
c) 通过语法分析得到一个查询树。
d) 通过索引存储将索引读入到内存。
e) 利用查询树搜索索引,从而得到每个词(Term) 的文档链表,对文档链表进行交,差,并得到结果文档。
f) 将搜索到的结果文档对查询的相关性进行排序。
g) 返回查询结果给用户