在我的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字段。但显然不是阵列。
现在当我搜索时,我得到零结果,因为过滤器正在寻找一个数组而且它只是一个返回的列表。
有没有办法可以将此字段索引为数组?或者有没有办法改变过滤器,使其再次起作用?
答案 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]