首页 > 其他分享 >elasticsearch实践篇:跨表join查询

elasticsearch实践篇:跨表join查询

时间:2023-04-02 15:32:56浏览次数:37  
标签:join 数据 type 索引 跨表 elasticsearch Hbase Type ES


随着业务发展跨表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,数据,type,索引,跨表,elasticsearch,Hbase,Type,ES
From: https://blog.51cto.com/alex/6164857

相关文章

  • Elasticsearch 学习-Elasticsearch优化,硬件选择,分片策略,写入优化,内存设置,重要配置
    Elasticsearch学习-Elasticsearch优化,硬件选择,分片策略,写入优化,内存设置,重要配置6.1硬件选择Elasticsearch的基础是Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在ES的配置文件../config/elasticsearch.yml中配置,如下:#----------------------------......
  • Elasticsearch 学习- 分片原理,倒排索引,文档搜索,文档分析,内置分析器,指定分词器,IK分词器
    Elasticsearch学习-分片原理4.6分片原理​ 分片是Elasticsearch最小的工作单元。但是究竟什么是一个分片,它是如何工作的?​ 传统的数据库每个字段存储单个值,但这对全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值的能力。最好的支......
  • Elasticsearch 学习-Elasticsearch进阶-索引,文档,字段,映射,分片,副本,分配,系统架构,分片控
    Elasticsearch学习-Elasticsearch进阶4.1核心概念4.1.1索引(Index)​ 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个......
  • Elasticsearch 学习-Linux单机和集群安装
    Elasticsearch学习-Linux单机和集群安装3.3linux集群安装3.3.1软件下载软件下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-03.3.2软件安装1)解压软件将下载的软件解压缩#解压缩tar-zxvfelasticsearch-7.8.0-linux-x86_64.tar......
  • 开发一个二方包,优雅地为系统接入ELK(elasticsearch+logstash+kibana)
    去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入各个自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易。这篇文章主要介绍如何编写二方包,并整合到各个系统中。先介绍整个ELK日志......
  • Spatial Join,空间连接
    WelearnedhowtousetheSpatialJointooltoattachinformationfromoneattributetabletoanotherbasedonthespatialrelationshipofthefeaturesinvolved.Itisaveryusefultoolthatcanhelppeopleworkefficiently.However,Iamnotveryfam......
  • 你还在手写 join 联表查询?MyBatis-Plus 这样写太香了!
    使用方法安装Maven<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.2.4</version></dependency>Gradleimplementation'com.github.yulic......
  • elasticsearch手动控制分片分布
    elasticsearch可以通过rerouteapi来手动进行索引分片的分配。不过要想完全手动,必须先把cluster.routing.allocation.disable_allocation参数设置为true,禁止es进行自动索引分片分配,否则你从一节点把分片移到另外一个节点,那么另外一个节点的一个分片又会移到那个节点。......
  • elasticsearch更改node id生成方法
    集群中节点的id是由discovery定义的,默认es有两种实现方式,一种是org.elasticsearch.discovery.local.LocalDiscovery表示把es的节点启动在同一个jvm的环境下,这样就可以通过AtomicLong来进行数字递增的id生成。另一种是org.elasticsearch.discovery.zen.ZenDiscovery它是分......
  • SQL Server – 执行计划和各种 join 方式 (Execution plan & Join Pattern)
    What,When,Why?什么是ExecutionPlan?Executionplan里头包含了query执行时的各做information,比如IO速度,查找了多少rows等等为什么要看ExecutionPlan?当query慢的时候,可以通过分析executionplan,知道它为什么慢,然后做优化.怎样优化?优化的方法有......