elasticsearch删除索引后再新建时踩的坑

事件的过程

所有操作都在elasticsearch插件head

1. 清空所有索引

这个删除操作和linux rm -rf / 一样简单

DELETE
\*

就是酱紫,点击提交,就全部删除了。你可以刷新下页面,看看。

2. 导入数据

我们的数据是怎么到ES的

在项目里,我们查询ES数据时是通过spring data jpa,但插入并不是,是一个定时任务拉取第三方平台,数据量比较大,集成了kafka,再由logstash发送到ESkafka是直接发送的json格式的字符串,logstash里配置了动态模板。可以说是跟默认的差不多。

问题出现了

可以说每个发送到ES里的对象(应该叫文档)都有非常多的字段,里面大部分都是不需要分词的,但动态模板不会判断,所以到ES里数据都被分词了!然后我们使用聚合查询部分代码是这样的:

TermsBuilder provinceTermsBuilder = AggregationBuilders.terms("provinceAgg").field("provinceCode.raw");
TermsBuilder cityTermsBuilder = AggregationBuilders.terms("cityAgg").field("cityCode.raw");

嗯,我们查不到任何数据。
看看.raw,官方解释 大概总结下,就是同一个字段,多一个映射的方式。但这个映射我们没有设置过!我们没有provinceCode.rawcityCode.raw字段,所以通过这两个字段来查询根本没有任何数据

这两个字段代表的省市的代码,例如31代表上海。这个是不需要分词的。

3. 研究索引

问题原因找到了。研究怎么去做这个映射,官方文档 看完,想起,外包交接时给过一个映射的json格式的文件,查看一下,应该就是这些字段的映射,但可能是版本或文档更新的问题,直接执行后,并未起作用,按照文档中官方文档做了下修改,OK 大概流程是

  1. 再次删除所有索引
  2. 新建索引并设置映射

在解决索引问题时,还出现了查询数据时找不到索引的问题。发现spring data jpa里配置的ES索引名和实际索引不同。Google一下,果然ES里还有别名这一个概念,引用官网的话:

即使你认为现在的索引设计已经很完美了,在生产环境中,还是有可能需要做一些修改的。做好准备:在你的应用中使用别名而不是索引名。然后你就可以在任何时候重建索引。别名的开销很小,应该广泛使用

4. 还有初始值这样的操作!

依然没有数据!
在交接时加入了一个新功能,因此新加了一个字段。不过这个字段有默认值!所以查询这个字段时没有数据。
默认值设置:

METHOD: POST
URL: /{索引}/{字段}/_update_by_query
{"script":{"inline":"ctx._source.{字段}=0"}}

注意要用post方法,一不小心用了put直接就是新建一个{字段}类型了。然后查询这个字段时又是各种问题。无奈删之!

总结

使用ES开发,需要注意备份配置:

  1. 索引的映射
  2. 索引别名

调试开发时注意http方法。一不小心用了DELETE那就是删除喽

原文首发于 风北的博客

猜你喜欢

转载自my.oschina.net/northerSong/blog/1785525
今日推荐