首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Elasticsearch建模最佳实践

Elasticsearch建模最佳实践
EN

Stack Overflow用户
提问于 2019-06-07 00:48:59
回答 1查看 278关注 0票数 0

我最近开始使用Elasticsearch,并且正在通过Spring data Elasticsearch将一些数据持久化到其中。

对于NoSQL数据库来说,我还是个新手。

我想知道为用户建模审核日志的最佳方式。

目前,我看到了两种方法。

第一个方法是为每个日志条目创建一个文档。

类似这样的东西

代码语言:javascript
运行
复制
@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。我认为这种方法的主要优点是不需要担心写并发。

第二种方法是为每个用户提供一个文档。并且日志条目被放置在其中的列表中。

类似于这个的东西。

代码语言:javascript
运行
复制
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的最佳实践?

EN

Stack Overflow用户

回答已采纳

发布于 2019-06-07 13:52:46

对于堆栈溢出的范围来说,这不是一个问题(您可能会收到关闭请求)。

使用第一个。不仅是因为并发性,而且当您不想搜索某个时间范围内的条目或包含特殊文本的条目等内容时,为什么还要将这些条目存储在数据存储中?对于第二个版本,您可能也会这样做,但是假设用户在一段时间后拥有100万个日志条目,而您想要找到一个特殊的条目。使用第二种方法,搜索将始终返回包含所有条目的整个对象。

在添加新条目时,首先必须从Elasticsearch读取大对象中的所有条目,然后将它们写回;这将变得越来越慢,这不仅是因为传输的数据量大,而且因为在存储修改后的文档时,所有已经存在的条目都将被重新索引。

虽然在嵌套对象上建立索引可能会起作用,但它比使用第一种解决方案要复杂得多。

因此,只需在Elasticsearch中保存单个条目,绝对没有理由不这样做。

如果你想使用Kibana这样的仪表板,也可以直接使用这种方法。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56481927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档