一.简介  

  寻找匹配的文档是构建优质搜索体验的关键步骤,但这仅仅是第一步。大多数用户不愿意通过逐页翻阅搜索结果来找到想要的文档。根据一般经验,仅有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. zzulioj - 2599: 对称的数字

    题目链接: http://acm.zzuli.edu.cn/problem.php?id=2599 题目描述 小D同学发现了一些数字与其反转数字相加求和得出新数字,新数字再不断重复这个过程,最终可能得 ...

  2. 【BZOJ3569】DZY Loves Chinese II

    [BZOJ3569]DZY Loves Chinese II 题面 bzoj 题目大意: 给你一张\(N(1\leq N\leq 10^5)\)个点\(M(1\leq M\leq 5\times 10 ...

  3. PATA1035Password

    需要注意的就是把判定函数提取出来,这样可以简化代码,同时参数引用了&,可以对于传入参数进行修改. 参考代码: #define _CRT_SECURE_NO_WARNINGS #include& ...

  4. uiView获取指定子view

    判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类 ...

  5. Bootstrap-duallistbox的使用

    1:首先引入相关js <link href="~/Content/bootstrap.min.css" rel="stylesheet" /> &l ...

  6. pytest新版本(5.3.2)中收集测试方法规则不支持以test结尾的方法

    pytest新版本(5.3.2)中收集测试方法规则不支持以test结尾的方法,只能命名为以test开头,否则不能识别到

  7. c++ rvo vs std::move

    c++ rvo vs std::move To summarize, RVO is a compiler optimization technique, while std::move is just ...

  8. 备忘Sourcetree配置

    一. 设置用户名 对应路径:C:\Users\用户名\.gitconfig 二.验证账号 三.添加ssh key 创建ssh密码 保存key,路径:C:\Users\用户名\.ssh 配置Pagean ...

  9. Maven使用tomcat7-maven-plugin

    原文地址:https://www.cnblogs.com/mozisss/p/10233366.html 功能: (使用maven中的tomcat插件,就可以将tomcat集成到项目中,效果就是:在不 ...

  10. linux系统ubuntu中在命令行如何打开图形界面的文件夹

    用linux查看文件列表之类的受到命令行限制,还是不太方便的.在文件夹中打开的话,切换路径又没有linux终端快,于是,需要在命令行窗口中打开文件夹.如何做呢? 来到终端命令行中,cd切换你的路径,使 ...