Elasticsearch 建模最佳实践
Elasticsearch Modeling Best Practices
我最近开始使用 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 中哪个是最佳实践?
这不是 Stack Overflow 范围的问题(您可能会收到关闭请求)。
使用第一个。不仅是因为并发性,而且当您不想搜索某个时间范围内的条目或包含特殊文本的条目等时,为什么还要将这些条目存储在数据存储中?您也可以对第二个版本执行此操作,但假设用户在一段时间后有 100 万条日志条目,而您想要找到一个特殊的条目。使用第二种方法,搜索将始终 return 包含所有条目的整个对象。
添加新条目时,您首先必须从 Elasticsearch 读取大对象中的所有条目,然后将它们写回;这会变得越来越慢,这不仅是因为传输的数据量大,而且因为在存储修改后的文档时,所有已经存在的条目都会重新编制索引。
虽然在嵌套对象上设置索引可能有效,但它比使用第一个解决方案要复杂得多。
因此,只需将单个条目保存在 Elasticsearch 中,绝对没有理由不这样做。
如果您想使用像 Kibana 这样的精美仪表板,也可以直接使用这种方法。
我最近开始使用 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 中哪个是最佳实践?
这不是 Stack Overflow 范围的问题(您可能会收到关闭请求)。
使用第一个。不仅是因为并发性,而且当您不想搜索某个时间范围内的条目或包含特殊文本的条目等时,为什么还要将这些条目存储在数据存储中?您也可以对第二个版本执行此操作,但假设用户在一段时间后有 100 万条日志条目,而您想要找到一个特殊的条目。使用第二种方法,搜索将始终 return 包含所有条目的整个对象。
添加新条目时,您首先必须从 Elasticsearch 读取大对象中的所有条目,然后将它们写回;这会变得越来越慢,这不仅是因为传输的数据量大,而且因为在存储修改后的文档时,所有已经存在的条目都会重新编制索引。
虽然在嵌套对象上设置索引可能有效,但它比使用第一个解决方案要复杂得多。
因此,只需将单个条目保存在 Elasticsearch 中,绝对没有理由不这样做。
如果您想使用像 Kibana 这样的精美仪表板,也可以直接使用这种方法。