行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。

多条件多维度查询

Elasticsearch | 作者 chibang | 发布于2019年09月21日 | 阅读数:4196

有个业务场景,关系数据库中涉及的表有7个左右(表结构互不相同),平均每个表的数据量在500W左右,通过ES对这7个表数据做多条件、多维度的组合查询,包含聚合后按照数量查询(聚合目前是在应用程序中计算后写入ES)。该场景下在ES创建中对这7张表创建了nested结构的索引来实现需求,但发现该模式下扩展性太难,后续要加入新的表作为组合条件,很难实现。问下各位大神,有没有更好的方案支持该场景下的查询,要求查询响应快、扩展性高。谢谢
已邀请:

doom

赞同来自: laoyang360

个人的理解:ES很多性能很强,用到关联关系的表需要慎重;严重影响到性能;一般多表查询的处理策略有4中:
1.建多个库,手工代码做关联;优点:各表相互独立,扩展容易;缺点:业务逻辑都需要自己处理,关联层数多,数据量大的搜索不适合
2.宽表,合并所有的字段;优点:关联关系搜索方便,而且数据量大不影响;缺点:极不容易扩展,删除和更新复杂,很难维护;单文档容量大,有效字段比率少,影响IO性能;
3.父子文档:有层次关联的做父子文档;优点:可以做层次关系的关联,而且不用关联的时候相互独立,增加修改删除方便;缺点:关联关系也是昂贵的开销,影响性能;能够用于增删频繁的,查询少的业务;
4.nested嵌套,相当于一个java中字段为list对象,优点:查询性能好,没有很大关联关系的开销;缺点:单文档大,增加修改删除,很频繁不合适;适合用于很少对表做修改的业务;
 
ES多表查询,第一需要分析业务: 表的关联关系,每个表的增删状况,查询的的复杂程度,每个表的数据量级;
第二:多表方案选项,跟1的业务息息相关; es都能做,但是都不强,需要自己挑一个最合适的;
第三:后期维护方案:数据量的扩展,数据增删;能达到一个什么量级,这也关系到多表的选型方案;
 
一般上面,宽表和单表,大多数业务不适合,不建议使用;父子文档和嵌套,选型区别是:1. 修改频繁用父子文档,不频繁的用嵌套;2. 经常需要关联查询,优选嵌套;偶尔用一下关联用父子文档;
          

要回复问题请先登录注册