我最近开始使用Elasticsearch,并且正在通过Spring data Elasticsearch将一些数据持久化到其中。
对于NoSQL数据库来说,我还是个新手。
我想知道为用户建模审核日志的最佳方式。
目前,我看到了两种方法。
第一个方法是为每个日志条目创建一个文档。
类似这样的东西
@Document(indexName = "user_audit_log", type = "UserAuditLog")
public class UserAuditLog {
@Id
private String uuid;
private Long userID;
private String action;
private String original;
private String newValue;
private OffsetDateTime timestamp;
}
并以类似的方式将条目写入RDBMS。我认为这种方法的主要优点是不需要担心写并发。
第二种方法是为每个用户提供一个文档。并且日志条目被放置在其中的列表中。
类似于这个的东西。
public class UserAuditLogEntry {
private String action;
private String original;
private String newValue;
private OffsetDateTime timestamp;
}
@Document(indexName = "user_audit_log", type = "UserAuditLog")
public class UserAuditLog {
@Id
private Long userID;
private List<UserAuditLogEntry> auditLogEntries;
}
必须加载文档,需要更新auditLogEntries
集合,并且必须再次持久化整个模型。
我能想到的主要缺点是需要并发写保护。
哪一项是elasticsearch的最佳实践?
发布于 2019-06-07 13:52:46
对于堆栈溢出的范围来说,这不是一个问题(您可能会收到关闭请求)。
使用第一个。不仅是因为并发性,而且当您不想搜索某个时间范围内的条目或包含特殊文本的条目等内容时,为什么还要将这些条目存储在数据存储中?对于第二个版本,您可能也会这样做,但是假设用户在一段时间后拥有100万个日志条目,而您想要找到一个特殊的条目。使用第二种方法,搜索将始终返回包含所有条目的整个对象。
在添加新条目时,首先必须从Elasticsearch读取大对象中的所有条目,然后将它们写回;这将变得越来越慢,这不仅是因为传输的数据量大,而且因为在存储修改后的文档时,所有已经存在的条目都将被重新索引。
虽然在嵌套对象上建立索引可能会起作用,但它比使用第一种解决方案要复杂得多。
因此,只需在Elasticsearch中保存单个条目,绝对没有理由不这样做。
如果你想使用Kibana这样的仪表板,也可以直接使用这种方法。
https://stackoverflow.com/questions/56481927
复制相似问题