lucene原理学习笔记(二)

上一篇文章介绍了Lucene的索引结果以及建立索引的步骤,这篇文章就介绍一下如何搜索索引。

第一步,用户输入查询语句。

第二步,对查询语句进行词法分析、语法分析以及语言处理。

1、词法分析主要用来识别单词和关键字。

2、语法分析主要根据查询语句的语法规则来形成一棵语法树。

3、语言处理同索引过程中的语言处理几乎一致,比如词根的处理。

第三步,搜索索引,得到符合语法树的文档。

第四步,计算得到的文档和查询之间的相关性,对查询结果进行排序。

如何来计算文档和查询之间的相关性呢?在此做一个假设,我们将查询看作是一个很短小的文档,这样就变成计算文档和文档之间的相关性了,计算出来的分数越高就说明越相关,排序就越靠前。

那么如何计算文档和文档之间的相关性呢?进过分析可以发现,文档是由很多词(Term)组成的,如lucene、solr、search等,进一步分析还可以发现不同的词对文档的重要性是不一样的,比如对一个文档solr和search在这个文档中是很重要的,但是this、what和a则显得不那么重要。所以对于两篇文档来说如果同时包含solr和search则说明这两篇文档相关性比较高,即使文档中不包含this、what也不会影响到文档的相关性。

因此计算文档的相关性,首先要找出那些词对文档之间的关系比较重要,比如solr和search,然后计算词之间的关系,找出词重要性的过程可以称为计算词在文档中的权重。

计算词的权重,有两个参数,第一个是词(Term),第二个是文档(Document)。词的权重代表词在文档中的重要程度,权重越大,越能影响文档之间的相关性。判断词之间的相关性从而得出文档之间的相关性,有一种方法叫做向量空间模型(Vector Space Model)。

下面就分析一下计算词的权重的过程,

影响一个词在文档中重要性的主要因素有两个。

1:词频,即词出现在文档中的次数,数值越大说明重要性越大。

2:文档频率,即有多少个文档包含此词,这个数值越大说明词的重要性越小,因为这样就无法区分不同的文档了,因此重要性就很低。

计算权重的公式如下图

上面的公式只是计算词的权重的典型实现,不同的搜索引擎可以有不同的实现。

通过上面计算出来的词的权重,计算词之间的关系从而得出文档的相关性,也就是应用空间向量模型方法。

把文档分解成是由多个词组成的,不同词的权重在所在文档中计算,由此我们可以把词的权重看作是向量。

Document={term1,term2,...,termn}

Document Vector={weight1,weight2,...,weightn}

同样的道理我们可以把用户的查询语句看作是向量

Query={term1,term2,...,termn}

Query Vector={weight1,weight2,...,weightn}

然后把搜索出来的文档向量和查询向量放到一个N维空间中,每一个词是一个向量,如下图所示

在这里我们认为向量之间的夹角越小,相关性越大。我们用夹角之间的余弦值计算向量之间的相关性,余弦值越大,夹角越小,相关性越大。计算余弦值得公式如下图

通过计算出来的余弦值进行排序,查询出来的文档就可以按相关性显示出来了,越在前面说明相关性越大。

时间: 2024-12-28 16:12:04

lucene原理学习笔记(二)的相关文章

lucene原理学习笔记(一)

最近在学习lucene原理方面的知识,将学习中学到的知识和问题记录下来,今天学习的主要内容就是关于索引方面的内容.我们知道lucene是实现全文检索的工具包,要在工程里面加入搜索的功能还需要基于lucene的api进行开发.那么全文检索的步骤分为哪几步呢.全文检索大体上分为两个步骤,索引的创建和搜索索引.于是乎全文检索就涉及到如下几个问题: 1.如何创建索引.2.如果搜索索引.3.索引里面存储的信息都有什么. 索引里面存储的都有什么信息呢,可以用一下的例子来说明,一个文件包含多个字符,当要查询一

lucene学习笔记(二)

package index; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIn

马哥学习笔记二十二——高可用集群原理

HA Resource:资源 FailOver:故障转移 FailBack:故障转回 资源粘性:资源是否倾向于留在当前节点 Messaging Layer:集群服务信息层,基于UDP互相传递心跳信息,集群事务信息等 heartbeat(v1,v2,v3) heartbeat v3:heartbeat,pacemaker,cluster-glue corosync cman keepalived ultramonkey CRM:(cluster resource manager)集群资源管理器,统

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

Python学习笔记<二>:列表、元组、字典

1 列表和元组 可以将列表和元组当成普通的"数组",它能保存任意数量任意类型的Python 对象.和数组一样,通过从0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象. 列表和元组有几处重要的区别.列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变.元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以).元组可以看成是只读的列表.通过切片运算( [ ] 和 [ : ] )可以得到子集,这一点与字符串的使用方法一样. 举例如下: >>>

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己