什么是 ElasticSearch 中好的 Web 应用程序 SQL 服务器数据集市实施?

What is a good web application SQL Server data mart implementation in ElasticSearch?

来自 RDBMS 背景并试图围绕 ElasticSearch 数据存储模式思考...

目前在 SQL 服务器中,我们有一个星型模式数据集市,RecordData。行按用户 ID、与其余可搜索记录相关的地理位置、标题和描述(自由文本搜索字段)组织。

我想将其移至 ElasticSearch,并且已阅读有关为每个用户创建单独索引的信息。如果我理解正确,根据这个建议,我会在每个用户索引中创建一个 RecordData 类型,对吗?对于 Kibana 分析来说,推荐的用户索引命名约定是什么?

我对该建议的一个问题是,您将如何在 ES 服务器上组织多个 Web 应用程序?您不想到处都是这些用户索引吗?

每个应用程序有一个索引,并为每个 SQL 服务器 table 输入一个索引是不是很糟糕?

因为在 SQL 服务器中,我们有其他 table 用于用户配置,基于用户 ID,我认为我可以在用户索引中创建新的 ES 类型用于配置。这是推荐的模式吗?我宁愿此 Web 应用程序没有两个数据库系统。

欢迎提出建议,谢谢。

我经历过同样的事情,有几件事需要考虑。

数据建模

你说你今天使用星型架构。 Elasticsearch 通常适用于非规范化数据,在这种情况下,所有信息都驻留在每个文档中,这与星型模式不同。如果您可以接受非规范化,那很好,但我认为由于您已经拥有星型模式,因此非规范化数据不是一种选择,因为您不想每次更改位置名称时都去更新数百万个文档(例如,如果我了解用例)。至少在我的用例中这不是一个选项。

标准化数据的 Elasticsearch 选项是什么?

这让我们想到如何将类似星型模式的数据放入像 Elasticsearch 这样的系统中。文档中有几个选项,我关注的主要选项是

  • 嵌套对象 - https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html 中有更多详细信息。在嵌套对象中,整个信息都保存在一个文档中,这意味着一个位置及其相关用户将在一个文档中。这可能使它不是最佳的,因为文档将是巨大的,而且位置名称的更改将需要更新整个文档。所以这更好,但仍然不是最优的。
  • 亲子关系 - 更多详情请见 https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html。在这种情况下,位置和用户记录将保存在单独的索引中,类似于关系数据库。这似乎是我们需要的正确建模。此选项的唯一主要问题是,截至撰写本文时,Kibana 4 并未提供基于 parent/child 关系的 manipulate/aggregate 文档的方法。因此,如果您使用 Elasticsearch 的主要驱动力是 Kibana(这是我的),那么就消除了这种选择。如果您想从作为引擎的弹性搜索速度中受益,这似乎是您用例的理想选择。

在我看来,一旦你的数据建模正确,你所有的问题都会更容易回答。

关于服务器本身的组织,我们的组织方式是在负载均衡器后面有一个由 3 个弹性搜索节点组成的独立集群(所有这些都托管在云上),然后让您的所有 Web 应用程序连接使用 Elasticsearch API 到该集群。

希望对您有所帮助。