【问题标题】:Elasticsearch Modeling Best PracticesElasticsearch 建模最佳实践
【发布时间】:2019-10-22 05:30:36
【问题描述】:

我最近开始使用 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 集合需要更新,整个模型必须再次持久化。

我能想到的主要缺点是需要并发写保护。

弹性搜索中哪一个是最佳实践?

【问题讨论】:

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


    【解决方案1】:

    不是 Stack Overflow 范围的问题(您可能会收到关闭请求)。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2020-01-15
      • 2017-11-16
      • 2020-08-22
      • 2020-06-06
      • 2017-07-12
      • 2013-01-15
      相关资源
      最近更新 更多