IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch:在搜索中获得一致的分数 -> 正文阅读

[大数据]Elasticsearch:在搜索中获得一致的分数

Elasticsearch 使用分片和副本运行的事实在获得良好评分时增加了挑战。

分数不可重现

假设同一个用户连续两次运行相同的请求,并且两次返回的文档都没有以相同的顺序返回,这是一种非常糟糕的体验,不是吗?不幸的是,如果你有副本(index.number_of_replicas 大于 0),就会发生这种情况。原因是 Elasticsearch 会以循环方式选择查询应该转到的分片,因此如果你连续两次运行相同的查询,它很可能会转到同一分片的不同副本。

现在为什么会出现问题?索引统计是分数的重要组成部分。由于删除的文档,这些索引统计信息可能在同一分片的副本中有所不同。你可能知道,当文档被删除或更新时,旧文档不会立即从索引中删除,它只是标记为已删除,并且只会在下一次合并该旧文档所属的段时从磁盘中删除.但是,出于实际原因,索引统计会考虑那些已删除的文档。所以想象一下,主分片刚刚完成了一个删除大量已删除文档的大型合并,那么它可能具有与副本(仍然有大量已删除文档)完全不同的索引统计信息,因此分数也不同。

解决此问题的推荐方法是使用标识登录用户的字符串(例如用户 ID 或会话 ID)作为首选项。这确保了给定用户的所有查询总是会命中相同的分片,因此查询之间的分数保持更加一致。

这种解决方法还有另一个好处:当两个文档具有相同的分数时,默认情况下它们将按其内部 Lucene doc id(与 _id 无关)进行排序。然而,这些 doc id 在同一分片的副本中可能不同。因此,通过始终命中相同的分片,我们将获得具有相同分数的文档的更一致的排序。

相关性看起来不对

如果你注意到两个具有相同内容的文档得到不同的分数,或者完全匹配的没有排在第一位,那么问题可能与分片有关。默认情况下,Elasticsearch 让每个分片负责产生自己的分数。但是,由于索引统计信息是分数的重要贡献者,因此仅当分片具有相似的索引统计信息时才有效。假设是,由于默认情况下文档被均匀地路由到分片,因此索引统计信息应该非常相似,并且评分将按预期工作。但是,如果你:

  • 在索引时使用路由,
  • 查询多个索引,
  • 或者索引中的数据太少

那么很有可能搜索请求中涉及的所有分片都没有相似的索引统计信息,并且相关性可能很差。

如果你有一个小数据集,解决此问题的最简单方法是将所有内容索引到具有单个分片 (index.number_of_shards: 1) 的索引中,这是默认设置。那么所有文档的索引统计信息将是相同的,并且分数将是一致的。

否则,解决此问题的推荐方法是使用 dfs_query_then_fetch 搜索类型。这将使 Elasticsearch 对所有相关分片执行初始往返,询问它们相对于查询的索引统计信息,然后协调节点将合并这些统计信息,并在请求分片执行 query 阶段时将合并的统计信息与请求一起发送,这样分片就可以使用这些全局统计信息而不是它们自己的统计信息来进行评分。关于?dfs_query_then_fetch?的用法,你可以参阅我的另外一篇文章 “Elasticsearch:分布式计分”。

在大多数情况下,这个额外的往返应该非常便宜。但是,如果你的查询包含大量字段/术语或模糊查询,请注意单独收集统计信息可能并不便宜,因为必须在术语字典中查找所有术语才能查找统计信息。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:47:11  更:2022-04-26 11:48:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:56:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码