ES的IP类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES的IP类型相关的知识,希望对你有一定的参考价值。

参考技术A 我们的ES数据有ip字段类型,原来是通过keyword方式存储的,可以模糊查询,可以精确搜索,现在想看看采用ip的字段方式查询会不会更好,是不是更省存储。

注意此查询无法通过,报错,原因:query_shard_exception

正则表达式查询只支持keyword和text

前面为采用keyword方式,后面为ip方式。

es索引字段类型错误如何高效解决(如何修改es索引字段类型)

今天因为上线之前,忘记提单先把es的索引新增的几个字段先建好,导致需求上线后,一些触发es推送数据的接口,使得es自动根据数据类型创建索引机制生效,原本我打算增加的mapping字段是数组keyword类型的,但是es自动匹配创建类型为long,导致索引作废,可是这个es索引24小时都有人在使用,如果粗暴删除重建索引,再全量同步数据,会导致一段时间国内外用户查询数据受影响,这个操作估计也会上传比较严重的故障等级,那有什么解决方法吗?–当然

如果你们系统没有使用es别名,那么暂时先按以下方式处理,后面提出了后续的优化方案。
1、先新建一个正确的索引,如下图(原索引feh-product-sit)

2、将旧索引数据同步到新的索引上

POST _reindex
{
  "source": {
    "index": "feh-product-sit"
  },
  "dest": {
    "index": "feh-product-sit-v1",
    "op_type": "create"
  }
}

此时,数据是批量同步的,可以通过以下命令查看同步情况

GET _tasks?detailed=true&actions=*reindex&human

当同步完成时,如下图

3、将旧索引删除

4、删除的之后马上,执行以下命令,给旧索引新增别名,此时新索引就代替了就索引的位置,这个过程要快,因为保不准此刻正在推数据,你就漏了几条生产数据了(事实上我们当时也是漏推了几条数据)

POST /_aliases
{
	"actions": [{
			"add": {
				"index": "feh-product-sit-v1",
				"alias": "feh-product-sit"
			}
		}
	]
}

建议的解决方案,在生产中,我们不要直接使用索引的正式索引名
我们建索引feh-product-sit-v1并给他配置一个别名feh-product-sit-alias,在代码配置文件中就使用 feh-product-sit-alias,去操作es,如果遇到这种情况,我们就直接新建一个索引feh-product-sit-v2,然后按照上面的方式重推数据后,将索引feh-product-sit-v1去除别名 feh-product-sit-alias的同时将feh-product-sit-v2别名为 feh-product-sit-alias,使用如下指令

POST /_aliases
{
	"actions": [{
			"add": {
				"index": "index-new",
				"alias": "index-alias"
			}
		},
		{
			"remove": {
				"index": "index-old",
				"alias": "index-alias"
			}
		}
	]
}

这样有个好处,就是我们如果在一些特殊情况需要在测试环境大规模测试操作一份数据只需要备份一份es数据,可以随意命名索引,然后切换别名,使用完之后删除,并切换回原es索引数据即可。在生产上,强烈推荐这样操作,毕竟吃一堑长一智,写完这篇博客就去把去搞了。

以上是关于ES的IP类型的主要内容,如果未能解决你的问题,请参考以下文章

es索引indexfalse改为true

ES系列六ES字段类型及ES内置analyzer分析

es索引字段类型错误如何高效解决(如何修改es索引字段类型)

简述ES6的数据类型

es修改索引字段类型

ES实战初探ES date类型的时区机制