Lucene 一: 全文检索的基本原理
内容提要
本文介绍全文检索基本原理:数据分为结构化与非结构化,非结构化数据搜索慢,需先建索引再搜索。索引采用反向索引,保存词典与倒排表,实现一次索引多次使用。创建索引包括分词、语言处理、生成词典与倒排表;搜索时解析查询语句、检索索引、合并文档链表,并用向量空间模型按相关性排序返回结果。
延伸解读
反向索引:从字符串到文档的映射
文章指出,非结构化数据存储的是“文件到字符串”的映射,而搜索需要的是“字符串到文件”的映射,两者相反。反向索引正是保存后者,其结构包含词典和倒排表。词典是字符串集合,每个字符串指向包含它的文档链表(倒排表)。这样,搜索时只需从词典取出相关链表,合并即可找到目标文档,避免了顺序扫描的全量遍历。
一次索引,多次使用:权衡与优势
全文检索需要先建索引,这增加了前期成本,尤其数据量大时索引创建很慢。但文章强调,顺序扫描每次搜索都要全量扫描,而索引只需创建一次,之后搜索直接利用索引,实现“一次索引,多次使用”。因此,对于频繁搜索的大数据量场景,全文检索优势明显;对于小数据量或偶尔搜索,顺序扫描可能更直接。
语言处理:让搜索更智能
索引创建和搜索查询都会经过语言处理组件,包括小写转换、词干提取(stemming)和词形还原(lemmatization)。前者通过缩减规则(如去s、去ing)得到词根,后者通过字典映射(如drove到drive)。这样,搜索“driving”也能匹配包含“drive”的文档,提高了召回率。但不同语言处理方式不同,且可能引入误差,需根据语言特性选择。
相关性排序:向量空间模型与词权重
搜索返回大量结果时,需按相关性排序。文章介绍向量空间模型:将文档和查询表示为词权重向量,通过计算夹角余弦值衡量相似度。词权重由词频(tf)和文档频率(df)决定:tf越高越重要,df越高越不重要。这平衡了词在文档中的重要性与其区分能力。最终,余弦值越大,文档与查询越相关,排序越靠前。
Q&A
全文检索的基本原理是什么?
全文检索的基本原理是将非结构化数据中的一部分信息提取出来,重新组织成具有一定结构的数据(即索引),然后对索引进行搜索,从而加快搜索速度。其核心过程包括索引创建和搜索索引两个阶段。
为什么全文检索要使用反向索引?
因为非结构化数据中存储的是从文件到字符串的映射,而搜索时需要的是从字符串到文件的映射,两者相反。反向索引保存了从字符串到文件的映射,使保存的信息与搜索的信息一致,从而大大提高搜索速度。
创建索引的具体步骤有哪些?
创建索引一般包括:1. 获取原文档;2. 分词组件进行分词,去除标点符号和停词,得到词元;3. 语言处理组件对词元进行小写化、词干提取或词形还原,得到词;4. 索引组件创建字典、排序并合并相同词生成倒排表。
搜索时如何对结果进行相关性排序?
搜索时,将查询语句视为一个短文档,计算每个词在文档中的权重(考虑词频tf和文档频率df),然后使用向量空间模型,将文档和查询表示为向量,通过计算向量夹角的余弦值来评估相关性,余弦值越大相关性越高,排序越靠前。
全文检索相比顺序扫描有什么优势?
全文检索通过先建立索引,使得搜索时无需扫描所有文档,只需搜索索引即可。虽然创建索引需要一次性的开销,但之后可以多次重复使用,实现“一次索引,多次使用”,尤其在大数据量下能显著提高搜索速度。
语言处理组件在索引和搜索过程中起什么作用?
语言处理组件对词元进行同语言相关的处理,如变为小写、词干提取(stemming)和词形还原(lemmatization),将单词转换为词根形式。这样在搜索时,输入的不同形态的词(如drove、driving)都能被归一化,从而检索到包含其词根的文档。