剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...
http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03?utm_source=infoq&utm_campaign=user_page&utm_medium=link
在本系列的前一篇中,我们讨论了Elastisearch如何解决分布式系统中的一些基本挑战。在本文中,我们将探讨Elasticsearch在近实时搜索及其权衡计算搜索相关性方面的内容,Insight Data的工程师们已经在使用Elasticsearch构建的数据平台之上,对此有所实践。我将在本文中主要讲述:
- 近实时搜索
- 为什么深层分页在分布式搜索中是有害的?
- 计算搜索相关性中的权衡
近实时搜索
虽然Elasticsearch中的变更不能立即可见,它还是提供了一个近实时的搜索引擎。如前一篇中所述,提交Lucene的变更到磁盘是一个代价昂贵的操作。为了避免在文档对查询依然有效的时候,提交变更到磁盘,Elasticsearch在内存缓冲和磁盘之间提供了一个文件系统缓存。内存缓存(默认情况下)每1秒刷新一次,在文件系统缓存中使用倒排索引创建一个新的段。这个段是开放的并对搜索有效。
文件系统缓存可以拥有文件句柄,文件可以是开放的、可读的或者是关闭的,但是它存在于内存之中。因为刷新间隔默认是1秒,变更不能立即可见,所以说是近实时的。因为translog是尚未落盘的变更持久化记录,它能有助于CRUD操作方面的近实时性。对于每次请求来说,在查找相关段之前,任何最近的变更都能从translog搜索到,因此客户端可以访问到所有的近实时变更。
你可以在创建/更新/删除操作后显式地刷新索引,使变更立即可见,但我并不推荐你这样做,因为这样会创建出来非常多的小segment而影响搜索性能。对于每次搜索请求来说,给定Elasticsearch索引分片中的全部Lucene段都会被搜索到,但是,对于Elasticsearch来说,获取全部匹配的文档或者很深结果页的文档是有害的。让我们来一起看看为什么是这样。
为什么深层分页在分布式搜索中是有害的?
当我们的一次搜索请求在Elasticsearch中匹配了很多的文档,默认情况下,返回的第一页只包含前10条结果。search API提供了from和size参数,用于指定对于匹配搜索的全部文档,要返回多深的结果。举例来说,如果我们想看到匹配搜索的文档中,排名为50到60之间的文档,可以设置from=50,size=10。当每个分片接收到这个搜索请求后,各自会创建一个容量为from+size的优先队列来存储该分片上的搜索结果,然后将结果返回给协调节点。
如果我们想看到排名为50,000到50,010的结果,那么每个分片要创建一个容量为50,010的优先队列来存储结果,而协调节点要在内存中对数量为shards * 50,010的结果进行排序。这个级别的分页有可能得到结果,也有可以无法实现,这取决于我们的硬件资源,但是这足以说明,我们得非常小心地使用深分页,因为这非常容易使我们的集群崩溃。
一种获取全部匹配结果文档的可行性方案是使用scroll API,它的角色更像关系数据库中的游标。使用scroll API无法进行排序,每个分片只要有匹配搜索的文档,就会持续发送结果给协调节点。
获取大量文档的时候,对结果进行得分排序会非常昂贵。并且由于Elasticsearch是分布式系统,为每个文档计算搜索相关性得分是非常昂贵的。现在,让我们一起看看计算搜索相关性的诸多权衡中的一种。
计算搜索相关性中的权衡
Elasticsearch使用tf-idf来计算搜索相关性。由于其分布式的性质,计算全局的idf(inverse document frequency,逆文档频率)非常昂贵。反之可以这样,每个分片计算本地的idf并将相关性得分分配给结果文档,返回的结果只关乎该分片上的文档。同样地,所有分片使用本地idf计算的相关性得分,返回结果文档,协调节点对所有结果排序并返回前几条。这样做在大多数情况下是没有问题的,除非索引的关键字词项有倾斜或者单个分片上没有代表全局的足够数据。
比如说,如果我们搜索“insight”这个词,但包含"insight"这个词项的大多数文档都存放在一个分片上,这样以来匹配查询的文档将不能公平地在每个分片上进行排序,因为每个分片上的本地idf的值非常不同,得到的搜索结果可能不会非常相关。同样地,如果没有足够的数据,那么对于某些搜索而言,本地idf的值可能大有不同,结果也会不如预期相关。在有足够数据的真实场景中,本地idf值一般会趋于均等,搜索结果是相关的,因为文档得到了公平的得分。
这里有2种应对本地idf得分的办法,但都不建议真正在生产环境中使用。
- 一种办法是一索引一分片,本地idf即是全局idf,但这没有为并行计算/水平伸缩留有余地,对于大型索引并不实用。
- 另一种办法是在搜索请求中使用dfs_query_then_search (dfs = distributed frequency search,分布式频率搜索) 参数,这样以来,会首先计算每个分片的本地idf,然后综合这些本地idf的值来计算整个索引的全局idf值,最后使用全局idf计算相关性得分来返回结果。这种方式不为生产环境推荐,因为有足够的数据确保词项频率分布均匀。
在本系列的过去几篇中,我们回顾了一些Elasticsearch的基本原则,对于我们理解并上手Elasticsearch,这些内容非常重要。在接下来的一篇中,我将使用Apache Spark来研究Elasticsearch中的索引数据。
查看英文原文:Anatomy of an Elasticsearch Cluster: Part III
转载于:https://www.cnblogs.com/davidwang456/articles/9923804.html
剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...相关推荐
- 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
2019独角兽企业重金招聘Python工程师标准>>> 剖析Elasticsearch集群系列之二:分布式的三个C.translog和Lucene段 博客分类: java 搜索引擎, ...
- 剖析Elasticsearch集群系列第二篇 分布式的三个C、translog和Lucene段
http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part02?utm_source=infoq&utm ...
- 剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作
http://www.infoq.com/cn/articles/analysis-of-elasticsearch-cluster-part01?utm_source=infoq&utm_c ...
- 剖析Elasticsearch集群系列之一:Elasticsearch的存储模型和读写操作
转载:http://www.infoq.com/cn/articles/analysis-of-elasticsearch-cluster-part01 1.辨析Elasticsearch的索引与Lu ...
- Elasticsearch - Elasticsearch集群Cluster(三)
阅读本文前可先参考 https://blog.csdn.net/MinggeQingchun/article/details/126618387 一.单机 & 集群 1.单机 单台 Elast ...
- (六)elasticsearch 集群 网络超时解决方案 --- Elasticsearch 集群搭建
上一篇: (五)elasticsearch 集群扩展 --- Elasticsearch 集群搭建 因为网络原因,可能会有节点被踢出集群,如果网络恢复,节点会再次加入集群,但是这中间的过程是比较耗费性 ...
- 高可用 Elasticsearch 集群 21 讲
课程内容 开篇词 | 如何构建一个高可用.低延迟的 Elasticsearch 集群? 我们从 1.x 开始使用 Elasticsearch ,发展到现在大大小小的集群有 5000+,最大的集群物理主 ...
- ELK教程1:ElasticSearch集群的部署
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 在分布式系统中,应用数量众多,应用调用链复杂,常常使用ELK作为日志收集.分析和展示的组件.本 ...
- 400+节点的 Elasticsearch 集群运维
作者:Anton Hägerstrand 翻译:杨振涛 Meltwater每天要处理数百万量级的帖子数据,因此需要一种能处理该量级数据的存储和检索技术. 从0.11.X 版本开始我们就已经是Elast ...
最新文章
- 首次用Intellij IDEA打开别人的项目,如何配置Tomcat服务器?
- .net 常用的插件列表
- 如何设计一门语言(八)——异步编程和CPS变换
- 『转』line-height
- 2019怎么保存低版本_CAD发给客户没字体怎么办?快速打包外部参照、字体、打印样式...
- idea启动tomcat没有加载项目_震惊!我三步就搞定了 Tomcat 源码环境搭建!
- 实现购物车的Session
- 腾讯云三大自研数据库之一 TBase 开源后首次重磅升级,复杂查询性能最高提升十倍
- android 绘图流程,Android View绘制流程
- 解决SecureCRT连接linux超时后断开
- CTF训练(密码学)——位移密码
- 计算机数学公式画爱心教程,几何画板如何绘制爱心?几何画板爱心函数教程
- 计算机网络-路由器和交换机的区别
- 黑客用“勒索病毒”展示肌肉,但你了解什么是“白帽黑客”吗?
- mysql 给库赋权,Mysql数据库安装、赋权
- app后端设计(6)-- LBS
- 如何使用PS的蒙版,调整局部的对比度
- MyBatis 报错 Could not initialize class
- 网上订餐系统设计与实现(JSP+SSM+MySQL)
- js cookie 数组 存读
热门文章
- mysql 设置电脑时间设置_怎样设置mysql密码
- matlab摆线等时性程序,摆的等时性实验报告.doc
- 一打开就致命错误_CAD|致命错误|解决方法
- ios 悬浮窗_多达2000个频道,支持7天回看!这才是我要的看电视app(安卓/ios)...
- 北京计算机科学与技术学院,计算机科学与技术学院
- linux系统安装tv软件下载,达龙云电脑apk下载
- java 5 2_java 图形界面5.2
- python用表达式解密密文_基于Python解密仿射密码
- oracle更新统计信息执行计划,为准确生成执行计划更新统计信息-analyze与dbms_stats...
- linux集群巡检,Linux巡检