您的位置:首页 > 其它

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

2018-03-27 11:49 281 查看

事件的过程

所有操作都在
elasticsearch
插件
head


1. 清空所有索引

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

DELETE
\*




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

2. 导入数据

我们的数据是怎么到ES的

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

问题出现了

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

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

嗯,我们查不到任何数据。

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

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

3. 研究索引

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

再次删除所有索引

新建索引并设置映射

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

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

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

依然没有数据!

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

默认值设置:

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


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

总结

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

索引的映射

索引别名

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

原文首发于 风北的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ElasticSearch