基于lucene的案例开发:索引数学模型

标签: lucene 开发 索引 | 发表时间:2015-01-18 08:13 | 作者:xiaojimanman
出处:http://blog.csdn.net

转载请注明出处: http://blog.csdn.net/xiaojimanman/article/details/42818185

      通过前一篇博客,对所以也许有了一个大致的了解,知道检索是一个怎样的过程,这篇博客就简单的介绍一下lucene实现的数学模型。

      前面我们已经提到lucene实现的索引是一种反向索引,有词典和倒排表组成(实际的结构要比这个复杂很多),那索引的数学模型又是怎样的呢?在开始这个之前,还是先熟悉下几个名词。

      文档(Document)上篇博客中的索引创建过程中列举的几个事例,每一句话都可以看成一个文档,当然该文档只有一个 域(Field),通过标准分词技术,我们将这个域的值分成了很多的 词元(Term),文档、域、词元这三个就是我们需要理解的三个名词。(这里自己想一下我们这次的案例 小说信息中,哪些是文档、域和词元?)


计算权重(Term Weight)过程 

      从上面的介绍可知,一个文档可以分成多个词元(不同的分词技术,分成不同的词元),不同的词元对于文档的重要程度也是不同的。影响一个词元在一篇文档中的重要性主要有下面两个因素:

1、Term Frequency(tf) :即此Term在此文档中出现的次数,tf越大,说明该词元越重要;

2、Document Frequency(df) :即有多少文档包含此Term,df越大,说明该词元越不重要。

      上面这两个因素对权重的影响也很好理解,这就好比我们自己的技能一样,掌握很深的技能对自己工作的重要程度要大于那些一般的技能,当然,如果某项技能只有你自己或者少数几个人了解,那你在这方面就有很大的竞争力(好像又扯远了)。那我们来看一下公式:


当然这只是一个简单典型的计算公式,lucene在实际的实现过程中就与此少有不同。


空间向量模型(VSM)

      我们可以把一篇文档看作是一系列词元的集合,每个词元都有一个权重,如下:

Document = {term1, term2, term3 …… termN}

DocumentVector = {weight1, weight2, weight3 …… weightN}

      我们把所以的文档放到一个N维的空间向量中(所有文档分成N个词元,就N维向量;其中文档D在m坐标上的映射为文档D中的m词元的权重),如图:


      这样我们再计算两个文档相关程度的时候,就可以看他们之间的夹角大小即可(夹角越小,相关程度越高,否则相关程度越低)。当然该N维向量也可以用于用户的检索。


检索索引

     在这个数学模型中,对文档信息的检索,就转化为求两个向量之间的夹角大小,当然,我们也需要对用户的搜索关键词进行分词创建空间向量,如下图:


      从上图中,我们可以认为两个向量之间的夹角越小,相关性越大,否则相关性越小,因此我们计算夹角的余弦值作为两者的相关性。这样我们通过计算查询向量与每一个向量的夹角余弦值就可得到该查询字符串与索引中的记录的相关度,然后对其排序即可得到最终的结果。


      下一篇再介绍一下lucene的文件结构就不再介绍lucene的基本原理了,后面就简单的介绍一下案例中可能用到的API。所以如果想详细的了解lucene的原理,请参照网上其他学习资料或者相关的资料书。


ps:时间不早了,明天再继续写文件结构部分。

作者:xiaojimanman 发表于2015-1-18 0:13:15 原文链接
阅读:128 评论:0 查看评论

相关 [lucene 开发 索引] 推荐:

基于lucene的案例开发:索引数学模型

- - CSDN博客编程语言推荐文章
转载请注明出处: http://blog.csdn.net/xiaojimanman/article/details/42818185.       通过前一篇博客,对所以也许有了一个大致的了解,知道检索是一个怎样的过程,这篇博客就简单的介绍一下lucene实现的数学模型.       前面我们已经提到lucene实现的索引是一种反向索引,有词典和倒排表组成(实际的结构要比这个复杂很多),那索引的数学模型又是怎样的呢.

有关Lucene的问题(7):用Lucene构建实时的索引

- -
由于前一章所述的Lucene的事务性,使得Lucene可以增量的添加一个段,我们知道,倒排索引是有一定的格式的,而这个格式一旦写入是非常难以改变的,那么如何能够增量建索引呢. Lucene使用段这个概念解决了这个问题,对于每个已经生成的段,其倒排索引结构不会再改变,而增量添加的文档添加到新的段中,段之间在一定的时刻进行合并,从而形成新的倒排索引结构.

lucene索引创建的理解思路

- - ITeye博客
虽然lucene4很早就出来,但是这里仍然以lucene3.0为基础,理解lucene索引创建的思路:. field的数据,fdx,fdt,依次写每个field的即可. 词向量,tvx,tvd,tvf. tvf是真正存储的地方,tvx是每个文档一项,具体包含第一个field的位置,其他field只要记录与覅一个field的偏移量即可.

[原]Lucene系列-索引文件

- - 文武天下
本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息. 基于Lucene 4.10.0. 索引(index)包含了存储的文档(document)正排、倒排信息,用于文本搜索. 索引又分为多个段(segments),每个新添加的doc都会存到一个新segment中,不同的segments又会合并成一个segment.

减小lucene索引体积大小

- - sling2007的博客
下文讲述了lucene中,如何优化索引,减小索引体积. 如果需要被搜索的数值类型,需要设置合适的precisionstep. 如果不需要搜索,只要排序即可,那么设置precisionstep为Integer.Max即可. 使用geohash算法,给每个区域编码,把编码切成term并索引,然后用于搜索.

Lucene索引升级 - rainystars' Blog - SegmentFault

- -
由于Lucene文件格式从2到3以及从3到4版本时都发生了重大的改变,造成了高版本无法读取低版本的数据,使用Lucene中的IndexUpgrader方法先将版本从2升到3,然后再从3升级到4. 从版本2升级到版本3时,需要使用lucene3的jar包,我使用的lucene3.6的jar包,我需要处理的索引是在一个文件夹中所存在的一系列索引文件,所以需要循环来遍历每个目录.

[原]基于Lucene多索引进行索引和搜索

- - 千与的专栏
Lucene支持创建多个索引目录,同时存储多个索引. 我们可能担心的问题是,在索引的过程中,分散地存储到多个索引目录中,是否在搜索时能够得到全局的相关度计算得分,其实Lucene的ParallelMultiSearcher和MultiSearcher支持全局得分的计算,也就是说,虽然索引分布在多个索引目录中,在搜索的时候还会将全部的索引数据聚合在一起进行查询匹配和得分计算.

LIRE(Lucene Image Retrieval)相似图像索引和搜索机制

- - CSDN博客云计算推荐文章
众说周知,lucene是一个开源的强大的索引工具,但是它仅限于文本索引. 基于内容的图像检索(CBIR)要求我们利用图像的一些基本特征(如颜色纹理形状以及sift,surf等等)搜索相似的图片,LIRE(Lucene Image Retrieval)是一款基于lucene的图像特征索引工具,它能帮助我们方便的对图像特征建立索引和搜索,作者也在不断加入新的特征供用户使用.

开源搜索引擎评估:lucene sphinx elasticsearch

- - 鲁塔弗的博客
lucene系,java开发,包括 solr和 elasticsearch. sphinx,c++开发,简单高性能. 搜索引擎程序这个名称不妥当,严格说来应该叫做 索引程序(indexing program),早期主要用来做中文全文搜索,但是随着互联网的深入普及,各家网站规模越来越大,索引程序在 优化网站架构上发挥了更大的作用: 替代mysql数据库 内置的索引.

用Lucene构建实时索引的文档更新问题

- - 开源软件 - ITeye博客
1、Lucene删除文档的几种方式. IndexReader.deleteDocument(int docID)是用 IndexReader 按文档号删除. IndexReader.deleteDocuments(Term  term)是用 IndexReader 删除包含此词(Term)的文档. IndexWriter.deleteDocuments(Term  term)是用 IndexWriter 删除包含此词(Term)的文档.