我们使用弹性搜索动态映射,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不是要添加到每个索引,它应该是所有文档的通用级别吗?如果是这样,我应该为每个计划运行设置吗?
谢谢,
答案 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中删除文档。