动态java映射文件中的弹性搜索ttl(生存时间) - 弹簧数据弹性搜索

时间:2015-08-21 02:11:10

标签: elasticsearch spring-data-elasticsearch

我们使用弹性搜索动态映射,java文件如下。

@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不是要添加到每个索引,它应该是所有文档的通用级别吗?如果是这样,我应该为每个计划运行设置吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

根据this open issue,它看起来并不像Spring Data Elasticsearch当前支持AutoPilot ap = new AutoPilot(); ap.selectXPath(xPath); ap.bind(vn); while((result = ap.evalXPath())!=-1){ // System.out.println(vn.getAttrVal("xsi:noNamespaceSchemaLocation") + ", " + vn.getText() + ", " + vn.toString(result)); xm.updateToken(result_+1,"test"); 字段。

另一种方法是"软删除"通过设置标志(即新的布尔列)从数据库中记录。记录处于活动状态时标志为true,删除记录时为false。这样,当您的导入过程运行时,您将获得所有记录,并且根据该标记,您知道必须从Elasticsearch中删除文档。