转载请注明出处:[http://blog.csdn.net/xiaojimanman/article/details/42818185](http://blog.csdn.net/xiaojimanman/article/details/42818185)
通过前一篇博客,对所以也许有了一个大致的了解,知道检索是一个怎样的过程,这篇博客就简单的介绍一下lucene实现的数学模型。
前面我们已经提到lucene实现的索引是一种反向索引,有词典和倒排表组成(实际的结构要比这个复杂很多),那索引的数学模型又是怎样的呢?在开始这个之前,还是先熟悉下几个名词。
**文档(Document)**:[上篇博客中](http://blog.csdn.net/xiaojimanman/article/details/42804713)的索引创建过程中列举的几个事例,每一句话都可以看成一个文档,当然该文档只有一个**域(Field)**,通过标准分词技术,我们将这个域的值分成了很多的**词元(Term)**,文档、域、词元这三个就是我们需要理解的三个名词。(这里自己想一下我们这次的案例 小说信息中,哪些是文档、域和词元?)
**计算权重(Term Weight)过程**
从上面的介绍可知,一个文档可以分成多个词元(不同的分词技术,分成不同的词元),不同的词元对于文档的重要程度也是不同的。影响一个词元在一篇文档中的重要性主要有下面两个因素:
1、Term Frequency(tf) :即此Term在此文档中出现的次数,tf越大,说明该词元越重要;
2、Document Frequency(df) :即有多少文档包含此Term,df越大,说明该词元越不重要。
上面这两个因素对权重的影响也很好理解,这就好比我们自己的技能一样,掌握很深的技能对自己工作的重要程度要大于那些一般的技能,当然,如果某项技能只有你自己或者少数几个人了解,那你在这方面就有很大的竞争力(好像又扯远了)。那我们来看一下公式:
![](https://box.kancloud.cn/2016-02-22_56ca7becc4ac6.jpg)
当然这只是一个简单典型的计算公式,lucene在实际的实现过程中就与此少有不同。
**空间向量模型(VSM)**
我们可以把一篇文档看作是一系列词元的集合,每个词元都有一个权重,如下:
~~~
Document = {term1, term2, term3 …… termN}
DocumentVector = {weight1, weight2, weight3 …… weightN}
~~~
我们把所以的文档放到一个N维的空间向量中(所有文档分成N个词元,就N维向量;其中文档D在m坐标上的映射为文档D中的m词元的权重),如图:
![](https://box.kancloud.cn/2016-02-22_56ca7becdd6f4.jpg)
这样我们再计算两个文档相关程度的时候,就可以看他们之间的夹角大小即可(夹角越小,相关程度越高,否则相关程度越低)。当然该N维向量也可以用于用户的检索。
**检索索引**
在这个数学模型中,对文档信息的检索,就转化为求两个向量之间的夹角大小,当然,我们也需要对用户的搜索关键词进行分词创建空间向量,如下图:
![](https://box.kancloud.cn/2016-02-22_56ca7bed04940.jpg)
从上图中,我们可以认为两个向量之间的夹角越小,相关性越大,否则相关性越小,因此我们计算夹角的余弦值作为两者的相关性。这样我们通过计算查询向量与每一个向量的夹角余弦值就可得到该查询字符串与索引中的记录的相关度,然后对其排序即可得到最终的结果。
下一篇再介绍一下lucene的文件结构就不再介绍lucene的基本原理了,后面就简单的介绍一下案例中可能用到的API。所以如果想详细的了解lucene的原理,请参照网上其他学习资料或者相关的资料书。
ps:时间不早了,明天再继续写文件结构部分。
- 前言
- 写在开始之前
- lucene初始认知
- 索引数学模型
- 索引文件结构
- 创建索引
- 搜索索引
- 分词器介绍
- Query查询
- IndexSearcher中检索方法
- 更新说明
- 案例初识
- JsonUtil & XmlUtil
- 基ClassUtil & CharsetUtil
- ParseUtil & ParseRequest
- 数据库连接池
- 实现实时索引基本原理
- 实时索引管理类IndexManager
- 实时索引的检索
- 实时索引的修改
- 查询语句创建PackQuery
- 纵横小说更新列表页抓取
- 纵横小说简介页采集
- 纵横小说章节列表采集
- 纵横小说阅读页采集
- 纵横小说数据库设计
- 纵横小说数据库操作
- 纵横小说分布式采集