十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Elasticsearch的文档的存储路由是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
为内黄等地区用户提供了全套网页设计制作服务,及内黄网站建设行业解决方案。主营业务为做网站、成都网站建设、内黄网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
以 Elasticsearch 7.9.2 为准。
在一个索引中创建文档时,如何确定放到哪个分片中?
潜在 3 个方式:
随机
将文档 id 和分片编号的对应关系保存在数据库
计算代替存储:按照某种算法计算出分片编号
如果采用第 1 种方式:
则创建时省事(获取随机数即可),但在查询文档时需要在多个分片中寻找文档。
如果采用第 2 种方式:
则实现起来简单、直接、可靠,但在数据量大的时候表会很大,查询比较慢。
如果采用第 3 种方式:
创建和查询时需要进行一次计算,好处是不必在维护对应关系。
ES 采用的是第 3 种方式。
PUT /<索引名>/_doc/?routing=
如上,在创建文档时指定 id 和 routing,则此文档被放到的分片编号为:
es_hash(routing) % 分片数
如果不指定 routing,则在计算时把文档 id 作为 routing。
指定 routing 的文档创建之后,会有一个 _routing 字段:
{ "_index": "myindex", "_id": "aaa", "_routing": "myrk", "_source":// 其他字段 }
假定:
某索引有 n >= 2 个分片。
es_hash("a") % n == 0
es_hash("r") % n == 1
依次执行:
PUT /the_index/_doc/a PUT /the_index/_doc/a?routing=r
则 ES 中会出现 2 个 id 为 a 的文档。这绝不是使用者所期望的。
造成这样的原因是:一个 ES 分片其实是一个 Lucene 索引。同一个 Lucene 索引内部,文档的 id 保证互不相同,但多个 Lucene 索引之间无法保证这一点。
避免方式:
对于某 id 的文档,要使用 routing,就一直使用,不然就一直不使用。
关于Elasticsearch的文档的存储路由是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。