首页 > 编程语言 >Lucene默认的打分算法——ES默认

Lucene默认的打分算法——ES默认

时间:2023-05-31 16:04:03浏览次数:33  
标签:语句 模型 默认 查询 Lucene 文档 打分 ES

改变Lucene的打分模型

随着Apache Lucene 4.0版本在2012年的发布,这款伟大的全文检索工具包终于允许用户修改默认的基于TF/IDF原理的打分算法。Lucene API变得更加容易修改和扩展打分公式。但是,对于文档的打分计算,Lucene并只是允许用户在打分公式上修修补补,Lucene 4.0推出了更多的打分模型,从根本上改变了文档的打分公式,允许用户使用不同的打分公式来计算文档的得分。在本节,我们将深入了解Lucene 4.0的新特性,以及这些特性如何融入ElasticSearch。

可用的相似度模型

前面已经提到,除了Apache Lucene 4.0以前版本中原来支持的默认相似度模型,TF/IDF模型同样支持。该模型在 第2章 强大的用户查询语言DSLLucene 默认打分算法一节中已经详细论述了。

新引入了三种相似度模型:

  • Okapi BM25:这是一种基于概率模型的相似度模型,对于给定的查询语句,该模型会估计每个文档与查询语句匹配的概率。为了在ElasticSearch中使用 该相似度模型,用户需要使用模型的名称,BM25。据说,Okapi BM25相似度模型最适合处理短文本,即关键词的重复次数对整个文档得分影响比较大的文本。
  • Divergence from randomness:这是一种基于同名概率模型的相似度模型。想要在ElasticSearch使用该模型,就要用到名称,DFR。据说该相似度模型适用于自然语言类的文本。
  • Information based:这是最后一个新引入的相似度模型,它与Diveragence from randomness模型非常相似。想要在ElasticSearch使用该模型,就要用到名称,IB。与DFR相似度模型类似,据说该模型也适用于自然 语言类的文本。

Lucene默认的打分算法

当谈论到查询的相关性,很重要的一件事就是对于给定的查询语句,如何计算文档得分。首先要弄清楚的是文档得分是什么。文档得分是一个用来描述查询语句和文档之间匹配程度的变量。在本节,我们将学习Lucene默认的打分机制:TF/IDF(term frequency/inverse document frequecy)算法,以及它是如何对相关文档进行打分排序。理解默认的打分算法对设计复杂查询语句来说至关重要,特别是在决定各个查询子句权重的时候。

匹配文档的打分因子

当一个文档出现在了搜索结果中,这就意味着该文档与用户给定的查询语句是相匹配的。Lucene会对匹配成功的文档给定一个分数。至少从 Lucene这个层面,从打分公式的结果来看,分数值越高,代表文档相关性越高。 自然而然,我们可以得出:两个不同的查询语句对同一个文档的打分将会有所不同,但是比较这两个得分是没有意义的。用户需要记住的是:我们不仅要避免去比较 不同查询语句对同一个文档的打分结果,还要避免比较不同查询语句对文档打分结果的最大值。这是因为文档的得分是多个因素共同影响的结果,不仅有权重 (boosts)和查询语句的结构起作用,还有匹配关键词的个数,关键词所在的域,查询归一化因子中用到的匹配类型……。在极端情况下,只是因为我们用了 自定义打分的查询对象或者由于倒排索引中词的动态变化,相似的查询表达式对于同一个文档都会产生截然不同的打分。

暂时还是先回来继续探讨打分机制。为了计算出一个文档的得分,我们必须考虑如下的因素:

  • 文档权重(Document boost):在索引时给某个文档设置的权重值。
  • 域权重(Field boost):在查询的时候给某个域设置的权重值。
  • 调整因子(Coord):基于文档中包含查询关键词个数计算出来的调整因子。一般而言,如果一个文档中相比其它的文档出现了更多的查询关键词,那么其值越大。
  • 逆文档频率(Inerse document frequency):基于Term的一个因子,存在的意义是告诉打分公式一个词的稀有程度。其值越低,词越稀有(这里的值是指单纯的频率,即多少个文档中出现了该词;而非指Lucene中idf的计算公式)。打分公式利用这个因子提升包含稀有词文档的权重。
  • 长度归一化(Length norm):基于域的一个归一化因子。其值由给定域中Term的个数决定(在索引文档的时候已经计算出来了,并且存储到了索引中)。域越的文本越长,因子的权重越低。这表明Lucene打分公式偏向于域包含Term少的文档。
  • 词频(Term frequency):基于Term的一个因子。用来描述给定Term在一个文档中出现的次数,词频越大,文档的得分越大。
  • 查询归一化因子(Query norm):基于查询语句的归一化因子。其值为查询语句中每一个查询词权重的平方和。查询归一化因子使得比较不同查询语句的得分变得可行,当然比较不同查询语句得分并不总是那么易于实现和可行的。

 

TF/IDF打分公式

接下来看看打分公式的庐山真面目。如果只是为了调整查询语句之间的关联关系,用户不必去理解它的原理。但是至少要知道它是如何工作的。

Lucene概念上的打分公式

 

TF/IDF公式的概念版是下面这个样子的:

 

 

上面的公式展示了布尔信息检索模型和向量空间信息检索模型的组合。我们暂时不去讨论它,直接见识实际应用的公式,它是在Lucene实现并且正在使用的公式。 

标签:语句,模型,默认,查询,Lucene,文档,打分,ES
From: https://blog.51cto.com/u_11908275/6387740

相关文章

  • 多项式回归模型(Office Prices)
     分析:还是上次的房价预测题目,指明要用多项式回归拟合。在多元多项式拟合时候,目标函数表示如下         对其目标函数求偏导得到         很容易写出代码。代码:#coding:utf-8importmathclassData: def__init__(self): self.x=[] self.y=0.0d......
  • 一个由于不同微服务框架混搭导致BeanPostProcessors处理bean异常导致的问题
        前天到昨天晚上,某开发报告了一个问题,我们的一个应用程序接入了腾讯的TSF微服务框架后,使用feign访问接口,会导致token丢失,无法解决。    大体介绍下项目情况,我们的应用使用了某第三方微服务框架,不是源生的springcloud或springcloudalibaba框架,第三方厂家基于s......
  • 8万多初中作文大全ACCESS\EXCEL数据库
    作文类的数据库虽然已经有很多,有近万条的,也有2万条的,但今天弄到了小学、中学、高中一个系列的数据,而且最主要的是数据的记录数很多。这份初中作文包含80621条记录,分类也很好。grade字段统计:初一(27301)、初二(27600)、初三(23686)、中考(2034)。type字段统计:小说(8990)、散文诗歌(8985)、写......
  • k8s强制删除namesapce
    背景在删除namespace时,其状态一直为Terminating 解决方法:删除 finalizers获取待删除namespace的信息kubectlgetnspro-ojson>test.json删除其中的 finalizers部分vitest.json"spec":{"finalizers":["kubernetes"]......
  • bat脚本在C:\Program Files (x86)使用普通权限运行与使用管理员权限运行获取当前路径
    bat脚本在C:\ProgramFiles(x86)使用管理员权限运行获取当前路径不对。bat脚本如下:@echooffset"current_dir=%cd%"echoCurrentdirectory:%current_dir%set"filepath=%current_dir%\1.txt"setlocalenabledelayedexpansionifexist"%filepath%"(......
  • Intel Media SDK and Intel® oneAPI Video Processing Library (oneVPL)
    TheIntelMediaSoftwareDevelopmentKit(IntelMediaSDK)isacross-platformapplicationprogramminginterface(API)fordevelopingmediaapplicationsonWindowsandLinux. Itismainlyusedforhardware-acceleratedvideoencoding,decoding,andprocess......
  • ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync
    EStransportclient底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,EStransportclient可以同步调用也可以异步(不过底层的socket必然是异步实现)。发送端例子对于javaclient的数据发送(这里以bulk为例),写过的人都知......
  • sklearn的train_test_split,果然很好用啊!
    sklearn的train_test_split train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。格式:X_train,X_test,y_train,y_test=cross_validation.train_test_split(train_data,train_target,test_size=0.3,random_state=0)......
  • bitsandbytes通过源码安装后调用报错AttributeError: module 'bitsandbytes.nn' has n
    通过github下载的源码使用pipinstall-e.方式安装的时候会出现题目中的问题。这个时候先卸载掉bitsandbytes,然后重新使用pipinstallbitsandbytes安装,这种方式直接从仓库中安装,问题就解决了。目前尚不清楚问题出现原因,虽然两种方式的安装版本都是0.38.1......
  • uniapp onShareAppMessage里面请求后调分享(微信小程序)
    onShareAppMessage(){constpromise=newPromise(resolve=>{request({api:'请求名',method:'POST',data:{"data":{}}}).then(res=>{resolve({......