我有一个带有以下简化模型结构的照片共享应用
User: has_many :photos
Photo: has_many :tags
Tag
假设此应用程序正在高规模运行,至少有1000万至2000万张照片记录(这意味着至少约有5000万个标签,因为每张照片有多个标签)。
我想使用elasticsearch使标签更快速地搜索。现在找到像"favorite"
这样的所有标签需要在我的PSQL数据库中对数百万行进行行扫描。
我已经看到一些Rails与ElasticSearch集成的例子,他们似乎都遵循在PSQL DB中保存记录的模式和将模型数据的副本保存到elasticsearch。这对我来说似乎是多余的,因为我没有真正需要将它们存储在PSQL中,并且它们只存在于被搜索中。
是否有可能(或者是一个好主意)消除Tag
模型并将所有信息存储在elasticsearch中?如果是这样,我将如何加入数据?我假设我必须在我的Photo
模型上编写一些自定义逻辑,用于查询elasticsearch中的所有tags
where(id: @photo.id)
弹性搜索有一个很好的ORM可以很好地与ActiveRecord一起使用,并且可能有助于实现上面的#1吗?我想象我的Photo
和Tag
模型使用不同的ORM,因为它们存储在不同的数据库中。
对于采用此设计的最佳方式的任何其他想法也是受欢迎的。
谢谢!
答案 0 :(得分:1)
据官方统计,ES人员并不建议将Elasticsearch用作主数据库,因为它首先不是数据存储。话虽如此,没有什么可以阻止你这样做,但如果你丢失了数据,你就不会责怪ES。
您需要问自己的另一个问题是如何在出现问题时重建您的ES索引(它会!!)。如果您没有将标签保存在PSQL中,则无法在ES数据因任何原因(ES错误,Lucene错误,HDD / SDD故障等)损坏的情况下重建它们
对于您的用例,我会将searchkick视为潜在的解决方案。