在Rails中使用elasticsearch-model保存特定字段

时间:2014-04-14 12:13:22

标签: ruby-on-rails elasticsearch elasticsearch-model

我在Rails 4项目中使用elasticsearch-model gem将我的用户存储在MySQL和Elasticsearch中。在我的项目中,Elasticsearch部分用于查找具有某些MySQL字段的人员,例如geo_point,birthdate,gender等...但不是我在MySQL"用户"中的所有字段。表格对用户的搜索很有用。

因此,我想在MySQL中存储所有用户字段,并且只在Elasticsearch中存储用户搜索所需的字段。

要仅在创建时存储必填字段,我已覆盖方法' as_indexed_json'和使用:

as_json(only: ['id', 'gender', 'location']

在创造中,事情很有效。但是,当我使用仅应保存在MySQL中的字段更新用户时,无论如何都会将其添加到Elasticsearch。

例如,我的用户模型有" id","性别"," is_premium","状态"," created_at"," birthdate"," location"。 在Elasticsearch中,我只想保存" id","性别","生日和#34;,"位置"

我该怎么做? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这是elasticsearch-rails的问题(请参阅github)。

简而言之,默认更新回调调用update_document,但不使用as_indexed_json:它使用ActiveModel::Dirty仅发送更改的列。

您可以通过覆盖update_document方法来解决此问题,以便它只包含您想要的内容,或者更改回调的功能,例如

after_commit on: [:create, :update] do
  index_document
end

after_commit on: [:destroy] do
  delete_document
end

而不是使用默认的回调模块将导致index_document被使用,这总是进行“哑”完全更新,而不是尝试仅发送增量。