设置ElasticSearch以便仅搜索每个客户数据的最佳方法

时间:2019-04-23 06:38:59

标签: elasticsearch architecture

我们有一个SAAS产品,公司可以在其中创建帐户并填充自己的私人数据。我们正在考虑使用ElasticSearch允许客户在我们的系统中搜索自己的所有数据。

作为示例,我们将进行自由文本搜索,其中用户可以键入任何内容,并且API将返回多种不同类型的对象。例如。他们键入John,API会为匹配包含John的名字或包含John的电子邮件的用户返回用户对象。或者也可能返回团队名称与John匹配的团队对象(例如John's Team等)。

所以我的问题是:

  1. ElasticSearch是我们要从中进行的明智选择吗? 概念角度?

  2. 如果我们确实使用ElasticSearch,那将是 索引数据的最佳方法,以便我们可以在所有数据中搜索 特定客户?每个客户都有自己的索引吗?

  3. 关于如何使ElasticSearch与数据库(DynamoDB)中的数据保持同步有任何提示吗?如果我们为客户编制数据索引,然后在数据更改时更新数据,那么是否也可以按计划对数据重新编制索引呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

我将根据自己的经验,通过弹性搜索来分解客户数据,以提供一般性答案:

  1. 如果您想快速地搜索大量数据,ES始终是一个非常好的解决方案-它附带了二级数据存储的成本,您将不得不与数据库保持同步

  2. 您不能在一个索引中拥有不同的数据类型,因此,情况可能是为每种数据类型和每个客户创建一个索引(仔细,索引会带来开销-避免在数据很少的情况下创建太多索引) -或者您为每种数据类型创建一个索引,然后向数据中添加属性,然后可以使用例如客户编号。 您将需要尽可能多地denormalize数据才能从弹性搜索中受益。

  3. 如1中所述,您需要使两者保持同步-还有很多方法可以做到这一点。例如,我们使用事件驱动的方法将关键更新尽快推送到elasticsearch中(小心:它不是SQL-因此,当您需要读写安全时,您总是会遇到一些并发问题)。对于不是很关键的数据,我们使用定期更新的作业。当您索引具有相同ID的文档时,它将完全更新。

希望这会有所帮助,随时提出疑问。