ElasticSearch索引建模

问题描述 投票:0回答:1

我是ElasticSearch的新手(你会在阅读完问题后弄明白!)我需要帮助设计类似于下面例子中描述的数据集的ElastiSearch索引。

我有罗素2000指数公司的数据。要为这些公司定义索引,我有以下映射 -

`

{
  "mappings": {
    "company": { 
      "_all":       { "enabled": false  }, 
      "properties": { 
        "ticker": { "type": "text"  }, 
        "name": { "type": "text"  },
        "CEO": { "type": "text"  },
        "CEO_start_date": {"type": "date"},
        "CEO_end_date": {"type": "date"}   
      }
    }
}

`

随着公司的CEO变更,我想更新现有文档的end_date并添加一个带有开始日期的新文档。

在这里,(1)对于这样的数据集,什么是理想的id方案?由于我想保留多个文档,我应该考虑(company_id + date)组合作为id(2)因为在这种情况下考虑基于时间的索引,所以CEO变更很少?

elasticsearch
1个回答
0
投票

你的架构是一个合理的起点,但我会做一些小的改动和评论:

建议1:

首先,在您提出的架构中,您可能希望将ticker更改为类型关键字而不是文本。关键字允许您使用术语查询在字段上进行完全匹配。

当您想要与分析的文本匹配时,应使用文本类型。分析文本会将标准化应用于文本数据,以便更轻松地将用户键入的内容与搜索栏进行匹配。例如,将删除像“the”这样的常用单词,并删除像“ing”这样的单词结尾。根据您在索引中搜索名称的方式,您可能还希望将其切换为关键字。另请注意,如果需要同时支持两种搜索方法,则可以选择使用BOTH关键字和文本对字段进行两次索引。

建议2:

Sid在关于使用这个主要商店的评论中提出了一个很好的观点。我已经将ES用作许多用例中的主要存储,并取得了很大的成功。我认为通常选择ES而不是像RDBMS那样传统的东西会让你获得更多的权利,你会得到更强大的读取操作(通过任何字段搜索,全文搜索等),但会失去关系操作(连接)。此外,我发现由于必须进行所有额外处理,将数据加载/更新到ES比RDBMS慢。因此,如果您打算主要使用系统来更新和跟踪操作状态,或者如果您非常依赖JOIN操作,那么您可能希望查看使用RDBMS而不是ES。

至于你的问题:

问题1:ID字段

您应该检查是否确实需要创建显式ID字段。如果您不创建一个,ES将为其创建一个保证是唯一且均匀分布的。有时您仍需要输入自己的ID。如果您的用例就是这种情况,那么添加一个新的字段,您可以将公司ID和日期结合起来。

问题2:基于时间的指数

当您要进行大量活动时,基于时间的索引非常有用。它们可以轻松执行维护操作,例如删除超过X天的所有记录。如果您只是将CEO变更索引到2000家公司,那么您可能不会有太多事件。我可能会跳过它们,因为它增加了一些复杂性,在这个用例中并没有给你带来太大的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.