美文网首页
ElasticSearch中index的设计

ElasticSearch中index的设计

作者: 小飞侠fayer | 来源:发表于2019-06-29 13:20 被阅读0次

    1 场景

    场景:需要将40G数据从Mysql迁移到es,数据内容按照产品、语言进行分类,项目和语言都会不断的新增。
    使用方式:同一产品多语言查询、跨产品查询关键信息、同一语言查询关键字等。

    2 拆分

    如何拆分主要从容量、速度、查询、入库、后续扩展、准确性等维度进行考虑。

    2 .1 容量

    es在按照index存储数据时,默认采用的是5个分片(官方推荐分片数=1.5~3倍的节点数),每个分片不存储超过30G数据(es推荐的最大JVM空间)。

    我们目前大概拥有40G数据,即使不做拆分,5个分片容量足够用很长时间,如果不够的话,可以动态进行扩容,新建其他index解决(如按照时间划分,每年存一个index)。

    如果拆分的话,一般es一次查询最多不能超过1000个分片(不建议更改),若按照产品与语言划分,他们的总数不能超过200种(即200个index)。

    2 .2 速度

    es的查询过程为先找到指定的index对应的所有分片,并发对每个分片请求并获得结果,最终在请求节点对每个分片的结果进行合并。
    针对目前的es集群状态,即:一个8g16核的节点和一个1g1核的节点
    a) 全语言查询
    如果按照语言划分的话(假定30种),每次需要对150个分片的结果并发查询,然后统一进行合并,
    不划分的话,每次对5个分片的结果进行查询并合并。
    理论上,只要cpu负荷和内存未告警的话,由于各个分片上的查询结果是并发的,拆分查询速度更快。
    b)指定语言或产品查询
    拆分index可以减少查询的分片总数,提高查询效率。

    2 .3 查询

    es查询条件包括两个部分:head和body
    body部分主要是针对具体的条件进行过滤,和index拆分没有关系。
    head部分需要指定相应的index,因此,如果对index按照语言或者产品进行过滤时,查询效率更高,只是在生成index时,按照一定规则生成即可。

    2 .4 入库

    拆分的话,需要根据记录信息分别生成index,简单的按产品或语言拆分几乎没有影响。

    2 .5 性能瓶颈扩展

    不管拆分与否,新增节点都能提高搜索性能

    2 .6 查询结果的准确性

    主分片对不同分片评分结果汇总,是根据每条记录中词条的出现频率和权重进行计算,即限定在document层面,和分片无关,因此拆分与否,不影响查询结果的准确性

    3 结论

    如果单个index在查询时,可以控制在1s之内,则不拆分更简单。
    如果单index查询较慢,拆分在查询单产品或语言时会提高查询速度,如果产品可能越来越多,全品类查询时,可能会超过1000分片,建议按照语言进行分类。

    相关文章

      网友评论

          本文标题:ElasticSearch中index的设计

          本文链接:https://www.haomeiwen.com/subject/eaqpcctx.html