当你负责搜索引擎时,不用多说,你应该充分了解有关搜索相关性的尽可能多的详细信息。 虽然大多数人不需要学习每条信息,但需要了解搜索。 你至少应该对 recall (查全率)和 precision (精度)有基本的了解。 本文将重点介绍与搜索相关性的 precision 和 recall。

什么是相关性?

  • 您是否能够找到所需的所有文档?
  • 返回了多少无关的文件?
  • 文件排名如何?

Precision vs. Recall

precsion 和 recall 是搜索相关性的两个基本指标。 给定特定查询和搜索引擎返回的文档集(结果集),这些度量的定义如下:

  • precision 是结果集中相关文档的百分比。
  • recall 是结果集中返回的相关文档的百分比。

precision 的定义是检索到的相关文档数除以总计检索到的文档数。 recall 是指检索到的相关文档数除以相关文档总数。Precision 和 recall 经常相互矛盾,因为提高一个会损害另一个。

Elasticsearch 的目标是达到最佳 recall,这意味着执行搜索时,仅(和所有)相关文档被检索。 还需要检索尽可能多的相关文档,这意味着你通常需要使用最简单的过滤器和查询来优化 recall。

根据 precision 及 recall 的定义:

上面有几个名字,我们这里来解释一下:

  • true positive:它表示的是真正的相关的搜索结果
  • false postive:它表示的是在搜索时返回的不相关的结果
  • false negative:表示的是在搜索时应该返回的结果,但是没有被正确返回
  • true negative:表示的是真正完全不相干的结果

我们可以通过上面的计算公式来计算出 precision 及 recall。

提高 precision 和 recall 的技巧

我们在实际的使用中,可以通过如下的方法来提高 Recall 及 Precision:

  • Recall 可以通过撒大网以获得更多的结果。

    • 我们可以通过 fuzziness,regex,wildcard 以及 should 来提高查询的面以获得更多的结果。但是这样的做法是可能返回一些很多不相干的文档,从而使得 precision 更差
    • 使用 should 从句而不是 must,或者使用 or 而不是 and 可以提高 recall
  • Precision:我们可以通过更加精准的搜索来提高搜索的精度
    • 比如完全匹配(比如 term query)的方法,或者通过 match_phrase 等方法。这些方法可能造成 recall 很差,因为我们把搜索的范围变小了,从而导致返回的结果很少
    • 使用 must 而不是 should 来提高搜索的精确度

在实际的使用中,有很多的方法可能会提高 precision,也可能会提高 recall。那么我们有没有两全的办法呢?

准确率和查全率之间的权衡:

例子

假如我们现在有如下的几个文档:

POST my_index/_bulk
{ "index" : { "_id" : "1" }}
{ "content" : "Elastic Stack is very useful" }
{ "index" : { "_id" : "2" }}
{ "content" : "I do not like stack though Elastic is nice" }
{ "index" : { "_id" : "3" } }
{ "content" : "Elastic and its stack are good" }
{ "index" : { "_id" : "4" } }
{ "content" : "What is stack?" }

假如我们想寻找的是 Elastic  Stack 这样的相关的内容。上面的第一条是最相关的,而且第三条也是很相关的。第二条可能不相关,极有可能是谈论完全不相关的内容。第四条也可能不相关。我们进行如下的搜索:

GET my_index/_search
{"query": {"match": {"content": "ELastic Stack"}}
}

上面的搜索将返回所有的文档,因为在默认的情况下,它返回所有含有 Elastic 及 Stack 的所有文档。

    "hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 0.5363642,"_source" : {"content" : "Elastic Stack is very useful"}},{"_index" : "my_index","_type" : "_doc","_id" : "3","_score" : 0.4988708,"_source" : {"content" : "Elastic and its stack are good"}},{"_index" : "my_index","_type" : "_doc","_id" : "2","_score" : 0.41238922,"_source" : {"content" : "I do not like stack though Elastic is nice"}},{"_index" : "my_index","_type" : "_doc","_id" : "4","_score" : 0.22667006,"_source" : {"content" : "What is stack?"}}]

显然这种搜索的 recall 是非常高的。我们可以通过如下的方法来提高精度:

GET my_index/_search
{"query": {"match": {"content": {"query": "Elastic Stack","operator": "and"}}}
}

也就是说,必须同时含有 Elastic 及 Stack 的文档才可以被搜索到。显然我们把网缩小了。返回的结果是:

    "hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 0.5363642,"_source" : {"content" : "Elastic Stack is very useful"}},{"_index" : "my_index","_type" : "_doc","_id" : "3","_score" : 0.4988708,"_source" : {"content" : "Elastic and its stack are good"}},{"_index" : "my_index","_type" : "_doc","_id" : "2","_score" : 0.41238922,"_source" : {"content" : "I do not like stack though Elastic is nice"}}]

对于多个搜索词来说,我们也可以使用如下的方法:

GET my_index/_search
{"query": {"match": {"content": {"query": "Elastic Stack Otherword","minimum_should_match": 2}}}
}

上面表它可以搜索上面三个单词 Elastic,Stack 以及 Otherword 中的两个匹配就可以了,虽然这个搜索也是使用 or 的关系。通过这样的方法,我们可以把网撒的很大,但是也精确了一点,需要至少匹配两个单词。

这次精度提高了,但是它可能还不是我们所需要的。我们可以看一下 id 为 2 的文档,它极有可能不是我们想要的文档。为了更进一步提高精度,我们可以做如下的搜索:

GET my_index/_search
{"query": {"match_phrase": {"content": {"query": "Elastic Stack","slop": 0}}}
}

上面需要搜索的内容是说,我们想查询按照  Elastic 及 Stack 的顺序来查询,必须是  Elastic 在前,Stack 在后,然后这两个词之前的距离还不能超过2个单词。返回的结果是:

    "hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 0.4880792,"_source" : {"content" : "Elastic Stack is very useful"}}]

这次的返回结果显然只有一个,是精度最高的一次搜索。但是我们极有可能漏掉了一些非常相关的文档,比如文档 id 为 3 的文档。这个搜索的缺点是 recall 很低。那么我们在实际的使用该如何在提高 recall 的情况下,同时也提供相关性呢?

依据我们上面的技巧,我们可以做如下的改进:

GET my_index/_search
{"query": {"bool": {"must": [{"match": {"content": "Elastic Stack"}}],"should": [{"match_phrase": {"content": {"query": "Elastic Stack","slop": 2}}},{"match": {"content": {"query": "Elastic Stack","operator": "and"}}}]}}

在上面,我们通过第一个 match 撒了一张大网,把所有含有 Elastic 及 Stack 的文档都收入搜索的范围,这样提供了 recall。接着我们针对我们自己的业务需求来进行对分数来进行定制。对于 match_phrase 搜索来说,Elastic 以及 Stack 之间不超过两个单词距离的文档进行加分,同时对同时含有两个单词的文档进行加分。这样我们可以保证这些文档排在前面以提供他们的准确性。上面搜索的结果是:

    "hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 1.6090926,"_source" : {"content" : "Elastic Stack is very useful"}},{"_index" : "my_index","_type" : "_doc","_id" : "3","_score" : 1.2345327,"_source" : {"content" : "Elastic and its stack are good"}},{"_index" : "my_index","_type" : "_doc","_id" : "2","_score" : 0.82477844,"_source" : {"content" : "I do not like stack though Elastic is nice"}},{"_index" : "my_index","_type" : "_doc","_id" : "4","_score" : 0.22667006,"_source" : {"content" : "What is stack?"}}]

上面显示,文档 1 及 3 具有高的相关性。它们排在搜索结果的前面。

总结

在实际的搜索场景中,我们一定要了解自己的业务搜索场景,并对你的业务场景进行定制自己的搜索。我在搜索的时候既要注意搜索文档的 recall,同时也要考虑搜索的 precision。没有一成不变的规则适用所有的场景。

参考:

【1】https://www.youtube.com/watch?v=CCTgroOcyfM&ab_channel=OfficialElasticCommunity

Elasticsearch:理解搜索中的 precision 及 recall相关推荐

  1. 目标检测中对precision和recall的理解

    首先有四个基本概念是由二分类的混淆矩阵得来,需要了解. TP:将实际正样本预测为正样本 FP:将负样本预测为正样本 TN:将负样本预测为负样本 FN:将正样本预测为正样本 最开始的时候分类可能认准了准 ...

  2. 刷网课会被检测出来吗_目标检测中的Precision和Recall

    目标检测中常用的性能评价指标有Precision,Recall和F1 score. 当面对不同的任务时,该如何提高recall和precision? 思考:对于Precision值,其代表的是你所预测 ...

  3. 目标检测中的precision,recall,AP,mAP计算详解

    大雁与飞机 假设现在有这样一个测试集,测试集中的图片只由大雁和飞机两种图片组成,如下图所示: 假设你的分类系统最终的目的是:能取出测试集中所有飞机的图片,而不是大雁的图片. 现在做如下的定义: Tru ...

  4. 机器学习中的 precision、recall、accuracy、F1 Score

    1. 四个概念定义:TP.FP.TN.FN 先看四个概念定义:  - TP,True Positive  - FP,False Positive  - TN,True Negative  - FN,F ...

  5. 二分类中的precision,recall,F1值计算(举例)

      二分类中的混淆矩阵中有以下4种标记: 预测(列)/label(行) 正样本 负样本 正样本 TP(真正例) FN(假反例) 负样本 FP(假正例) TN(真反例)   TP(真正例) :将正样本预 ...

  6. 【Elasticsearch】Elasticsearch 理解mapping中的store属性

    1.概述 转载:https://www.cnblogs.com/sanduzxcvbnm/p/12157453.html 默认情况下,对字段值进行索引以使其可搜索,但不存储它们 (store). 这意 ...

  7. 多类别分类任务(multi-class)中为何precision,recall和F1相等?

    文章目录 背景: precision, recall和F1 score的定义 micro averaging的计算及其示例 macro averaging 和 weighted averaging m ...

  8. 多分类f1分数_分类模型的F1-score、Precision和Recall 计算过程

    分类模型的F1分值.Precision和Recall 计算过程 引入 通常,我们在评价classifier的性能时使用的是accuracy 考虑在多类分类的背景下 accuracy = (分类正确的样 ...

  9. precision and recall

    首先强调multi-class 和multi-label是不同的,前者是每个样本只属于一个类别,后者是每个样本可以有多个类别标记,即多个类别 在模式识别,信息检索,二分类等问题中常常需要对结果进行评价 ...

最新文章

  1. 【css】如何使页面压缩时文本内容不换行
  2. html基础:定义 图片 表格
  3. 基于Javaweb实现企业财务管理系统
  4. 并发编程(四)__ConcurrentHashMap
  5. 使用母版页时内容页如何使用css和javascript
  6. 深入理解display属性
  7. php重载,PHP重载基础知识回顾
  8. 草稿-xpath了解-python 操作xpath小例子
  9. (19)Verilog HDL顺序块:begin-end
  10. git删除远程提交记录
  11. 02组团队项目-Alpha冲刺-4/6
  12. c语言判断字符串是否对称,c语言 判断字符串是否中心对称
  13. 浪潮提出“计算+”挖大数据商机
  14. qq飞车手游微信24区服务器,QQ飞车手游手游开服表_QQ飞车手游手游开服时间表_新服新区预告_第一手游网...
  15. 时序分析基本概念介绍--Timing Arc
  16. 京东笔试编程题之方块消除
  17. 轻量级UPF N4接口开放性技术研究与应用
  18. sha算法 哈希算法_SHA1哈希算法教程及其用法示例
  19. 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
  20. 10qbt超导量子计算机,南京大学于扬、朱诗亮团队在超导量子比特中实现参数空间的新型磁单极...

热门文章

  1. 四轮移动机器人(阿克曼底盘)数学建模
  2. 仿qq底部Tab导航
  3. [转载]我爱我妻----让男人看一遍哭一遍的文章
  4. php前台可自定义框架,实现Discuz!前台DIY自定义框架比例
  5. 2020度小满金融春招笔试
  6. 聊聊公钥私钥的那点事儿
  7. 计算机基础知识(2)
  8. SMETA认证辅导,审核结果可以得到所有SEDEX会员的认可并被他们共享
  9. 海思35XX系列芯片型号规律
  10. Typora如何打出小黑点,空心圆,小方框