关于elasticsearch定期删除历史数据的问题

定期删除elasticsearch数据
Elasticsearch在2.0以前版本,删除操作有两种方式,一种是通过id来进行删除,但是这种方式一般不常用,因为id不容易得到;另一种方式是通过先查询操作,然后删除,也就是通过client.prepareDeleteByQuery这种方式来根据条件批量删除数据:
[java] view plain copy
  1. DeleteByQueryResponse response = client.prepareDeleteByQuery("library")  
  2. .setQuery(QueryBuilders.termQuery("title""ElasticSearch"))  
  3. .execute().actionGet();  
但是Delete by Query在2.0版本及其以上的版本已经被移除了,因为这种方式会自动强制刷新,所以在大量索引并发的情况下,会很快造成内存溢出。
那么在2.0以后的版本,我们如何来进行批量的删除呢?
我们可以先通过Search API查询,然后得到需要删除的批量数据的id,然后再通过id来删除,但是这种方式在大批量数据的删除的时候,依然是行不通的。
具体实现代码:
[java] view plain copy
  1. public void deleteByTerm(Client client){  
  2.     BulkRequestBuilder bulkRequest = client.prepareBulk();  
  3.     SearchResponse response = client.prepareSearch("megacorp").setTypes("employee")  
  4.             .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)  
  5.             .setQuery(QueryBuilders.termQuery("first_name""xiaoming"))  
  6.             .setFrom(0).setSize(20).setExplain(true).execute().actionGet();  
  7.     for(SearchHit hit : response.getHits()){  
  8.         String id = hit.getId();  
  9.         bulkRequest.add(client.prepareDelete("megacorp""employee", id).request());  
  10.     }  
  11.     BulkResponse bulkResponse = bulkRequest.get();  
  12.     if (bulkResponse.hasFailures()) {  
  13.         for(BulkItemResponse item : bulkResponse.getItems()){  
  14.             System.out.println(item.getFailureMessage());  
  15.         }  
  16.     }else {  
  17.         System.out.println("delete ok");  
  18.     }  
  19.       
  20. }  

5.X可以使用  _delete_by_query API    
POST twitter/_delete_by_query
{
  "query": { 
    "match": {
      "message": "some message"
    }
  }
}


当然,以上都不是最方便的,设置es过期时间才是最方便的,也要根据业务区使用
插入文档: 
PUT testindex/testtype/1?ttl=10m
{
  "text": "Will expire in 10 minutes"
}
如果不添加ttl过期参数则文档默认不过期,可以在创建索引时加入默认过期时间: 
PUT my_index
{
  "mappings": {
    "my_type": {
      "_ttl": {
        "enabled": true,
        "default": "5m"
      }
    }
  }
}

时间单位说明: 
  d 
  ms(默认)
毫秒
m
分钟


相关参数备注: 
indices.ttl.interval:文档扫描周期(默认为60秒) 
indices.ttl.bulk_size:批量删除过期文档数量(默认为10000) 
detect_noop:如果此参数设置为true时,单纯修改文档的ttl不会影响这个文档的过期时间,修改文档字段时会影响,在2.1版本中默认值为true 
  • 发表于 2018-05-17 00:34
  • 阅读 ( 1072 )
  • 分类:大数据

0 条评论

请先 登录 后评论
不写代码的码农
张鹏

大数据工程师

95 篇文章

作家榜 »

  1. 张鹏 95 文章
  2. 0 文章
  3. 赵科 0 文章
  4. 王孖珺397954227 0 文章