elasticsearch索引index之put mapping的设置分析-mile米乐体育

目录

  • mapping的设置过程
    • put mapping
    • updatetask响应
  • 总结

mapping的设置过程

mapping机制使得elasticsearch索引数据变的更加灵活,近乎于no schema。mapping可以在建立索引时设置,也可以在后期设置。

后期设置可以是修改mapping(无法对已有的field属性进行修改,一般来说只是增加新的field)或者对没有mapping的索引设置mapping。

put mapping操作必须是master节点来完成,因为它涉及到集群matedata的修改,同时它跟index和type密切相关。修改只是针对特定index的特定type。

在action support分析中我们分析过几种action的抽象类型,put mapping action属于transportmasternodeoperationaction的子类。

put mapping

它实现了masteroperation方法,每个继承自transportmasternodeoperationaction的子类都会根据自己的具体功能来实现这个方法。

这里的实现如下所示:

protected void masteroperation(final putmappingrequest request, final clusterstate state, final actionlistener listener) throws elasticsearchexception { final string[] concreteindices = clusterservice.state().metadata().concreteindices(request.indicesoptions(), request.indices());       //构造request putmappingclusterstateupdaterequest updaterequest = new putmappingclusterstateupdaterequest() .acktimeout(request.timeout()).masternodetimeout(request.masternodetimeout()) .indices(concreteindices).type(request.type()) .source(request.source()).ignoreconflicts(request.ignoreconflicts());       //调用putmapping方法,同时传入一个listener metadatamappingservice.putmapping(updaterequest, new actionlistener() { @override public void onresponse(clusterstateupdateresponse response) { listener.onresponse(new putmappingresponse(response.isacknowledged())); } @override public void onfailure(throwable t) { logger.debug("failed to put mappings on indices [{}], type [{}]", t, concreteindices, request.type()); listener.onfailure(t); } }); }

以上是transportputmappingaction对masteroperation方法的实现,这里并没有多少复杂的逻辑和操作。具体操作在matedatamappingservice中。

updatetask响应

跟之前的createindex一样,put mapping也是向master提交一个updatetask。所有逻辑也都在execute方法中。这个task的基本跟createindex一样,也需要在给定的时间内响应。它的代码如下所示:

public void putmapping(final putmappingclusterstateupdaterequest request, final actionlistener<clusterstateupdateresponse> listener) {     //提交一个高基本的updatetask clusterservice.submitstateupdatetask("put-mapping [" request.type() "]", priority.high, new ackedclusterstateupdatetask<clusterstateupdateresponse>(request, listener) { @override protected clusterstateupdateresponse newresponse(boolean acknowledged) { return new clusterstateupdateresponse(acknowledged); } @override public clusterstate execute(final clusterstate currentstate) throws exception { list<string> indicestoclose = lists.newarraylist(); try {             //必须针对已经在matadata中存在的index,否则抛出异常 for (string index : request.indices()) { if (!currentst= currentstate.metadata().index(indexname); if (indexmetadata == null) { throw new indexmissingexception(new index(indexname)); } mappingmetadata mappingmd = mappings.get(indexname); if (mappingmd != null) { builder.put(indexmetadata.builder(indexmetadata).putmapping(mappingmd)); } } return clusterstate.builder(currentstate).metadata(builder).build(); } finally { for (string index : indicestoclose) { indicesservice.removeindex(index, "created for mapping processing"); } } } }); }

以上就是mapping的设置过程,首先它跟create index一样,只有master节点才能操作,而且是以task的形式提交给master;其次它的本质是将request中的mapping和index现存的或者是default mapping合并,并最终生成新的matadata更新到集群的各个节点。

总结

集群中的master操作无论是index方面还是集群方面,最终都是集群matadata的更新过程。而这些操作只能在master上进行,并且都是会超时的任务。put mapping当然也不例外。上面的两段代码基本概况了mapping的设置过程。这里就不再重复了。

这里还有一个问题没有涉及到就是mapping的合并。mapping合并会在很多地方用到。在下一节中会它进行详细分析,更多关于elasticsearch索引index put mapping设置的资料请关注mile米乐体育其它相关文章!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图