0

我在 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”、“gender”、“is_premium”、“status”、“created_at”、“birthdate”、“location”。在 Elasticsearch 中,我只想保存“id”、“gender”、“birthdate”、“location”

我怎样才能做到这一点?谢谢你的帮助。

4

1 回答 1

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被使用,它总是做一个“哑”的完整更新,而不是试图只发送增量。

于 2014-04-14T14:42:22.237 回答