在Rails中混合使用PSQL和ElasticSearch ORM

时间:2016-04-27 05:40:06

标签: ruby-on-rails activerecord elasticsearch

我有一个带有以下简化模型结构的照片共享应用

  • User: has_many :photos
  • Photo: has_many :tags
  • Tag

假设此应用程序正在高规模运行,至少有1000万至2000万张照片记录(这意味着至少约有5000万个标签,因为每张照片有多个标签)。

我想使用elasticsearch使标签更快速地搜索。现在找到像"favorite"这样的所有标签需要在我的PSQL数据库中对数百万行进行行扫描。

我已经看到一些Rails与ElasticSearch集成的例子,他们似乎都遵循在PSQL DB中保存记录的模式将模型数据的副本保存到elasticsearch。这对我来说似乎是多余的,因为我没有真正需要将它们存储在PSQL中,并且它们只存在于被搜索中。

  1. 是否有可能(或者是一个好主意)消除Tag模型并将所有信息存储在elasticsearch中?如果是这样,我将如何加入数据?我假设我必须在我的Photo模型上编写一些自定义逻辑,用于查询elasticsearch中的所有tags where(id: @photo.id)

  2. 弹性搜索有一个很好的ORM可以很好地与ActiveRecord一起使用,并且可能有助于实现上面的#1吗?我想象我的PhotoTag模型使用不同的ORM,因为它们存储在不同的数据库中。

  3. 对于采用此设计的最佳方式的任何其他想法也是受欢迎的。

    谢谢!

1 个答案:

答案 0 :(得分:1)

据官方统计,ES人员并不建议将Elasticsearch用作主数据库,因为它首先不是数据存储。话虽如此,没有什么可以阻止你这样做,但如果你丢失了数据,你就不会责怪ES。

您需要问自己的另一个问题是如何在出现问题时重建您的ES索引(它会!!)。如果您没有将标签保存在PSQL中,则无法在ES数据因任何原因(ES错误,Lucene错误,HDD / SDD故障等)损坏的情况下重建它们

对于您的用例,我会将searchkick视为潜在的解决方案。