Elasticsearch:Explain API - 如何计算分数

这篇具有很好参考价值的文章主要介绍了Elasticsearch:Explain API - 如何计算分数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 Elasticsearch:Explain API - 如何计算分数

你想了解你的文档为何获得该分数吗?

文档

让我们通过一组示例文档来了解 Explain API。 就我而言,我将使用一小部分电影名言。

POST _bulk
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "The Incredibles", "quote": "Never look back, darling. It distracts from the now" }
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "The Lion King", "quote": "Oh yes, the past can hurt. But, you can either run from it or learn from it" }
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "Toy Story", "quote": "To infinity and beyond" }
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "Ratatouille", "quote": "You must not let anyone define your limits because of where you come from" }
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "Lilo and Stitch", "quote": "Ohana means family, family means nobody gets left behind. Or forgotten" }

BM25

在网址 https://en.wikipedia.org/wiki/Okapi_BM25 你可以找到 Elasticsearch 中默认的评分算法。

Elasticsearch:Explain API - 如何计算分数

  • boost — 常数 2.2 = (k1 + 1),忽略,与排序无关
  • freq — 该术语在字段中出现的次数
  • N — 分片中的文档总数
  • n — 包含该术语的文档数
  • k1 — 常量 1.2,项饱和参数,可以更改
  • b — 常数 0.75,长度归一化参数,可以更改
  • dl — 字段的长度,特别是字段中的项数
  • avgdl — 集群中每个文档的该字段的平均长度

示例 1:术语越少的字段越重要

GET movie_quotes/_search
{
  "explain": true,
  "query": {
    "match": {
      "quote": "the"
    }
  }
}

上面命令返回的结果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 0.94581884,
    "hits": [
      {
        "_shard": "[movie_quotes][0]",
        "_node": "M9Dx5c1BTk6ehVVSCiJAvQ",
        "_index": "movie_quotes",
        "_id": "LMpi64YBn8MlrX4RQHf9",
        "_score": 0.94581884,
        "_source": {
          "title": "The Incredibles",
          "quote": "Never look back, darling. It distracts from the now"
        },
        "_explanation": {
          "value": 0.94581884,
          "description": "weight(quote:the in 0) [PerFieldSimilarity], result of:",
          "details": [
            {
              "value": 0.94581884,
              "description": "score(freq=1.0), computed as boost * idf * tf from:",
              "details": [
                {
                  "value": 2.2,
                  "description": "boost",
                  "details": []
                },
                {
                  "value": 0.87546873,
                  "description": "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details": [
                    {
                      "value": 2,
                      "description": "n, number of documents containing term",
                      "details": []
                    },
                    {
                      "value": 5,
                      "description": "N, total number of documents with field",
                      "details": []
                    }
                  ]
                },
                {
                  "value": 0.4910714,
                  "description": "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details": [
                    {
                      "value": 1,
                      "description": "freq, occurrences of term within document",
                      "details": []
                    },
                    {
                      "value": 1.2,
                      "description": "k1, term saturation parameter",
                      "details": []
                    },
                    {
                      "value": 0.75,
                      "description": "b, length normalization parameter",
                      "details": []
                    },
                    {
                      "value": 9,
                      "description": "dl, length of field",
                      "details": []
                    },
                    {
                      "value": 11,
                      "description": "avgdl, average length of field",
                      "details": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      },
      {
        "_shard": "[movie_quotes][0]",
        "_node": "M9Dx5c1BTk6ehVVSCiJAvQ",
        "_index": "movie_quotes",
        "_id": "Lcpi64YBn8MlrX4RQHf9",
        "_score": 0.71575475,
        "_source": {
          "title": "The Lion King",
          "quote": "Oh yes, the past can hurt. But, you can either run from it or learn from it"
        },
        "_explanation": {
          "value": 0.71575475,
          "description": "weight(quote:the in 1) [PerFieldSimilarity], result of:",
          "details": [
            {
              "value": 0.71575475,
              "description": "score(freq=1.0), computed as boost * idf * tf from:",
              "details": [
                {
                  "value": 2.2,
                  "description": "boost",
                  "details": []
                },
                {
                  "value": 0.87546873,
                  "description": "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details": [
                    {
                      "value": 2,
                      "description": "n, number of documents containing term",
                      "details": []
                    },
                    {
                      "value": 5,
                      "description": "N, total number of documents with field",
                      "details": []
                    }
                  ]
                },
                {
                  "value": 0.3716216,
                  "description": "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details": [
                    {
                      "value": 1,
                      "description": "freq, occurrences of term within document",
                      "details": []
                    },
                    {
                      "value": 1.2,
                      "description": "k1, term saturation parameter",
                      "details": []
                    },
                    {
                      "value": 0.75,
                      "description": "b, length normalization parameter",
                      "details": []
                    },
                    {
                      "value": 17,
                      "description": "dl, length of field",
                      "details": []
                    },
                    {
                      "value": 11,
                      "description": "avgdl, average length of field",
                      "details": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    ]
  }
}

详细说明

对于最先出现的文件 The incredibles,我们得到分数 0.94581884,计算如下:

Elasticsearch:Explain API - 如何计算分数

对于第二个文件,The Lion King,我们得到 0.71575475,计算如下:

Elasticsearch:Explain API - 如何计算分数

对于这个例子,方程式再次非常相似,但是文档有非常不同的分数,比更短的字段例子更是如此。 现在的区别在于频率和字段长度,第一个文档中的字段长度更短,术语频率更高,字段长度对一个点很重要,但频率更重要到一个点,见下一个例子 . 我们还看到第二个文档和前面例子中的第一个文档有相同的分数,这是因为情况相同,相同的频率和相同的字段长度,实际上是同一个文档。

示例 2:某个术语在该领域出现的频率越高越重要

GET movie_quotes/_search
{
  "explain": true,
  "query": {
    "match": {
      "quote": "you"
    }
  }
}

详细说明

这次跳过完整输出,对于先出现的文档 Ratatouille,我们得到分数 1.1180129,计算如下:

Elasticsearch:Explain API - 如何计算分数

对于第二个文件 The Lion King,我们得到 0.71575475,计算如下:

Elasticsearch:Explain API - 如何计算分数

对于这个例子,方程式再次非常相似,但是文档有非常不同的分数,比更短的字段例子更是如此。 现在的区别在于频率和字段长度,第一个文档中的字段长度更短,术语频率更高,字段长度对一个点很重要,但频率更重要到一个点,见下一个例子 . 我们还看到第二个文档和前面例子中的第一个文档有相同的分数,这是因为情况相同,相同的频率和相同的字段长度,实际上是同一个文档。 

示例 3:搞乱算法

如果术语频率如此重要,我是否可以通过一遍又一遍地重复相同的术语来确保我的文档始终位于顶部?

POST _bulk
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "Movie 1", "quote": "Movie movie movie movie." }
{ "index" : { "_index" : "movie_quotes" } }
{ "title" : "Movie 2", "quote": "Movie movie movie movie movie movie movie movie." }
GET movie_quotes/_search
{
  "explain": true,
  "query": {
    "match": {
      "quote": "movie"
    }
  }
}

描述

对于电影 2,我们得到 2.2614799,对于电影 1,我们得到 2.1889362。 这2个分数现在非常相似,原因是 freq 在分子和分母中,一开始,随着 term 的频率增加,分数提高得很快,但是当频率变高时,它变得越来越少相关,即使电影 2 文档的术语频率翻倍。

结论

这些是简单匹配查询的简短示例,我们还没有看到每种可能条件的相互作用,但即便如此,这也是一个很好的起点,可以真正掌握我们的文档获得的分数,并了解如何开始调优 我们的文件利用了这个算法。 有必要在这一点上提到并理解分数的确切值是无关紧要的,相对分数是唯一对排序有用的东西。 一些你自己尝试的进一步的例子。文章来源地址https://www.toymoban.com/news/detail-501232.html

  • 包含该术语多次的真正长字段,不如仅包含该术语几次的短字段相关。
  • 每个文档中出现的术语都会带回太多文档,例如 the、an 或 a,也称为停用词。 这个样本集太小,无法真正了解停用词如何真正影响返回的文档数量。
  • 由于这是一个电影数据库,你可能会发现一组全新的特定于电影的停用词,例如 film、movie、flick、actor、camera 等。 使用更大的电影数据库,你会发现搜索其中一些术语会返回相关性错误的结果。
  • 通过向请求添加更多参数来增加查询的复杂性,例如在多个字段中搜索多个术语,或在多个字段中查找相同的术语或在多个字段中查找不同的术语。
  • 开始探索 Elasticsearch 查询 DSL 中的不同查询类型,尤其是布尔查询,它真正开始发挥 Elasticsearch 中相关性调整的强大功能。

到了这里,关于Elasticsearch:Explain API - 如何计算分数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Google Bard 最速上手,这些要点也许是你想了解的

    昨晚,Google 对标 ChatGPT 的竞品 Bard 开放公众预览。得知消息后我连忙申请加入等待名单,跟预想中不同,Google 时隔一个多小时后便发邮件告知我「该试试 Bard 了」,跟前阵子 Bing AI Chat 的内测资格通过速度相比简直一个天上、一个地下。 和 ChatGPT 以及 Bing AI Chat 一样,Bard 的

    2024年02月09日
    浏览(31)
  • 一文带你了解MySQL之Explain执行计划

    前言: 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 ,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。 MySQL 为我们提供了 EXPLAIN 语句来帮助

    2024年02月06日
    浏览(34)
  • 【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

    目录 ID select_type 查询类型 table 表名 type 关联类型/访问类型 possible_keys MySQL觉得可能要用到的索引 key 实际用到的索引 key_len 用到的索引的长度(比如可用于判断使用了联合索引中的哪几个) ref 表查找值所用的列(表名.字段)或常量(const) row 预估要读取并检测的行数 Ext

    2023年04月09日
    浏览(26)
  • PHP 如何使用 Elasticsearch 的 索引 API 接口

    目录 一、实战场景 二、知识点 PHP Elasticsearch 索引 index MySQL 三、菜鸟实战 如何在 PHP 中使用 Elasticsearch 的索引 API 接口 PHP Elasticsearch 索引 index MySQL Elasticsearch 本质上是一个数据库,但并不是 MySQL 这种关系型数据库,查询语言也不是 SQL,而是 Elasticsearch 自己的一套查询语言。

    2024年02月13日
    浏览(44)
  • 在Windows中如何设置iCloud,这里有你想知道的细节

    苹果的iCloud存储和云计算服务可用于多种设备,包括iPhone、iPad和Mac。它也可以在Windows PC上使用,考虑到苹果和微软及其各自操作系统之间过去的冲突,这可能会让许多人感到惊讶。 本文介绍了iCloud for Windows,包括它的设置和许多用途。本文假设你使用的是Windows 11,尽管在

    2024年01月18日
    浏览(41)
  • python字符串模糊匹配,并计算匹配分数

    thefuzz包以前叫fuzzywuzzy,0.19版本开始改名为thefuzz,github地址: GitHub - seatgeek/thefuzz: Fuzzy String Matching in Python 可以通过命令pip install thefuzz安装此包。用法还是比较简单的: 上面两个字符串的相似度为89%。 我们先看看这个包下面的源码,来查看thefuzz是怎么实现模糊匹配的。the

    2023年04月23日
    浏览(82)
  • 云计算的数据安全与隐私保护:了解如何实现数据安全

    随着云计算技术的发展,数据在各种应用中的使用也日益增多。云计算为企业和个人提供了更高效、更便宜的数据存储和处理方式。然而,随着数据的存储和处理方式的变化,数据安全和隐私保护也成为了重要的问题。在这篇文章中,我们将讨论云计算的数据安全与隐私保护

    2024年04月29日
    浏览(38)
  • 如何使用 Explain 分析 SQL 语句?

    MySQL中 EXPLAIN 命令是我们分析和优化SQL语句的利器。 如何使用 EXPLAIN 来分析SQL语句,接下来有15个例子,一起学习呗 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 EXPLAIN 可以用于分析MySQL如何执行一个SQL查询,包括如何选择

    2024年01月16日
    浏览(33)
  • 深入了解浮点运算——CPU 和 GPU 算力是如何计算的

    随着国家大力发展数字经济,算力的提升和普惠变得越来越重要。在数字化时代,算力已成为推动科技发展和创新的关键要素。它不仅仅是衡量计算机处理速度的标准,还涉及计算机系统或设备执行计算任务的能力、数据处理能力以及解决复杂计算问题的能力。那么算力到底

    2024年01月17日
    浏览(32)
  • JavaWeb_LeadNews_Day11-KafkaStream实现实时计算文章分数

    Kafka Stream: 提供了对存储与Kafka内的数据进行流式处理和分析的功能 特点: Kafka Stream提供了一个非常简单而轻量的Library, 它可以非常方便地嵌入任意Java应用中, 也可以任意方式打包和部署 除了Kafka外, 无任何外部依赖 通过可容错地state, store实现高效地状态操作(如windowed join和

    2024年02月09日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包