ElasticSearch索引建模

时间:2017-12-28 01:58:21

标签: elasticsearch

我是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变更很少?

1 个答案:

答案 0 :(得分:0)

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

建议1:

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

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

建议2:

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

关于你的问题:

问题1:ID字段

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

问题2:基于时间的索引

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