索引表和ES的一点点思考

elasticsearch简述与特性分析 文章目录1 Elasticsearch是什么1.1 搜索是什么1.2 数据库做搜索弊端1.3 互联网搜索,肯定不会使用数据库搜索。数据量太大。PB级。1.4 全文检索、倒排索引和Lucene2 Elasticsearch简述2.1.1 简介2.1.2 Elasticsearch的使用场景2.1.3 Elasticsearch的特点3 elasticsearch核心概念3.1 lucene和elasticsearch的关系3.2 elasticsearch的核心概念4 elasticsearch核心概念 vs 阅读详情

索引表设计


在电商项目中,物理库存系统是个极其重要的系统,订单支付后,就会开始来占用物理库存。一般情况下,库存系统都是要分库的,因为主要的操作是写操作,例如占用/释放/取消等写操作。使用分库可以降低数据库写的压力。尽管写操作为主,但是读操作也是有的。比如说,库存占用的时候,得先查询是否有库存,而这个查询操作并不都会带上分库因子(用于路由到具体的某个数据库),而是一些比较宽松的查询条件,这些查询条件对应的数据可能分布在不同的数据库上。这个时候为了查询的方便,会构建一个索引表。这个索引表是存在另外的单独的一个数据库中,不会再分库了的。

比如说一个查询商品的操作,只是按照价格去搜索的时候,如下图: 
这里写图片描述

这个时候就得从几个DB里面去获取数据,需要遍历DB,相当的麻烦。当然也可以为价格建立索引,加快查询速度,但是要知道,查询的时候,可能还根据其他条件来查询,像上下架状态,商品类别等,不可能都为这些查询条件建立索引,代价太大了,也不合理。引入索引表之后,则不同了。

这里写图片描述

根据查询条件从索引表中找出主键ID,再根据主键ID从多个数据库中查找数据。这样无论查询条件有哪些,通通只需要根据主键ID查找数据即可。当然索引表的设计不只是像上图那样设计,大概分三种。

1、查询字段+数据库主键

把查询字段放到索引表,还需要把对应的数据库主键ID也放置进去。当查询请求到来时,根据查询条件找出对应的数据主键,再根据数据主键路由到对应的存有完整业务数据的数据分库上。这种方案呢。索引表占用空间小,可以支撑很久。但是要找出业务数据,还是需要路由到分库上。另外,如果要把索引表的数据存储到ES搜索引擎上的话,这种方式就不行了。因为索引表中没有外部系统要的业务数据。所以当时的库存系统没有使用这种索引表设计方案。

2、查询字段+数据库主键+需要展示的业务字段

这种方案呢。当请求到来的时候,直接查询索引表即可。无需根据主键路由到分库了。同时如果要结合ES的话。可以直接把索引表的数据弄到ES上即可。后续直接让ES暴露查询接口即可。目前我在唯品会参与的物理库存项目中,是使用这种方式的。但是这个方案也有个缺点。就是索引表的体积比较大,后续数据量一大的话,也是个问题。能不能优化一下呢?

3、索引表拆分

上面说到的第二种方案,索引表的膨胀可能很快,可以考虑将索引表拆分。比如说:索引表只是保存查询条件和主键,而需要展示给外部系统的数据,另外存储在单独的表上。比如叫index_detail表。这个表拥有索引表的主键。这样的话,当查询请求到来的时候,先从索引表查询到主键,再根据主键从index_detail表中查询出数据。当然这样做的话。ES的数据来源就变成多张表了,不过这是可以接受的。


如何把业务数据写入到索引表


使用MQ

一般来说,构建索引数据是使用单独一个应用来做的。比如叫data-index域。这个域会从消息队列中读取消息,用于构建索引数据。当业务数据发生变化后,生产者发送MQ消息到队列上。 
这里的消息设计也分两种情况。一种是消息只是带有数据主键和操作类型(ADD/Update/DELETE),消费者拿到主键后再去DB获取完整的数据并插入到索引表中。另一种方案呢,是消息包含了大部分需要的字段,消费者拿到消息后直接把数据插入到索引表中。这两种消息设计,我在实际项目中都有用过。


直接操作DB

这种方案呢就比较粗暴,直接配置一个索引表库的数据源,当业务数据发生变化时,使用Mybatis或者JDBC把数据更新到索引表中。一般不建议这么做,一来构建索引数据的逻辑跟数据的CRUD操作融合在一起了。二来,操作其他数据库的数据,要么通过接口的方式,要么由单独的域来做。建议还是使用MQ的方式来构建索引数据。


如何把索引表数据弄到ES上


监听数据库表的数据变化

像在唯品会这边,自研了一个叫VDP的组件,使用storm job去监听索引表数据的变化,一旦有变化,就把数据同步到队列中,ES直接从队列中获取数据,并存储到ES上。 
这种方案的好处是,我们无需写任何代码,数据自动可以同步到ES上。


使用MQ

如果公司内部没有开发VDP这样的组件,可以通过发送MQ消息的方式来将索引表的数据同步数据到ES上。


让ES暴露CUD接口

另外一种方案是,让ES暴露CUD接口,用于同步索引表数据。但是这样就跟ES耦合在一块了。不太推荐这么做。


当索引表结合ES后,交互流程就变成如下的形式了。 
这里写图片描述


关于分页


在数据库分库的情况下,如果要分页展示数据的话,并且数据库数据的数量又特别庞大,可以借助ES,从ES获取分页数据。如果没有ES,只有索引表的话,那就直接在索引表中获取分页数据对应的ID,再从数据库中获取。


进一步的思考


1、ES不支持Group By这样的操作,所以在构建索引表的时候,可以事先计算好Group By的一些统计数据,并存储到索引表中; 
2、一些后台应用中,如果数据库表的数量已经很大,好几个亿了,并且查询的SQL还非常变态,用数据库已经无法支持了,那么可以使用ES,查询速度快,也支持一些统计操作; 

3、使用ES输出数据时,也有个坑。经常会拿到脏数据的。例如当数据发送变化后,构建索引数据并把索引数据同步到ES上是需要时间的,但是我们后台通常有将数据下架的操作,下架的操作操作完后,再次点击查询按钮,可能还是看到脏数据,因为数据同步到ES上没那么快。现在我还没想到很好的办法来解决这个问题。欢迎网友提些建议。

http://blog.youkuaiyun.com/linsongbin1/article/details/79410156

Elasticsearch入门必看:零基础快速理解核心概念 深入浅出讲解elasticsearch的核心机制与基本原理,帮助零基础用户快速掌握elasticsearch的索引、文档和搜索功能,轻松迈入分布式搜索的大门。 阅读详情

相关推荐

ElasticSearch 搜索原理之倒排索引

倒排索引作用 试想一下这个情景,你也记不清什么时候读过这个一段话:“老刘,老刘,食量大似牛,吃一个老母猪不抬头.”,只记得是红楼梦里面的台词,上学的时候语文老师还解读过,现在觉得特别有意思,想看看完整的这个故事。 于是你买了一本《红楼梦》,打开目录,定位不同章节的位置,然后按照顺序一章一章的遍历,找找哪一章里面有这么一句话。终于经过你不懈的努力终于找到这句话来自于“刘姥姥进大观园”哪一章。 这个检...

u014296502的专栏 440

es-索引详解

在 Elasticsearch 中,**索引(Index)**是核心概念之一,类似于关系型数据库中的“表”。索引用于存储、组织和检索文档(Document)。

draymond7107的博客 1832

后端必备:Spring Data Elasticsearch的入门到精通之路

在后端开发中,快速检索是一个高频需求——比如电商网站的"商品搜索"、日志系统的"错误排查"、知识库的"文档查询"。关系型数据库(如MySQL)的B+树索引擅长"精确查询",但面对"模糊搜索"“多条件筛选”"实时排序"等场景时,性能会急剧下降。ES作为一款分布式全文检索引擎,通过"倒排索引"解决了这一问题;而SDES则是Spring生态中简化ES操作的工具,让开发者无需编写复杂的ES客户端代码,就能用"Spring风格"的方式操作ES。ES核心概念(索引、文档、映射、查询DSL)的通俗解释;

AI架构全栈开发实战笔记 1150

日常工作之 Elasticsearch 常用查询语句汇总

在使用 es 的过程中,总是会用到 es 的查询语句,考虑到一些 es 使用过程中语句没那么频繁,就会导致总是用起来的时候会忘记。那么为了方便用的时候可以快速查询到想用的内容,这里主要对 es 日常用到的查询语句 做一个总结展示,记录查询语句方便后续用到时查询。

csdn565973850的博客 3472

告别第三方插件:官方Fused Library如何重塑Android库的合并与发布流程

本文详细介绍了Android官方推出的Fused Library如何替代第三方fat-aar插件,优化Android库的合并与发布流程。通过原生支持、智能依赖管理等优势,Fused Library解决了版本兼容性、依赖传递等核心痛点,提供了更稳定高效的开发体验。文章还提供了迁移实操指南和工程实践建议,帮助开发者顺利过渡到官方方案。

weixin_42561040的博客 252

无人机基本组成部件

无人机基本组成部件

qq_37410522的博客 1万+

ES的索引结构与算法解析

作为搜索引擎的一部分,ES自然具有速度快、结果准确、结果丰富等特点,那么ES是如何达到“搜索引擎”级别的查询效率呢?首先是索引,其次是压缩算法,接下来我们就一起了解下ES的索引结构和压缩算法

JDDTechTalk的博客 857

基于STM32电压检测和电流检测

1.可测量直流电压0~36V,适用于低电压电子电路中。 2.可测量直流电0~5A范围内,目前采用的ACS712测量量程为5A,该模块有多个量程,可测量到20A 3.实时功率监测 4.电池电量监测(采用电压压降方式计算)

weixin_44453694的博客 6万+

ES 索引

ES 索引 Elasticsearch(以下称之为 ES)是一款基于 Lucene 的分布式全文搜索引擎,擅长海量数据存储、数据分析以及全文检索查询。 Lucene 是 Apache 下的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,它是 ES 实现全文检索的核心基础,索引文档以及搜索索引的的核心流程都是在 Lucene 中完成的。 基础结构 MySQL ES database数据库 inde

萝卜_7 1万+

面渣逆袭之Java基础篇2

Tips:所有的关键字都是小写的,在 IDE 中会以特殊颜色显示。default 这个关键字很特殊,既属于程序控制,也属于类,方法和变量修饰符,还属于访问控制。①在程序控制中,当在 switch 中匹配不到任何情况时,可以使用 default 来编写默认匹配的情况。②在类,方法和变量修饰符中,从 JDK8 开始引入了默认方法,可以使用 default 关键字来定义一个方法的默认实现。③在访问控制中,如果一个方法前没有任何修饰符,则默认会有一个修饰符 default,但是这个修饰符加上了就会报错。

m0_73804764的博客 1108

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

es对已有的索引给主键_索引表和ES的一点点思考

索引表设计在电商项目中,物理库存系统是个极其重要的系统,订单支付后,就会开始来占用物理库存。一般情况下,库存系统都是要分库的,因为主要的操作是写操作,例如占用/释放/取消等写操作。使用分库可以降低数据库写的压力。尽管写操作为主,但是读操作也是有的。比如说,库存占用的时候,得先查询是否有库存,而这个查询操作并不都会带上分库因子(用于路由到具体的某个数据库),而是一些比较宽松的查询条件,这些查询条件对...

weixin_39612733的博客 579

Android安全支付(1)-整体架构-keymint

(1)接口定义hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl。keymint是keymaster v4之后的替代设计。所以android 15上最好采用keymint的接口进行硬件功能的对接。同时,我们会集成一款紫光的芯片。3.可以用keyStore.getKey()来获取存储在keyStore中的数据进行加密和解密。四、关于keymint的接口定义和具体实现。

Android系统开发-VR OS-系统安全隐私 1767

深入探讨PageRank(四):PageRank的危机及搜索引擎的未来

深入探讨PageRank(四):PageRank的危机及搜索引擎的未来 作为10多年前搜索引擎代表性的技术成果之一,PageRank创造了Google辉煌的10年,同时也缔造了Google搜索的时代。然而,互联网越是往前发展,搜索服务越趋向于多元化、个性化、社区化和垂直化等,传统的通用搜索引擎越来越不能满足不同人群、不同习惯、不同场景的搜索需求,精而深的垂直搜索引擎的兴起对传统搜索市场引发

愤怒的小狐狸----博客专栏 7211

CAPL诊断功能实现

UDS(Unified Diagnostic Services)是一种用于汽车电子系统诊断的标准协议。它定义了一系列诊断服务,用于读取和写入车辆电子控制单元(ECU)中的数据,以及处理诊断故障码(DTC)。UDS协议通常运行在CAN总线上,使用ISO 15765-2(ISO-TP)协议进行数据传输。通过本文的学习,读者应该对CAPL诊断功能实现有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1516

滴滴数据分析80道面试题及参考答案

常见的模型评价指标有准确率、召回率、F1 值、均方误差、均方根误差、R 方等。准确率是指模型预测正确的样本数占总样本数的比例,它反映了模型预测的准确性。召回率是指模型预测为正例的样本中实际为正例的比例,它衡量了模型对正例的捕捉能力。F1 值是准确率和召回率的调和平均数,综合考虑了两者的平衡。均方误差是预测值与真实值之差的平方的平均值,它衡量了模型预测值与真实值的平均偏离程度。均方根误差是均方误差的平方根,与均方误差类似,但更直观地反映了误差的大小。

大模型大数据攻城狮的专栏 1695

搜索引擎

一、把搜索引擎当作计算器   如果有人告诉你可以把搜索引擎当作计算器,请你不要惊讶,这是千真万确的事。近日,Google就向用户们提供了这样的功能:在其搜索服务中增加了一个算术计算器。用户直接在搜索框中键入算术表达式(例如“9*6-3”)即可获得答案。如果安装有Google的工具栏软件则更加可以直接在浏览器相应位置键入,省去了访问Google主页的时间。此外,该计算器不仅能完成简单的加减乘除运算,

u012309366的专栏 777

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Elasticsearch常用命令

Elasticsearch查询语法 cat API 查询当前ES集群相关的消息,包括集群中index数量、运行状态、当前几圈所在的ip,目的在于将查询的结果以更有好的方式输出 _cat: 输出_cat api中所有支持的查询命令; _cat health: 检查es集群运行的状态 _cat count: 可以快速的查询集群或者index中文档的数量 _cat indices: 查询当前集群中所...

MuErHuoXu的博客 366

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ElasticSearch为啥那么快?总结一下

思考问题: 为什么搜索是近实时的? 为什么文档的CRUD是实时的? 下图是云上一个集群 集群中有多个节点 索引可以跨节点组成 在一个索引下,存储着分片,分片实际上是Lucene Index. Shard分片里面存储着segment,可以看成是Lucene内部的mini-index 那么segment有啥呢? Inverted Index 主要包括两部分:倒排索引 1.一个有序的数...

小凯的博客 2050

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

elasticsearch 数据类型_ElasticSearch相关概念(术语)

1 概述Elasticsearch是面向文档(document oriented)的,这每味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下:2 Elasticsearch核心概念索引 ...

weixin_39870132的博客 131

分布式系统实战:Elasticsearch搜索与RabbitMQ消息队列核心原理剖析

Elasticsearch(读与搜):它是数据检索与分析引擎。定位是解决海量数据的查询性能问题和聚合统计分析。它的侧重点是内存消耗、索引构建和搜索响应速度。它不保证强一致性,追求的是最终一致性。RabbitMQ(写与流):它是消息流转的管道与缓冲池。定位是解决系统耦合、请求削峰填谷和微服务间的异步通信。它的侧重点是消息可靠性、吞吐量(QPS)和死信/延迟处理能力。架构师视角建议:千万不要把 RabbitMQ 当作数据库使用(大量消息堆积会导致内存 OOM);

pann_zxw的博客 427

elasticsearch 实体类日期类型_ElasticSearch相关概念(术语)

1 概述Elasticsearch是面向文档(document oriented)的,这每味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下:2 Elasticsearch核心概念索引 ...

weixin_39875832的博客 275
上一篇: DFS block丢失过多进入安全模式(safe mode)的解决方法
下一篇: 记一次DataNode慢启动问题
visual2015
博客等级 码龄11年 12粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值