一次mapping field的修改过程

Elasticsearch 的坑爹事

本文记录一次Elasticsearch mapping field修改过程

团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapping

{
    "settings" : {
        "number_of_shards" : 20
    },
    "mappings" : {
      "client" : {
        "properties" : {
          "ip" : {
            "type" : "long"
          },
          "cost" : {
            "type" : "long"
          },
}

现在问题来了,日志中输出的"127.0.0.1"这类的IP地址在Elasticsearch中是不能转化为long的(报错 Java.lang.NumberFormatException),所以我们必须将字段改为string型或者ip型(Elasticsearch支持, 数据类型可见mapping-core-types)才能达到理想的效果.

目标明确了,就是改掉mapping的ip的field type即可.

elasticsearch.org找了一圈 嘿嘿, update一下即可

curl -XPUT localhost:8301/store/client/_mapping -d '
{
    "client" : {
        "properties" : {
            "local_ip" : {"type" : "string", "store" : "yes"}
        }
    }
}

报错结果

{"error":"MergeMappingException[Merge failed with failures {[mapper [local_ip] of different type, current_type [long], merged_type [string]]}]","status":400}

尼玛 真逗  我long想转一下string 居然失败(elasticsearch产品层面理应支持这种无损转化)  无果

Google了一下类似的案例 (案例)

在一个帖子中得到的elasticsearch开发人员的准确答复

"You can't change existing mapping type, you need to create a new index with the correct mapping and index the data again."

想想 略坑啊 我不管是因为elasticsearch还是因为底层Lucene的原因,修改一个field需要对所有已有数据的所有field进行reindex,这本身就是一个逆天的思路,但是elasticsearch的研发人员还觉得这没有什么不合理的.

在Elasticsearch上游逛了一圈,上面这样写到

(http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/)

the problem—why you can’t change mappings

You can only find that which is stored in your index. In order to make your data searchable, your database needs to know what type of data each field contains and how it should be indexed. If you switch a field type from e.g. a string to a date, all of the data for that field that you already have indexed becomes useless. One way or another, you need to reindex that field.

...

OK,这一段话很合理,我改了一个field的类型 需要对这个field进行reindex,如论哪种数据库都需要这么做,没错.

我们再继续往下看看,reindexing your data, 尼玛一看,弱爆了,他的reindexing your data不是对修改的filed进行reindex,而是创建了一个新的index,对所有的filed进行reindexing, 太逆天了。

吐槽归吐槽,这个事情逃不了,那我就按他的来吧.

首先创建一个新的索引

curl -XPUT localhost:8305/store_v2 -d '
{
    "settings" : {
        "number_of_shards" : 20
    },
    "mappings" : {
      "client" : {
        "properties" : {
          "ip" : {
            "type" : "string"
          },
          "cost" : {
            "type" : "long"
          },
}

等等,我创建了新索引,client往Elasticsearch的代码不会需要修改吧,瞅了一眼,有解决方案,建立一个alias(别名,和C++引用差不多),通过alias来实现对后面索引数据的解耦合,看到这,舒了一口气。

现在的问题是 这是一个线上服务,不能停服务,所以我需要一个倒数据到我的新索引的一个方案

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索elasticsearch
, field
, type
, mapping
, elasticsearch接口c#count
, elasticsearch 搜索
, elasticsearch sql
, 一个
root运行Elasticsearch
es修改mapping、elastic 修改mapping、kibana 修改mapping、ravenfield修改器、extjs 修改fieldlabel,以便于您获取更多的相关知识。

时间: 2024-08-02 08:51:48

一次mapping field的修改过程的相关文章

网站修改过程中如何避免被大幅度降权

有许多站长在做网站修改过程中不知如何去稳定排名,避免排名被百度大幅度降权,借此机会与大家交流交流网站修改过程中如何避免被大幅度降权 1. 首页标题的修改 很多站长都知道修改首页标题,从一定程度上说都会影响到你的排名,由于前期有的站定位都不是很明确,故标题也就定偏了,那么,我们应如何正确去修改标题,从而还要降低你的排名被大幅度调整的可能呢?举个例子说明更为清晰,如我的站为酿缘交友网首页标题为:"酿缘网-交友-征婚-相亲",需要修改标题时,记住了,一定要从最后一个词开始逐步往前面的词修改,

java web-求解:为什么不能读取自动增长列的值,在修改过程中传值?

问题描述 求解:为什么不能读取自动增长列的值,在修改过程中传值? 解决方案 你的4后面有个空格,所以没法转换成数字 解决方案二: 异常显示是空格的问题.你可以检查下数据库中存的值是不是有空格,然后再检查下数据展示的代码是不是有空格. 如果数据库没有问题,就可能是这个值在页面是可编辑的,所以会接收到了误操作的空格.

我用JS+Cookie编写的购物车,(添加、修改过程在客户端执行,一次提交服务器,IE适用),请大家指正(二)

cookie|js|服务器|购物车|过程|客户端|执行 二.js函数:orderform_functions.js //Vampirebat,2002-1-16;http://www.vampirebat.org //<--Start--从cookie中读出订单数据的函数function ReadOrderForm(name){    var cookieString=document.cookie;    if (cookieString=="")    {        re

在项目修改过程中永远要保证可运行版本

刚刚上来写篇博文,看到了<我心中的商用化开发>征文公告.看了肖老师老师的几篇文章,获益匪浅. 其实如果不是这个商用化开发的公告,我也会写这篇博文,来鞭笞自己.提醒自己,随时注意在项目开发中注意,可运行版本这个概念. 昨晚,被我们老大狠狠的教训了一顿.  我先说下我现在的状况.我们的java team不大,一直在开发自己的商业信息平台的.从平台的开始到现在,陆陆续续来了一些人,也走了一些人.基本上,从框架的搭建到现在二期维护,除了老大做一些架构的调整工作,剩下的细微调整,从架构到业务的需求和代码

SSO单点登录系列4:cas-server登录页面自定义修改过程

详见网址:http://blog.csdn.net/ae6623/article/details/8861065 目标:   下面是正文:   打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一名合格的用户,我表示很不开心.   于是,打开Nodepad++,寻找C:\tomcat7\webapps\casServer\WEB-INF\view\jsp\default\ui\casLoginView.jsp这个页面,开始了我的改造之旅,作为一名合格的分享ser,我表示全程都会转

artDialog双击会关闭对话框的修改过程分享_jquery

artDialog,一个jquery的对话框插件,很好用的说 但是在使用时发现鼠标双击时会自半对话框,查看源码发现有个监听鼠标双击的事件如下图:  简单的方法就是把该行去掉,为了扩展可改成如下图:  这样就可以动态配置是否需要此功能使用方法如下图: 复制代码 代码如下: $.dialog({ title : json.theme, content : json.content, dbclickHide:true, ////默认false,如果为true则双击就会关闭窗口 lock : true,

如何调试C/C++内联函数及过程

这篇文章描述了一种持续的权衡方法,可以在调试程序和使之运行 更快之间取得正确的平衡.这篇文章同时还描述了如何调试内联函数及过程. 编写一个运行得快的程序并不容易.编译器可以帮助将一个程序转换成运行得更加快,但权衡是转换之后的程序与初始的程序会有所不同.在某些作了积极优化转换(aggressive optimization transform)的情形里,从人类的角度看转换后的程序与初始程序相比较已经几乎没有可读的一致性了. 因此,调试有问题的已优化程序会更加困难.这是一个问题,因为为了获得最大化的

xmlpatch 0.2发布 批量修改XML文件

xmlpatch 0.2这个版本输出重定向,忽略空白的节点,并产生空的拒绝文件.增加了许多例子/测试. XMLPatch 是一个简单的工具,用来批量的修改 XML 文件,它使用 patch 文件的形式,包含要改动的内容,然后批量的应用到指定的 XML 文件,完成批量修改过程. 下载地址: &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; File 大小 日期 By Actions xmlpatch- i386.ta

PL/SQL过程

     要想利用PL/SQL程序完成比较完整的数据库任务,需要进一步学习一些高级设计要素的内容.前面编写执行的PL/SQL程序,共同的特点是没有名称,只能存储为文件,然后通过执行文件的方式执行,因此称为无名块.与此对应的是在PL/SQL中也引入了高级程序设计的一些概念,其中最重要的就是过程.    过程就是高级程序设计语言中的模块的概念,将一些内部联系的命令组成一个个过程,通过参数在过程之间传递数据是模块化设计思想的重要内容. 创建过程     1. 过程的语法结构    完整的过程结构如下: