【Elasticsearch源码】写入源码分析(二)

接上一篇:【Elasticsearch源码】写入源码分析(一)

如果需要自动创建索引,则需要遍历bulk的所有index,然后检查index是否需要自动创建,对于不存在的index,则会加入到自动创建的集合中,然后会调用createIndex方法创建index。index的创建由master来把控,master会根据分片分配和均衡的算法来决定在哪些data node上创建index对应的shard,然后将信息同步到data node上,由data node来执行具体的创建动作。

  // Step 1: 对bulkRequest进行过滤,获取所有的索引名。主要为opType和versionType,其中opType为索引操作类型,支持INDEX、CREATE,UPDATE,DELETE四种。DELETE请求如果索引不存在,不应该创建索引,除非external versioning正在使用。
            final Set<String> indices = bulkRequest.requests.stream()
                .filter(request -> request.opType() != DocWriteRequest.OpType.DELETE
                    || request.versionType() == VersionType.EXTERNAL
                    || request.versionType() == VersionType.EXTERNAL_GTE)
                .map(DocWriteRequest::index)
                .collect(Collectors.toSet());
// Step 2: 对各个索引进行检查,indicesThatCannotBeCreated用来存储无法创建索引的信息Map,autoCreateIndices用来存储可以自动创建索引的Set。
//索引是否可以正常自动创建,主要检查:1.是否存在该索引或别名(存在则无法创建);2.该索引是否被允许自动创建(二次检查,为了防止check信息丢失);3.动态mapping是否被禁用(如果被禁用,则无法创建);4.创建索引的匹配规则是否存在并可以正常匹配(如果表达式非空,且该索引无法匹配上,则无法创建)。
            final Map<String, IndexNotFoundException> indicesThatCannotBeCreated = new HashMap<>();
            Set<String> autoCreateIndices = new HashSet<>();
            ClusterState state = clusterService.state();
            for (String index : indices) {
   
                boolean shouldAutoCreate;
                try {
   
                    shouldAutoCreate = shouldAutoCreate(index, state);
                } catch (.....) {
    .....}
                if (shouldAutoCreate) {
   
                    autoCreateIndices.add(index);
                }
            }
// Step 3: 如果没有索引需要创建,直接executeBulk到下一步;如果存在需要创建的索引,则逐个创建索引,并监听结果,成功计数器减1.失败的话,将bulkRequest中对应的request的value值设置为null,计数器减1,当所有索引执行"创建索引"操作结束后,即计数器为0时,进入executeBulk。
            if (autoCreateIndices.isEmpty()) {
   
                executeBulk(task, bulkRequest, startTime, listener, responses
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值