搜索基本构成
搜索的基本定义,可以表述为以下4个步骤:
1) 构建索引:
Indexing,对文件、网站、数据库的记录进行处理以便可以进行搜索,被索引的文件称为文档。
构建索引之前,需要对文档的内容、结构、类型深入了解,这对于构建索引很有必要,对内容不理解,很难构建出优秀的搜索引擎。索引是使得文档可搜索的过程,一般是将文档各部分内容切分成词条(token),词条经过词干还原、不区分大小写等方式进行规范化后成为词项(term)。这个规范化的过程可以是简单的去掉停用词、大小写处理、词干还原,也可以是复杂的同义词扩展。从文档中构建出词项的过程,在Lucence以及更高层的Solr和ElasticSearch中,通过分析器Analyser来完成。
从文档中抽取出来的词项,通常存储在成为倒排索引的数据结构中,以便搜索引擎可以快速查找到。下图是一个简单的倒排索引示例:
左边的单词就是上面说的词项,每个索引种存储出现该词项的文档ID。例如life这个词出现在文档1,2,3中。除了简单地保存词项在哪个问答中出现以外,往往还会保存词项在文档中的重要程度、在文档中的位置等信息。这使得搜索引擎从简单的布尔模型(是否出现在文档中)进化到基于相关度的排序模型,这是很大的进步。
2)用户输入:
用户通过某种形式输入表达其信息需求,这个需求一般都是不完整的。
用户的输入可以是像Google那样很简洁的一个输入框,也可以提供更高级的选项,例如限制结果的时间范围,来源网站等信息。或者提供一套查询语法供高级的用户使用,主流的搜索引擎的支持这类复杂查询。
用户的输入提交到搜索引擎之后,采取与索引过程类似的手段到输入进行处理,例如去掉停用词,根据输入进行同义词扩展等。在具体的实现中,用户的输入最后都形式化为Query对象,例如Lucence提供了各种类型的Query,例如布尔类型、前缀查询等。
3)排名:
搜索引擎根据查询和索引种文档的匹配度(相关度)进行排名。
用户输入与被索引的文档之间的相关度计算,用于对文档进行排名。Google的PageRank非常出名,该算法根据文档被引用(外链)的次数对文档进行排序。向量空间模型(vector space model,VSM)也是很典型的一种模型。
这种模型将文档中出现的词条作为维度,以向量的形式来表示整个文档。例如整个文档库中有100W的词项,那么文档将被表示为100W维的向量。对于特定的一个文档,如果词汇在文档中出现,则对应维度取值为1,否则为0。最终的向量表示是一个很稀疏的高维矩阵。下图是一个简单的例子:
在这种模型下,用户的输入也被建模为一个文档向量,通过计算文档向量之间的相似度,来决定其排名。文档的相似度通过向量的夹角大小来表示,在数学上通过计算cosine值来得到。下图是一个二维的示意图,q代表用户输入的查询,d1和d2表示两个文档。
在Salton等人提出的经典向量空间模型中,词项在文档中的权重由文档本身的参数(局部)和整个文档集的参数(全局&#x