1

在我的 Rails 应用程序中使用 Tire 与 Elasticsearch 进行通信。到目前为止,一切正常。

问题是索引一些外部数据源。

我有其他未在 Rails 中更新的源,并且正在使用Elasticsearch River JDBC 插件每 60 秒轮询一次数据库以获取此信息。

此数据可在 Rails 应用程序中访问。在其他模型中,我使用了一个简单的过滤器来限制用户对搜索数据的访问:

def self.search(params)
  tire.search(page: params[:page], per_page: 50) do |s|
    ...
    filter << { :terms => { location_users: [params[:user_id]] }} if params[:user_id]
    ...
  end
end

其中 location_users 在轮胎索引期间被映射为数组。

def to_indexed_json
  to_json methods: [:location_users]
end

def location_users
  location.users.map(&:id) if location
end

(我不希望用户搜索其他人的会计数据)

使用河流,我编写了一些 sql 来从 MySQL 获取数据和关联的表列。我可以获得 location_users 列表的唯一方法是执行以下操作:

SELECT a.*, l.location_name, GROUP_CONCAT(lu.id) as location_users FROM accounts...

这给了我一个带有逗号分隔值的 location_users 字段。但显然不是数组。

现在当我搜索时,我得到零个结果,因为过滤器正在寻找一个数组,它只是一个返回的列表。

有没有办法可以将此字段索引为数组?或者有没有办法改变过滤器,让它再次工作?

4

1 回答 1

0

您可以像这样重写 SQl:

SELECT a.*, l.location_name, GROUP_CONCAT(lu.id) as `location_users[]` FROM accounts...

当字段名以 '[]' 结尾时,Elasticsearch River JDBC 插件将通过拆分值(使用逗号作为分隔符)将值转换为数组并存储。所以字段数据'1, 2, 3, 4, 5'在索引时会变成[1, 2, 3, 4, 5]

于 2013-11-28T09:16:48.527 回答