全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法.比如用户在n个小说文档中检索某个关键词,那么所有包含该关键词的文档都返回给用户。那么应该从哪里入手去实现一个全文检索系统?相信大家都听说过apache的开源项目lucene,下面就从零开始揭开全文检索的面纱。
一次完整的搜索从用户输入要查询的关键词开始,比如想查找lucene的相关学习资料,我们都会Google或百度中输入关键词,比如输入“lucene, 全文检索框架”,之后系统根据用户输入的关键词返回相关信息。一次检索大致可分为四步:
这张图很清楚的表现了lucene的工作原理:把文件系统、数据库、网页、手工输入的数据都集合起来,结构化、半结构化、非结构化数据整合在一起,建立成索引库。用户提交查询以后通过索引建设到文档,反馈给用户搜索结果.
文档:文档是lucene索引和搜索的基本单位.比如,一篇小说,一个word文档.
域:文档中的信息,比如小说标题、作者、简介等.
词元:对标题这个域进行分词,可以得到一个或多个词元.
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
我们知道,两个向量的夹角越小,向量越相似,夹角为0时余弦值为1,方向相反时余弦值为-1.用户的输入通过分词形成用户查询向量V(q)={w1,w2,w3…wn},文档的多个词元构成文档向量D。通过计算文档向量和用户查询向量的相似性返回前N个最相似的给用户.