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

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

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


Query 阶段:

 

1、Elasticsearch 在收到客户端搜索请求后,会由协调节点将请求分发到对应索引的每个

Shard 上。

2、每个 Shard 的 Lucene 实例基于本地 Shard 内的 TF/IDF 统计信息,独立完成 Shard 内的索引匹配和打分(基于上述公式),并根据打分结果完成单个 Shard 内的排序、分页。

3、每个 Shard 将排序分页后的结果集的元数据(文档 ID 和分数,不包含具体的文档内容)返回给协调节点。

4、协调节点完成整体的汇总、排序以及分页,筛选出最终确认返回的搜索结果。

 

Fetch 阶段:

 


1、协调节点根据筛选结果去对应 shard 拉取完整的文档数据

2、整合最终的结果返回给用户客户端

 

分布式打分的权衡

 

我们再来看一个场景,先重建索引,但是我们将 Shard 建成 3:


#删除已有索引
DELETE /my-index-000001
#创建索引,显示在 settings 中指定3个 shard:"number_of_shards": "3"
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": "3",
    "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
{
  "title":   "水浒传",
  "date":    "2021-05-03",
  "content": "梁山好汉被团灭..."
}
PUT /my-index-000001/_doc/5
{
  "title":   "三国演义",
  "date":    "2021-05-03",
    370         >   三、产品能力
  "content": "三国时代,群雄逐鹿..."
}
然后再次执行相同的搜索:
GET /my-index-000001/_search
{
  "query": {
    "query_string": {
      "query": "三国演义"
    }
  }
}
查看本次搜索结果:
{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.6285465,
"hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.6285465,
        "_source" : {
          "title" : "易中天品三国",
          "date" : "2021-05-03",
          "content" : "草船借箭、空城计..."
        }
      },
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.1507283,
        "_source" : {
          "title" : "三国演义",
          "date" : "2021-05-03",
          "content" : "三国时代,群雄逐鹿..."
        }
      },
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "title" : "三国志",
          "date" : "2021-05-01",
          "content" : "国别体史书"
        }
      }
    ]
  }
  }

搜索结果的排名竟然发生了变化,我们期望排第一的”三国演义”排到了第二,得分为1.1507283,而“易中天品三国”竟然得分1.6285465,跃居第一,这并不符合我们的搜索预期。

 

通过分析上面的 QUERY_THEN_FETCH 流程,我们不难发现:由于分布式系统天然的割裂性质,每个 shard 无法看到全局的统计信息,所以上述第 2 步中每个 Shard 的打分都是基于本地 Shard 内的 TF/IDF 统计信息来完成的。

 

在大多数的生产环境中,由于数据量多且在每个 Shard 分布均匀,这种方式是没有问题的。但是在极端情况下(如上例),3 个 shard 中的文档数相差较大,那么 IDF 在 3 个 Shard 中所起到的影响将截然不同,即单个 Shard 内打分汇总后的结果,与全局打分汇总的结果会有相当大的出入,造成我们在靠前的分页,搜到原本应该排名靠后的文档。

 

这也是分布式打分引入的实际问题,那么如何才能解决这类问题呢?

 

我们曾在上一小节提到,Elasticsearch 的搜索类型其实有两种,除了上面介绍的 QUERY_THEN_FETCH 之外,还有一种是 DFS_QUERY_THEN_FETCH。

 

DFS 在这里的意思是分布式频率打分,其思想是提前向所有 Shard 进行全局的统计信息搜集,然后再将这些统计信息,随着查询分发到各个 Shard,让各个 Shard 在本地采用全局 TF/IDF来打分,具体的流程如下:


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

 

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
4月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
10月前
|
分布式计算 DataWorks 数据处理
产品测评 | 上手分布式Python计算服务MaxFrame产品最佳实践
MaxFrame是阿里云自研的分布式计算框架,专为大数据处理设计,提供高效便捷的Python开发体验。其主要功能包括Python编程接口、直接利用MaxCompute资源、与MaxCompute Notebook集成及镜像管理功能。本文基于MaxFrame最佳实践,详细介绍了在DataWorks中使用MaxFrame创建数据源、PyODPS节点和MaxFrame会话的过程,并展示了如何通过MaxFrame实现分布式Pandas处理和大语言模型数据处理。测评反馈指出,虽然MaxFrame具备强大的数据处理能力,但在文档细节和新手友好性方面仍有改进空间。
|
10月前
|
数据采集 人工智能 分布式计算
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
在数据驱动的时代,大数据分析和AI模型训练对数据预处理的效率要求极高。传统的Pandas工具在小数据集下表现出色,但面对大规模数据时力不从心。阿里云推出的Python分布式计算框架MaxFrame,以“Pandas风格”为核心设计理念,旨在降低分布式计算门槛,同时支持超大规模数据处理。MaxFrame不仅保留了Pandas的操作习惯,还通过底层优化实现了高效的分布式调度、内存管理和容错机制,并深度集成阿里云大数据生态。本文将通过实践评测,全面解析MaxFrame的能力与价值,展示其在大数据和AI场景中的卓越表现。
226 4
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
|
10月前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
458 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篇】
268 2

热门文章

最新文章