相关文章推荐
犯傻的饺子  ·  if 和 switch 語句 - ...·  10 月前    · 
帅呆的板凳  ·  spring cloud gateway ...·  12 月前    · 
帅气的稀饭  ·  博后招募 | ...·  1 年前    · 
深沉的黄豆  ·  FOR JSON ...·  1 年前    · 

随着业务发展跨表join查询需求越来越多,系统的慢查询不断报出,引入 ElasticSearch 来实现聚合查询势在必行。ES是一个基于 Lucene 的搜索引擎,通过将业务主表及辅表的索引字段及需要like字段同步到ES里,每张表的索引字段最终汇总成一个联合索引,来实现多个表的跨表搜索。

检索需求响应时间均值 20ms 以内,对于命中缓存的在 2ms 以内返回

单 Type 与多 Type(多 Index)

在ES中一个 Index 可以理解为一个库,一个 Type 可以理解为一张表,但从6.0.0 版本起已废弃:一个 Index对于多个Type(只能一对一),但考虑到有一些业务还在使用5.x版本。

单 Type 多 Type(多 Index)
优点

一次请求即可将目标信息全量返回;

拆分冷热隔离维护成本可控;

可以做到索引字段与表结构一一对应(直观简单);

数据同步隔离单一;

缺点

数据同步成本高一些;

数据聚合时有一致性问题;

获取数据时候需要进行数据聚合,比如一次跨 5 张表索引联查,需要先分别取出 5 张表的数据,然后做一次交集。性能会有影响;

当数据做冷热隔离,数据拆分时候多 Type 的拆分和维护成本反而更高;

小结,若业务场景宜满足为了性能尽可能的采用 单 Type方案!

索引字段数量

由于业务主表及其扩展信息字段较多,如果将这些信息全量同步到 ES 会导致很多问题:

  • 索引字段过多,索引文件也会随之变大,检索效率会受到影响
  • 不需要索引的字段过多,也会导致新的io问题

so,尽可能的自定义mapping,不要存储与搜索无关的数据,而下面这个transRouteAndProducts节点(json特别大)不分词不索引仅存储也是不可取的

"mappings": { "static_line": { "properties": { "productId": { "type": "keyword" "productType": { "type": "keyword" "startStationCode": { "type": "integer" "endStationCode": { "type": "integer" "status": { "type": "keyword" "startHubId": { "type": "keyword" "transRouteAndProducts": { "enabled": false

那获取详情呢,比如获取的订单号列表到mysql各个扩展表去获取具体信息,数据组装效率低下怎么破?

一次完整的订单列表拉取时间=数据检索时间+数据组装时间,而数据组装就算是批量获取,也要去取 N(假如有 N 张订单扩展表)次,即使并行去取也不够高效!

存宽表是个不错的方案,纠结该多宽也十分讲究!

建议:一个宽表维护业务主表的基本信息及其强依赖的扩展信息。

引入 Hbase 来为详情数据组装 Hbase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。可以通过 MapReduce 来处理 HBase 中的海量数据。

此时我们可以将宽表存入至Hbase,历史数据采用 BulkLoad 导入,增量数据采用消息同步写入,以订单号为 rowKey 为订单号。

那如何保证ES和Hbase的实时性与一致性呢?

可采用 Change Data Capture Solution方案 ,监听 binlog 然后同步到消息队列中,业务消费处理同步到 Es 和 Hbase。对报警监控的指标进行关注,失败重试补偿就即可。

建立实时性的监控指标(差值)

一个消息的处理时间:binlogTime->reviceMqTime->bunsProcessTime->addEsOrHbaseTime

如果不能保证业务消费的幂等性,那么消息的乱序,数据的重放监控补偿等等就会很被动。这里有几种幂等思路:可以参阅我的 另一篇文章幂等解疑

elasticsearch是解决跨表join查询很好的手段。

随着业务发展跨表join查询需求越来越多,系统的慢查询不断报出,引入ElasticSearch 来实现聚合查询势在必行。ES是一个基于 Lucene 的搜索引擎,通过将业务主表及辅表的索引字段及需要like字段同步到ES里,每张表的索引字段最终汇总成一个联合索引,来实现多个表的跨表搜索。性能要求检索需求响应时间均值 20ms 以内,对于命中缓存的在 2ms 以内返回单 Type 与... 从7.5.0.0开始,路径/_sql更改为/_nlpcn/sql ,路径/_sql/_explain更改为/_nlpcn/sql/explain 。 请注意,该项目不再处于活动开发中,已弃用,请使用AWS支持并在Apache 2下获得许可的正式版和 。 1.7.6 2.0.0 2.1.0 2.1.1 2.1.2 2.2.0 2.2.1 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 5.0.1 5.1.1 5.1.2 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.4.0 5.4.1 5.4.2 5.4.3 5.5.0 5.5.1 5.5.2 5.5.3 5.6.0 5.6.1 5.6.2 5.6 > = 5.0,<6 xss=removed xss=removed> [ CrCms\ ElasticSearch \LaravelServiceProvider::class, 如果您想在配置文件中进行配置更改,则可以使用以下Aritsan命令将其发布: php artisan vendor:publish
在上一 elasticsearch 实践 跨表 join 查询 中讲过2种方式,其实并不全面。 ES 还有2种方法来处理数据实体间的关联关系:N es ted objects(嵌套文档)和Parent/child relationships(父子文档)。 1. Application-side join s(服务端 Join 或客户端 Join ) 这种方式,索引之间完全独立(利于对数据进行标准化处理,如便于上述两种...
docker pull justwatch/ elasticsearch _exporter:1.1.0 docker run --rm -p 9114:9114 justwatch/ elasticsearch _exporter:1.1.0 示例docker-compose.yml : elasticsearch _exporter : image : justwatch/ elasticsearch _exporter:1.1.0 command : - ' -- es .uri=http:// elasticsearch :9200 ' r es tart : always ports : - " 127.0.0.1:9114:9114 " Kubernet es 您可以在的稳定图表存储库中找到舵图。 注意:导出程序会在每个刮擦上从 ElasticSearch 群 他们的区别: 由于存储结构的不同,n es ted和parent-child的方式有不同的应用场景 n es ted 所有实体存储在同一个文档,parent-child模式,子type和父type存储在不同的文档里。 所以 查询 效率上n es ted要高于parent-child,但是更新的时候n es ted模式下, es 会删除整个文档再创建,而parent-chi...
Elasticsearch 中, Join 可以让我们创建parent/child关系。 Elasticsearch 不是一个RDMS。通常 join 数据类型尽量不要使用,除非不得已。那么 Elasticsearch 为什么需要 Join 数据类型呢? 在 Elasticsearch 中,更新一个object需要root object一个完整的reindex: 即使是一个field的一个字符的改变 即便是n es t......
用Grafana进行 Elasticsearch 监控 该存储库包含端到端全面监视 Elasticsearch 集群所需的一切。 基于在全球范围内调试和稳定许多 Elasticsearch 集群的经验, Elasticsearch Monitoring的制定和不断更新和改进。 使用X-Pack监控 Elastic的X-Pack Monitoring随代理一起提供,该代理将度量标准传送到用于监视的集群。 这是一种基于推送的方法,需要将X-Pack插件安装到您的集群中。 要使用该路由,请按照此处的安装说明进行操作: : 使用提供的脚本 另一种方法是使用此存储库随附的 elasticsearch .monitoring脚本,您可以在 elasticsearch .monitoring/fetch_stats.py找到该脚本。 您可以使用python直接执行此操作,也可以在此存储库中使用Dockerfi
在这 资源中,我们将详细介绍如何使用DSL来构建复杂的 查询 语句,以满足各种搜索需求。首先,我们将学习DSL的基本结构和语法规则,包括 查询 、过滤器、聚合和排序等核心概念。通过深入了解DSL的语法,您将能够灵活地组合不同类型的 查询 条件,以实现精准的数据检索。接下来,我们将探讨DSL的高级特性和用法。我们将讨论全文搜索、模糊 查询 、正则表达式 查询 和范围 查询 等常用 查询 方式,以及它们在DSL中的具体实现。同时,我们还将介绍布尔 查询 、should 查询 和must_not 查询 等与逻辑关系相关的 查询 语句,帮助您更好地理解DSL的灵活性和强大之处。此外,我们还将深入讨论聚合操作在DSL中的应用。通过使用聚合 查询 ,您可以对检索结果进行分组、统计和计算等操作,以获取更全面的数据分析结果。我们将详细介绍诸如terms聚合、date_histogram聚合和range聚合等不同类型的聚合操作,帮助您掌握DSL在数据分析方面的强大功能。最后,我们将分享一些实用技巧和最佳 实践 ,帮助您充分发挥DSL在 Elasticsearch 中的优势。我们将探讨性能优化、 查询 调试和索引优化等关键主题,以提升 查询 效率和搜索准确性。
跨度��询是低级位置 查询 提供专家控制的秩序和接近指定的条款。这些通常是用于实现特定 查询 法律文件或专利。 跨度 查询 不能混合(除了non-span 查询 span_multi 查询 )。 这组 查询 : span_term 查询 的等效 term 查询 但与其他跨度 查询 使用。span_multi 查询 包装 term, range, prefix, wildcard Elasticsearch 多表关联问题是讨论最多的问题之一,如:博客和评论的关系,用户和爱好的关系。 多表关联通常指:1对多,或者多对多。 本文以星球问题会出发点,引申出 ES 多表关联认知,分析了4种关联关系的适用场景、优点、缺点, 希望对你有所启发,为你的多表关联方案选型、实战提供帮助。 1、抛出问题 1.1 星球典型问题 1.2 社区典型问题 1.3 QQ群典型问题 关系型数据库...