一.简介  

  寻找匹配的文档是构建优质搜索体验的关键步骤,但这仅仅是第一步。大多数用户不愿意通过逐页翻阅搜索结果来找到想要的文档。根据一般经验,仅有10%的用户在网页搜索中有意愿继续翻阅第一页以后的搜索结果,仅有1%的用户会翻看到第三页结果。Solr实现了搜索结果排序,最佳的结果位于列表顶端。它会计算每个文档的相关度得分,并从高到低对搜索解决进行排序。

二.默认相似度

  solr的相似度得分基于Similarity类。这个类被定义为一个预置字段。Similarity是一个Java类,它根据给定的查询定义了搜索结果相关度得分的计算方法,可以自定义。

  

  默认情况下,solr使用lucene相应的DefaultSimilarity类。这个类使用两段检索模型来计算相似度。首先,使用布尔模型过滤出不符合用户查询的所有文档。然后,使用向量空间模型通过计算和绘制将查询条件和命中的文档转化为向量,在此基础上计算相似度得分。每个文档的相似度得分基于查询向量与文档向量的夹角余弦值【余弦相似度】。余弦值为1,表示完美匹配;余弦值为0,表示无相似性。

三.计算算法

  Score(q,d) = ∑(tf(t in d) * idf(t)2 * t.getBoost() * norm(t,d)) * coord(q,d) * queryNorm(q)

        t in q

  详解:

    t = 词项;d = 文档;q = 查询;f = 字段

    tf:词频

      词频指特定词项在待匹配文档中出现的次数,表示了文档与该词项的匹配程度。一般情况下,若主题在文档中出现多次,则被认为该文档与特定主题更相关。但是,某一词项在文档中的出现次数为10,并不意味着该文档的相关度提升10倍,一般去次数的开平方来计算tf,不同词性对相关度影响较大,像“的”、“了”之类的词在每个文档中出现的次数都普遍较多,应该忽略或降低其影响,这就引入了idf。

    idf:逆文档频率

      查询词项并非都是平等的,在匹配查询中,较少见的词比常见词具有更好的区分度。因为idf表示词项同时出现在查询和文档中,因此在相关度计算中需要求平方。词频和逆文档频率在相关度计算中起到了相互平衡的作用。词频奖励了在一个文档中出现多次的词项,而逆文档频率惩罚了在多个文档中普遍出现的词项。例如,在英语中的常见词:the,a,of等在任何文档中几乎都会频繁出现,逆文档频率最终会拉低因词频过高而造成的相关度得分。

    t.getBoost:词项权重

      当有功能需求时,可以在索引阶段或查询阶段相应的调整这些字段或词项的权重以适应功能的需要。例如:title:solr^2.5 AND description:action。

      备注:默认权重1.0,若权重小于1.0表示惩罚特定词项。

    norm:字段规范化

      字段规范是以每个文档为基础的特定字段重要性的因子组合。字段规范在索引创建时进行计算,其表示为solr索引中每个字段的一个附加字节。包含有文档被索引时的权重值、字段被索引时的权重值、惩罚长文档的同时提升短文档的长度归一化【前提是给定关键词在长文档中出现的次数更多,因此要降低因文档长短导致出现比例不同造成的差异】。

      

    d.getBoost()分量表示发送至solr的文档权重,f.getBoost()分量表示字段的权重。solr允许同一个字段被多次添加到文档【执行的背后是将字段的每个单独条目映射到同一个底层的lucene字段】。由于重复的字段最终被映射到同一个底层字段,因此如果该字段存在多个副本,f.getBoost()会成为多个相同名称字段的每个权重相乘的积。除了索引阶段的权重设置之外,长度归一参数也被纳入到字段规范中。长度归一参数取值等于字段中词项数量的平方根。特别注意,文档权重在内部执行时会被赋给该文档的每个字段作为权重。因此,设置文档权重与为该文档中每个字段赋予文档相同的权重值是等价的。所有文档的权重最终存储在各自文档的每个字段规范中。长度归一化的目的是为了调整长度不同的文档。通常,特定词项在长文档中出现的次数比短文档多,通过归一化可以消除较长文档的这一优势。

    coord:协调因子

      用于平衡每个文档匹配的查询词项的数量。协调因子的理念是,所有的事物是平等的,包含很多查询词项的文档应该比只包含几个查询词项的其它文档得分更高。

    queryNorm:查询规范化

      由于同一个queryNorm应用于所有的文档,因此它不影响总体的相关度排序,它仅用于查询之间进行比较时得分计算的规范化因子。该因子是每个查询词项的权重平方之和,再将它与相关度的其余部分进行相乘,从而实现规范化。查询规范不应影响与给定查询相匹配的每个文档的相对权重。

Solr基础理论【相关度计算】的更多相关文章

  1. Solr基础理论【排名检索、查准率、查全率】

    一.排名检索 搜索引擎代表了基于查询,返回优先文档的一种方法.在关系型数据库的SQL查询中,表的一行要么匹配一个查询,要么不匹配,查询结果基于一列或多列排序.搜索引擎根据文档与查询匹配的程度为文档打分 ...

  2. TF-IDF算法--关键词句和文本集中每篇文章相关度计算

    关键词句和文本集每篇文章相关度计算:假设语料库中有几万篇文章,每篇文章的长度不一,你任意输入关键词或句子,通过代码以tf-idf值为准检索出来相似度高的文章. 1.TF-IDF概述 TF-IDF是一种 ...

  3. Solr基础理论与维护管理快速上手(含查询参数说明)

    1. solr基础 因为 Solr 包装并扩展了 Lucene,所以它们使用很多相同的术语.更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容.通过对 Solr 进行适当的配置,某些 ...

  4. Solr基础理论【倒排索引,模糊查询】

    一.简介 现有的许多不同类型 的技术系统,如关系型数据库.键值存储.操作磁盘文件的map-reduce[映射-规约]引擎.图数据库等,都是为了帮助用户解决颇具挑战性的数据存储与检索问题而设计的.而搜索 ...

  5. Solr查询和过滤器执行顺序剖析

    一.简介 Solr的搜索主要由两个操作组成:找到与请求参数相匹配的文档:对这些文档进行排序,返回最相关的匹配文档.默认情况下,文档根据相关度进行排序.这意味着,找到匹配的文档集之后,需要另一个操作来计 ...

  6. Solr搜索结果高级设置

    一.选择响应格式 XML是Solr的默认响应格式.从Solr的角度看,什么样的响应格式并不重要.Solr可以返回XML.JSON.Ruby.Python.PHP.二进制Java等,甚至是自定义格式.使 ...

  7. 三【相关度 相似度查询与计算】相似度到大数据查找之Mysql 文章匹配的一些思路与提高查询速度

    记录下,在上2回的数据基础之上,附带一个互信息(MI,Mutual Information)可以计算词之间的相关度 标准互信息 MI(X,Y)=log2p(x,y)/p(x)p(y) 值越大于0 则趋 ...

  8. solr 添加索引

    添加索引模板: <add> <doc> <field name="employeeId">05991</field> <fie ...

  9. Solr初步学习

    Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...

随机推荐

  1. es4x 使用nodejs 开发vertx 应用框架试用

    es4x 是将vertx 的特性带到nodejs 的开发中,性能很不错,同时开发方式和nodejs 一样,可以加速vertx 应用的开发,同时也可以方便的集成java 软件包,提供的cli 工具也很方 ...

  2. Problem A. 最近公共祖先 ———2019.10.12

    我亲爱的学姐冒险跑去为我们送正解 但是,,,, 阿龙粗现了! cao,, 考场期望得分:20   实际得分:20 Problem A. 最近公共祖先 (commonants.c/cpp/pas) 最近 ...

  3. C 题解———2019.10.16

    现在很痛苦,等过阵子回头看看,会发现其实那都不算事. [题目描述]定义一个排列 a 的价值为满足|a[i]-i|<=1 的 i 的数量.给出三个正整数 n,m,p,求出长度为 n 且价值恰好为 ...

  4. Windows平台搭建NodeJs开发环境以及HelloWorld展示—图解

    Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第一步:安装NodeJs运行环境.第二步:安装WebStrom开发工具 ...

  5. QThread 采用moveToThread方式实现多线程。 线程本身、connect关联的槽函数、connect关联的lambda对象分别运行在哪个线程中。

    Qt如何实现多线程:https://www.cnblogs.com/azbane/p/11372531.html September 5,2019 先抛出几个问题,用问题来引导思维导向: 1.继承的Q ...

  6. Certification information不能过大

    /* If certification information is too big this event can't be transmitted as it would cause failure ...

  7. GitLab修改root用户密码

    GitLab是一个私有的Git仓库,具有较好的项目管理和用户管理能力.对于普通用户而言,通过系统的重置密码,接受邮件即可解决,可是GitLab的管理员账号,缺省的邮箱是一个不存在的邮箱地址,所以没有办 ...

  8. centos删除指定名称的进程

    vim kill_process.sh ----------------------------------- if [ "$1" = "" ]; then e ...

  9. python抓取每期双色球中奖号码,用于分析

    获取每期双色球中奖号码,便于观察,话不多说,代码如下 # -*- coding:utf-8 -*- # __author__ :kusy # __content__:获取每期双色球中奖号码 # __d ...

  10. Python3+selenium 报错处理:“selenium.common.exceptions.NoAlertPresentException: Message: No alert is active”

    一.说明 在使用python3+selenium写自动升级程序的时侯,碰到一个弹出对话框需要点击确认的场景.弹出的对话框如下图所示. 对于弹框各种资料都说通过switch_to.alert属性获取对话 ...