2015-08-21 280 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;