http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 5781|回复: 4

[搜索引擎] 35-Elasticsearch相关性是什么?

[复制链接]
发表于 2019-1-3 09:59:16 | 显示全部楼层 |阅读模式
什么是相关性?

    我们曾经讲过,默认情况下,返回结果是按相关性倒序排列的。 但是什么是相关性? 相关性如何计算?

每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。 _score 的评分越高,相关性越高。

查询语句会为每个文档生成一个 _score 字段。评分的计算方式取决于查询类型 不同的查询语句用于不同的目的: fuzzy 查询会计算与关键词的拼写相似程度,terms 查询会计算 找到的内容与关键词组成部分匹配的百分比,但是通常我们说的 relevance 是我们用来计算全文本字段的值相对于全文本检索词相似程度的算法。

Elasticsearch 的相似度算法 被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容:

检索词频率
检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。

反向文档频率
每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。

字段长度准则
字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。
单个查询可以联合使用 TF/IDF 和其他方式,比如短语查询中检索词的距离或模糊查询里的检索词相似度。

相关性并不只是全文本检索的专利。也适用于 yes|no 的子句,匹配的子句越多,相关性评分越高。

如果多条查询子句被合并为一条复合查询语句 ,比如 bool 查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。

提示
我们有一️整章着眼于相关性计算和如何让其配合你的需求 控制相关度。

理解评分标准

   当调试一条复杂的查询语句时, 想要理解 _score 究竟是如何计算是比较困难的。Elasticsearch 在 每个查询语句中都有一个 explain 参数,将 explain 设为 true 就可以得到更详细的信息。

[C#] 纯文本查看 复制代码
GET /_search?explain 

{

   "query"   : { "match" : { "tweet" : "honeymoon" }}

}



explain 参数可以让返回结果添加一个 _score 评分的得来依据。

注意
增加一个 explain 参数会为每个匹配到的文档产生一大堆额外内容,但是花时间去理解它是很有意义的。 如果现在看不明白也没关系 — 等你需要的时候再来回顾这一节就行。下面我们来一点点的了解这块知识点。

首先,我们看一下普通查询返回的元数据:

[C#] 纯文本查看 复制代码
{

    "_index" :      "us",

    "_type" :       "tweet",

    "_id" :         "12",

    "_score" :      0.076713204,

    "_source" :     { ... trimmed ... },

这里加入了该文档来自于哪个节点哪个分片上的信息,这对我们是比较有帮助的,因为词频率和 文档频率是在每个分片中计算出来的,而不是每个索引中:

[C#] 纯文本查看 复制代码
    "_shard" :      1,

    "_node" :       "mzIVYCsqSWCG_M_ZffSs9Q",

然后它提供了 _explanation 。每个 入口都包含一个 description 、 value 、 details 字段,它分别告诉你计算的类型、计算结果和任何我们需要的计算细节。

[C#] 纯文本查看 复制代码
"_explanation": { 

   "description": "weight(tweet:honeymoon in 0)

                  [PerFieldSimilarity], result of:",

   "value":       0.076713204,

   "details": [

      {

         "description": "fieldWeight in 0, product of:",

         "value":       0.076713204,

         "details": [

            {  

               "description": "tf(freq=1.0), with freq of:",

               "value":       1,

               "details": [

                  {

                     "description": "termFreq=1.0",

                     "value":       1

                  }

               ]

            },

            { 

               "description": "idf(docFreq=1, maxDocs=1)",

               "value":       0.30685282

            },

            { 

               "description": "fieldNorm(doc=0)",

               "value":        0.25,

            }

         ]

      }

   ]

}



  • honeymoon 相关性评分计算的总结
  • 检索词频率
  • 反向文档频率
  • 字段长度准则


警告
输出 explain 结果代价是十分昂贵的,它只能用作调试工具 。千万不要用于生产环境。

第一部分是关于计算的总结。告诉了我们 honeymoon 在 tweet 字段中的检索词频率/反向文档频率或 TF/IDF, (这里的文档 0 是一个内部的 ID,跟我们没有关系,可以忽略。)

然后它提供了权重是如何计算的细节:

检索词频率:

[C#] 纯文本查看 复制代码
检索词 `honeymoon` 在这个文档的 `tweet` 字段中的出现次数。

反向文档频率:

[C#] 纯文本查看 复制代码
检索词 `honeymoon` 在索引上所有文档的 `tweet` 字段中出现的次数。

字段长度准则:

[C#] 纯文本查看 复制代码
在这个文档中, `tweet` 字段内容的长度 -- 内容越长,值越小。

复杂的查询语句解释也非常复杂,但是包含的内容与上面例子大致相同。 通过这段信息我们可以了解搜索结果是如何产生的。

提示
JSON 形式的 explain 描述是难以阅读的, 但是转成 YAML 会好很多,只需要在参数中加上 format=yaml 。

理解文档是如何被匹配到的
当 explain 选项加到某一文档上时, explain api 会帮助你理解为何这个文档会被匹配,更重要的是,一个文档为何没有被匹配。

请求路径为 /index/type/id/_explain ,如下所示:

[C#] 纯文本查看 复制代码
GET /us/tweet/12/_explain

{

   "query" : {

      "bool" : {

         "filter" : { "term" :  { "user_id" : 2           }},

         "must" :  { "match" : { "tweet" :   "honeymoon" }}

      }

   }

}

不只是我们之前看到的充分解释 ,我们现在有了一个 description 元素,它将告诉我们:

[C#] 纯文本查看 复制代码
"failure to match filter: cache(user_id:[2 TO 2])"

也就是说我们的 user_id 过滤子句使该文档不能匹配到。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-3 11:39:27 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-3 15:58:00 | 显示全部楼层
感恩无私的分享与奉献
发表于 2019-1-3 17:10:38 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-3 17:13:34 | 显示全部楼层
真是难得给力的帖子啊。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-8 13:59

© 2014-2021

快速回复 返回顶部 返回列表