Elasticsearch过滤来自MySQL JDBC河

时间:2013-09-03 09:52:21

标签: mysql ruby-on-rails jdbc elasticsearch tire

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

问题在于索引某些外部数据源。

我还有其他未在Rails中更新的来源,我使用Elasticsearch river JDBC plugin每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字段。但显然不是阵列。

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

有没有办法可以将此字段索引为数组?或者有没有办法改变过滤器,使其再次起作用?

1 个答案:

答案 0 :(得分: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]