带你读《Elastic Stack 实战手册》之19:——3.4.2.4.分布式计分(上)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之19:——3.4.2.4.分布式计分(上)

3.4.2.4.分布式计分


创作人赵震一

 

什么是打分

 

搜索引擎中的搜索与数据库中,常规的 SELECT 查询语句,都能帮你从一大堆数据中,找到匹配某个特定关键字的数据条目,但是这两者最大的区别在于,搜索引擎能够基于查询和结果的相关性,帮你做好结果集排序,即搜索引擎会将它认为最符合你查询诉求的数据条目,放在最前面,而数据库的 SELECT 语句却做不到。

 

那么搜索引擎是怎么做到的呢?其关键在于打分,搜索引擎在完成关键字匹配后,会基于一定的机制对每条匹配的数据(后称文档)进行打分,得分高的文档表示与本次查询相关度高,就会在最后的结果列表中排在靠前的位置,反之则排名靠后,从而帮助你快速找到你最想要的数据。

 

下面,我们来向 Elasticsearch 插入一些索引数据:


#删除已有索引
DELETE /my-index-000001
#创建索引,显示在 settings 中指定2个 shard:"number_of_shards": "2"
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": "2",
    "number_of_replicas": "1"
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "date": {
        "type": "date"
      },
      "content": {
        "type": "text"
      }
    }
  }
}
#插入记录
PUT /my-index-000001/_doc/1
{
  "title":   "三国志",
  "date":    "2021-05-01",
  "content": "国别体史书"
}
PUT /my-index-000001/_doc/2
{
  "title":   "红楼梦",
  "date":    "2021-05-02",
  "content": "黛玉葬花..."
}
PUT /my-index-000001/_doc/3
{
  "title":   "易中天品三国",
  "date":    "2021-05-03",
  "content": "草船借箭、空城计..."
}
PUT /my-index-000001/_doc/4
    363         >   三、产品能力
{
  "title":   "水浒传",
  "date":    "2021-05-03",
  "content": "梁山好汉被团灭..."
}
PUT /my-index-000001/_doc/5
{
  "title":   "三国演义",
  "date":    "2021-05-03",
  "content": "三国时代,群雄逐鹿..."
}
接下去,我们采用关键词“三国演义”进行搜索:
GET /my-index-000001/_search
{
  "query": {
    "query_string": {
      "query": "三国演义"
    }
  }
}

查看一下返回记录的排序以及打分情况:


{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 2,
"successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 3.1212955,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 3.1212955,
        "_source" : {
          "title" : "三国演义",
          "date" : "2021-05-03",
          "content" : "三国时代,群雄逐鹿..."
        }
      },
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.7946176,
        "_source" : {
          "title" : "三国志",
          "date" : "2021-05-01",
          "content" : "国别体史书"
        }
      },
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.59221494,
        "_source" : {
          "title" : "易中天品三国",
          "date" : "2021-05-03",
          "content" : "草船借箭、空城计..."
        }
      }
    ]
  }
}

可以看到 title 为“三国演义”的文档排在第一,分数( _score )是3.1212955,其次是”三国志”,分数是0.7946176,最后是“易中天品三国”,分数是0.59221494,其余没有匹配的文档则没有出现,该搜索结果即打分排名基本符合预期。“三国志” 的得分较 ”易中天品三国” 更高的原因是因为 “三国志” 词语较短,因为在Lucene的打分逻辑中,匹配的Field的长度也会干预得分,具体的打分机制见下一小节对打分机制的讲解。

 

Elasticsearch 搜索的打分机制

 

众所周知,Elasticsearch 是以 Lucene 作为其搜索引擎技术的核心基石的。为了适应大数据时代的搜索需求,Elasticsearch 对 Lucene 最大的增强在于,将原本的单机搜索能力扩展到了分布式的集群规模能力,即将原本单机无法支撑的索引数据,水平切分成多个可以独立部署在不同机器上的 Shard,每个 Shard 由独立的 Lucene 实例提供服务,从而以集群的形式对外提供搜索服务。

 

因此,为了便于理解 Elasticsearch 的分布式搜索的打分机制,我们先来简单回顾下单机情况下 Lucene 是如何打分的。

 

Lucene 打分机制

 

当我们向 Lucene 某个索引提交搜索请求后,Lucene 会基于查询完成匹配,并得到一个文档结果集,然后默认基于以下的评分公式,来对结果集中的每个条目计算相关度(评分公式可以基于配置调整)。


image.png


其中 q 表示查询,d 表示当前文档,t 表示 q 中的词条,tf(t in d) 是计算词条 t 在文档 d 中的词频,idf(t) 是词条t在整个索引中的逆文档频率。

 

我们介绍一下最关键的两个概念,即词频( TF )和逆文档频率( IDF )。

 

词频( TF ):词条在文档中出现的次数

 

基于特定的 q 和文档 d 来说,词条 t 代指 q 分词后的其中一个词条,t 的词频指该 t 词条在文档 d 中的出现次数,出现次数越多,表示该文档相对于该词关联度更高。

 

逆文档频率( IDF ):在同一索引中存在该词条的文档数的倒数

 

包含某个词条的文档数越多,说明这个词条的词频在整个索引中的影响力越弱。

该公式中该有两个关键项。

 

词条加权( t.getBoost()): 搜索时的一个加权因子,词条 t 在特定查询 q 中的加权系数

 

Norm加权( norm(t,d) ): 索引时的一个加权因子,取决于匹配字段包含的 Token 长度以及当前文档 d 的平均 Token 长度,越短的匹配字段得分越高。

 

通过对 Norm 加权的了解,便能够解答上一小节最后为什么"三国志"得分高于”易中天品三国”了。

 

我们已经对上述评分公式各项作了讲解,可以了解到,一旦给定查询 q 和文档 d,其得分即为查询中每个词条 t 的得分总和。

 

而每个词条的得分,一个主要部分是该词条在文档 d 中的词频 ( TF ) 乘以逆文档频率 ( IDF )的平方。即词条在文档中出现的频率越高,则得分越高。而索引中存在该词条的文档越少,逆文档频率则越高,表示该词条越罕见,那么对应的分数也将越高。

 

回顾完 Lucene 的打分机制,我们再回过来看下 Elasticsearch 的搜索及打分机制。

 

Elasticsearch 打分机制

 

Elasticsearch 的搜索类型有两种,默认的称为 QUERY_THEN_FETCH。顾名思义,它的搜索流程分为两个阶段,分别称之为 Query 和 Fetch。

 

我们来看下 QUERY_THEN_FETCH 的流程:


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.4.分布式计分(中) https://developer.aliyun.com/article/1230902

 



相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
3月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
9月前
|
分布式计算 DataWorks 数据处理
产品测评 | 上手分布式Python计算服务MaxFrame产品最佳实践
MaxFrame是阿里云自研的分布式计算框架,专为大数据处理设计,提供高效便捷的Python开发体验。其主要功能包括Python编程接口、直接利用MaxCompute资源、与MaxCompute Notebook集成及镜像管理功能。本文基于MaxFrame最佳实践,详细介绍了在DataWorks中使用MaxFrame创建数据源、PyODPS节点和MaxFrame会话的过程,并展示了如何通过MaxFrame实现分布式Pandas处理和大语言模型数据处理。测评反馈指出,虽然MaxFrame具备强大的数据处理能力,但在文档细节和新手友好性方面仍有改进空间。
|
9月前
|
数据采集 人工智能 分布式计算
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
在数据驱动的时代,大数据分析和AI模型训练对数据预处理的效率要求极高。传统的Pandas工具在小数据集下表现出色,但面对大规模数据时力不从心。阿里云推出的Python分布式计算框架MaxFrame,以“Pandas风格”为核心设计理念,旨在降低分布式计算门槛,同时支持超大规模数据处理。MaxFrame不仅保留了Pandas的操作习惯,还通过底层优化实现了高效的分布式调度、内存管理和容错机制,并深度集成阿里云大数据生态。本文将通过实践评测,全面解析MaxFrame的能力与价值,展示其在大数据和AI场景中的卓越表现。
203 4
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
|
9月前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
406 8
|
机器学习/深度学习 人工智能 自然语言处理
人工智能平台PAI产品使用合集之如何配置cluster系统自动生成分布式参数
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
存储 监控 Windows
ABB 分布式控制系统 DCS紧凑型产品套件 紧凑型HMI
ABB 分布式控制系统 DCS紧凑型产品套件 紧凑型HMI
ABB 分布式控制系统 DCS紧凑型产品套件 紧凑型HMI
|
SQL 关系型数据库 MySQL
Flink CDC产品常见问题之读分布式mysql报连接超时如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
运维 关系型数据库 分布式数据库
PolarDB产品使用合集之在选择分布式数据库时,主要考虑是什么
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
机器学习/深度学习 人工智能 TensorFlow
人工智能平台PAI产品使用合集之如何在CPU服务器上使用PAIEasyRec进行分布式训练
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
数据库 OceanBase
OceanBase数据库是一个分布式集群产品,在部署时对硬件资源有特定的需求
OceanBase数据库是一个分布式集群产品,在部署时对硬件资源有特定的需求【1月更文挑战第12天】【1月更文挑战第56篇】
253 2