ELK合集持续更新(十二):Elasticsearch关键术语之分布式搜索
2020-03-28 19:57
288 查看
Elasticsearch关键术语 系列博文 目的只用来了解概念 ; 其中 涉及到的配置和使用 是为了方便日后使用时查询的
分布式搜索
分布式搜索的运行机制
第一阶段 Query
例如 3个节点的es集群有3个主分片 1个副本 节点收到请求后 会以coordinating node的身份 在6个主副分片中随机选择3个分片 发送查询请求
被选中的分片执行查询 进行排序 然后每个分片都会返回from+size个排序后的文档id和排序值 给coordinating节点
第二阶段 Fetch
coordinating node会将query阶段 从每个分片获取的排序后的文档id列表 重新排序 选取from到from+size个的文档的id
以multi get请求的方式 到响应的分片获取详细的文档数据
引发的问题及解决
相关性算分不准
问题
每个分片都基于自己的分片上的数据进行相关度计算 会导致打分偏离 特别是数据量很少时 相关性算分在分片之间是相互独立的 如果主分片数越多 相关性算分会越不准
解决
-
方式一 调节主分片数 (推荐)
配置
数据量不大时 将主分片数设置为1
-
数据量大时 保证文档均匀分散在各个分片上 就不会出现算分偏差
方式二 URL中指定参数 (不用)
原理
到每个分片把各分片的词频和文档频率进行搜集 然后完整的进行一个相关性算分 耗费CPU和内存 性能低配置
-
搜索的URL中添加参数 “_search?search_type=dfs_query_then_fetch”
深度分页的性能
问题
因为每个分片上需要查的文档个数 = from + size 所以最终协调节点需要处理number_of_shard*(from+size)个文档个数 深度分页就是痛点了
示例 : 当一个查询 from=990 size=10 ES会在每个分片上都先取1000个文档 然后通过coordinating node聚合所有结果 最后再通过排序选取前1000个文档 展示990到1000这10条数据 页数越深 占用内存越多
解决
- 搜索语句使用 “search_after”:[13,“xsdafvwrevwerbvtwer”] 避免深度分页性能问题 作用 实时获取下一页文档信息 不能指定from 只能往下翻
-
通过唯一排序值定位
ES默认限定到10000个文档 想查询10001会报错
解决
- settings中设置 index.max_result_window
参考
阮一名资料
官方文档
百度
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- ELK合集持续更新(十四):Elasticsearch关键术语之Aggregation聚合
- ELK合集持续更新(十三):Elasticsearch关键术语之Analysis分词
- [Elasticsearch] 分布式搜索
- 分布式搜索elasticsearch 索引文档的增删改查 入门
- 分布式搜索elasticsearch 环境搭建
- [Elasticsearch] 分布式搜索
- 熟悉了HDFS的基本架构,了解这方面的专业术语(持续更新)
- 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能
- 分布式搜索elasticsearch集群管理工具head
- 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页
- 分布式搜索elasticsearch 索引文档的增删改查 入门
- Elasticsearch(七)-分布式搜索
- 分布式搜索elasticsearch java API 之(八)------使用More like this实现基于内容的推荐
- 分布式搜索elasticsearch------索引修复
- 分布式搜索elasticsearch配置文件详解
- 分布式搜索elasticsearch 基本概念
- elasticsearch (基于Lucene的搜索服务器,分布式,restful接口) 基础概念
- Elasticsearch-分布式日志搜索
- ELK合集持续更新(二十二):Elasticsearch集群的数据备份和迁移
- 分布式搜索elasticsearch java API 之(七)------与MongoDB同步数据