elasticsearch索引index之put mapping的设置分析-亚博电竞手机版
目录
- 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
以上是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设置的资料请关注亚博电竞手机版其它相关文章!