java - Elasticsearch 建模最佳实践

标签 java elasticsearch data-modeling spring-data-elasticsearch

我最近开始使用 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 万个日志条目,并且您想要找到一个特殊的日志条目。使用第二种方法,搜索将始终返回包含其中所有条目的整个对象。

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

虽然在嵌套对象上设置索引可能有效,但它比使用第一个解决方案时要复杂得多。

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

如果您想使用 Kibana 等精美的仪表板,也可以直接使用这种方法。

关于java - Elasticsearch 建模最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481927/

相关文章:

node.js - ElasticSearch - 未刷新索引更改

elasticsearch - 如何在ElasticSearch中建立社交关系模型?

database-design - 支持应用程序中自定义字段的设计模式有哪些?

从 docker 运行时出现 Java SIGSEGV 错误

java - Spring 3.1 中的 Properties Placeholder 继承

elasticsearch - dis_max查询不是在寻找最佳匹配子句

mysql - 更改表的列以存储多个值的一些解决方案是什么?

java - 在interval.parse()中抛出异常

Java - 未使用字段的值

mysql - 最大表和设计模式