全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法.比如用户在n个小说文档中检索某个关键词,那么所有包含该关键词的文档都返回给用户。那么应该从哪里入手去实现一个全文检索系统?相信大家都听说过apache的开源项目lucene,下面就从零开始揭开全文检索的面纱。
1.信息检索整体流程
一次完整的搜索从用户输入要查询的关键词开始,比如想查找lucene的相关学习资料,我们都会Google或百度中输入关键词,比如输入“lucene, 全文检索框架”,之后系统根据用户输入的关键词返回相关信息。一次检索大致可分为四步:
- 第一步:输入关键词
- 第二步:分词技术
这一步利用自然语言处理技术将用户输入的查询语句进行分词,如标准分词会把“lucene, 全文检索框架”分成:lucene | 全 | 文 | 检 | 索 | 框 | 架 | ,空格分词会分成:lucene, | 全文检索框架 | ,二分法会分成:lucene | 全文 | 文检 | 检索 | 索框 | 框架 |,还有简单分词等多种分词方法. - 第三步:关键词检索
提交关键词后在倒排索引库中进行匹配,倒排索引就是关键词key和文档之间的对应关系,就像给文档贴上标签。比如在检索库中含有lucene关键词的有文档1、文档6、文档9,含有全文检索的有文档1,文档6,那么做与运算,同时含有lucene和全文检索的文档就是1和6. - 第四步:
对多个相关文档进行相关度计算、排序,返回给用户检索结果.
2.lucene架构
这张图很清楚的表现了lucene的工作原理:把文件系统、数据库、网页、手工输入的数据都集合起来,结构化、半结构化、非结构化数据整合在一起,建立成索引库。用户提交查询以后通过索引建设到文档,反馈给用户搜索结果.
3.文档、域、词元
文档:文档是lucene索引和搜索的基本单位.比如,一篇小说,一个word文档.
域:文档中的信息,比如小说标题、作者、简介等.
词元:对标题这个域进行分词,可以得到一个或多个词元.
4.词元权重计算
df:term frequency。 term在文档中出现的频率.tf越大,词元越重要.
tf:document frequecy。有多少文档包含此term,df越大词元越不重要.
词元权重计算公式: W(t,d)=tf(t,d)*log(n/df(t))
W(t,d):the weight of the term in document d
tf(t,d):the frequency of term t in document d
n:the number of documents
df(t):the number of documents that contain term t
5.余弦相似性
我们知道,两个向量的夹角越小,向量越相似,夹角为0时余弦值为1,方向相反时余弦值为-1.用户的输入通过分词形成用户查询向量V(q)={w1,w2,w3…wn},文档的多个词元构成文档向量D。通过计算文档向量和用户查询向量的相似性返回前N个最相似的给用户.