2015-08-21 298 views
0

我们使用弹性搜索动态映射和java文件如下。在动态java映射文件中弹性搜索ttl(生存时间) - 弹性数据弹性搜索

@Document(indexName = "test", type = "test", shards = 1, replicas = 0) 
public class ElasticSearchIndexObject { 

    private @Id 
    @Indexed 
    String id; 

    private @Indexed("name") 
    String name; 
} 

我们使用,在每60分钟运行到从数据库获取数据,并添加到索引调度。

Connection conn = dataSource.getConnection(); 

      stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 
      stmt.setFetchSize(FETCH_SIZE); 

      rs = stmt.executeQuery(ESEARCH_QUERY); 

      int i=1; 
      while (rs.next()) { 
       ElasticSearchIndexObject indexObj = new ElasticSearchIndexObject(); 
       indexObj.setName(rs.getString("name")); 
       indexObj.setId(rs.getString("id")); 

       indexObjects.add(indexObj); 

       i=i+1; 
      } 

      elasticSearchObjectIndexRepository.save(indexObjects); 
      indexObjects.clear(); 

     } 

该调度程序每60分钟运行一次并添加/更新索引。

添加 - 如果ID是不存在索引 更新 - 如果ID已经存在于索引

问题是在数据库中删除的记录。这些记录没有从索引中删除,并成为孤立记录。

我遇到了“ttl”属性并正在寻找一种方法将此添加到索引中,以便在ttl时间之后孤立记录将被删除。

如果ttl不是要添加到每个索引,它应该在所有文档的通用级别吗?如果是这样,我应该为每个时间表运行设置它吗?

感谢,

回答

0

根据this open issue它看起来并不像_ttl场目前由Spring数据Elasticsearch支持。

这样做的另一种方法是通过设置一个标志(即新的布尔列)来“软删除”数据库中的记录。当记录处于活动状态时该标记为真,当记录被删除时该标记为假。这样,当你的导入过程运行时,你会得到所有的记录,并基于该标志,你知道你必须从Elasticsearch中删除文件。

+0

感谢您的建议。在数据库级别处理不是一种选择。 – user1578872

1

确保您的索引类型的"_ttl" : { "enabled" : true }映射已经配置。然后在_source中传递文档的_ttl值。在您的POJO中添加此字段:

@JsonInclude(value=Include.NON_EMPTY) //to make it optional 
@JsonProperty("_ttl") 
private Long ttl;