基于elasticsearch解决分库分表后跨库查询和分页查询的难题

为了解决分库分表后,跨库查询和分页查询的难题,基于CQRS思想,采用es作为查询的存储中心。

ES基础名词解释

文档(document):索引和搜索时使用的主要数据载体,包含一个或多个存有数据的字段。

字段(field):文档的一部分,包含名称和值两部分。

词(term):一个搜索单元,表示文本中的一个词。

标记(token):表示在字段文本中出现的词,由这个词的文本、开始和结束偏移量以及类
型组成。




文档索引到es的分片中需要经历几个非常重要的加工环节,每个环节对索引和查询都有不用的影响。

此过程中的所有节点均可以使用自定义的方式来处理,不同定义配置,得到的结果不一样。当然我们只需了解官方建议,保证第一版本需求完成的实现方式。

1.索引结构。首先需要定义索引的结构,如树形结构,组合方式或者父子关系等匹配关系型数据库的结构。

2.映射。映射跟索引结构关联比较大,两者结合定义文档字段解析方式,如某个字段按字符串解析,某个字段按对象解析等

3.分词器。对输入的文档进行拆分,如一个长的文本 按词拆分。经过分词器后输出的是标记流。

4.过滤器。如小写过滤,同义词过滤等复杂转换匹配,保证文档按统一方式解释。

5.路由。把文档索引到不同分片上,负载 ,备份等需要。

针对关系型数据处理的要求,我们需要重点关注的是:

1.索引结构的建立,使用组合或者父子关系来索引文档,并且做一些适当冗余(如果需要)。

2.路由使用。由于父子关系索引的文档默认会分配到不同的分片上,影响查询效率。需要自定义路由的方式来索引和查询

3.其他各个加工环节影响性能的环节,可以在后续版本深入研究。

4.不同的索引方式对应的查询方式有差别。

5.注意用户使用时候怎么能傻瓜化

索引文档方式的特点的官方说明和对比图

规范化(应用端链接)

非规范化(冗余)

嵌套

父子


数据结构 查询效率 数据修改 适用范围
规范化(按照数据库的表结构) 查询慢,join多 支持 数据规范,结构清晰,数据量小,对查询速度要求不高
非规范化(数据冗余方式) 比规范化快,通过冗余增加查询维度 支持,需要保持冗余格式 增加冗余字段,以最小的代价完成查询维度查询
嵌套方式 快,单一文档无join 修改子项需要全部更新 子项多且不变,查询速度要求高
父子关系方式 父子分别查询快,支持has child、has parent等 可单独修改父项和子项 子项多,经常做增加修改变更



请关注:https://github.com/chenjy16


转载于:https://juejin.im/post/5ab87cbe5188255572085e30

你可能感兴趣的:(基于elasticsearch解决分库分表后跨库查询和分页查询的难题)