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那就是删除喽

原文首发于 风北的博客

转载于:https://my.oschina.net/northerSong/blog/1785525

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Elasticsearch删除索引中的数据,可以使用delete_by_query方法。下面是使用Elasticsearch-Py库进行删除的示例代码: 引用\[1\]: ```python from elasticsearch import Elasticsearch # 创建Elasticsearch连接 es = Elasticsearch(\[{'host': 'localhost', 'port': 9200}\]) # 构造删除请求 delete_query = { "query": { "range": { "timestamp": { "lt": two_months_ago.strftime("%Y-%m-%dT%H:%M:%S") # 格式化日期为Elasticsearch支持的格式 } } } } # 发送删除请求 es.delete_by_query(index='your_index_name', body=delete_query) ``` 如果要一次性删除多个索引中的数据,可以使用索引别名来指定要删除索引。下面是示例代码: 引用\[2\]: ```python from elasticsearch import Elasticsearch # 创建Elasticsearch连接 es = Elasticsearch(\[{'host': 'localhost', 'port': 9200}\]) # 定义要删除数据的索引别名 index_alias = "your_index_alias" # 构造删除请求 delete_query = { "query": { "range": { "timestamp": { "lt": "now-2M" # 删除两个月以前的数据 } } } } # 发送删除请求,并指定索引别名 es.delete_by_query(index=index_alias, body=delete_query) ``` 需要注意的是,使用Elasticsearch的delete_by_query方法删除索引中的数据并不属于逻辑删除,它实际上是执行了一次查询操作,然后在查询结果的基础上执行删除操作,将满足查询条件的文档从索引中物理删除。\[3\] #### 引用[.reference_title] - *1* *2* *3* [ElasticSearch删除索引中的数据(delete_by_query)](https://blog.csdn.net/weixin_44799217/article/details/130192119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值