使用ruby,如何使用elasticsearch索引postgres数据库?

时间:2014-06-11 17:12:53

标签: ruby postgresql elasticsearch sinatra

我正在使用sinatra和postgres。我想索引一个postgres数据库。

红宝石代码是:

get '/elastic_data' do
client = Elasticsearch::Client.new log: true
candidates.select(:id, :first, :last, :email, :industry).map do |row|
@first = row[:first]
puts @first
@industry = row[:industry]
puts @industry
result = {first:@first, industry:@industry}.to_json
client.index  index: 'people', type: 'py', id: 1, body: result
end
end

当我运行它时,在终端中我得到了一个看似很好的json,如下所示:

Eric
Legal
2014-06-11 18:05:00 +0100: PUT http://localhost:9200/people/py/1 [status:200, request:0.004s, query:n/a]
2014-06-11 18:05:00 +0100: > {"first":"Eric","industry":"Legal"}
2014-06-11 18:05:00 +0100: < {"ok":true,"_index":"people","_type":"py","_id":"1","_version":10143}
Kewu
Legal
2014-06-11 18:05:00 +0100: PUT http://localhost:9200/people/py/1 [status:200, request:0.002s, query:n/a]
2014-06-11 18:05:00 +0100: > {"first":"Kewu","industry":"Legal"}
2014-06-11 18:05:00 +0100: < {"ok":true,"_index":"people","_type":"py","_id":"1","_version":10144}

然后我收到一条错误消息:

NoMethodError at /elastic_data
undefined method `bytesize' for #<Hash:0x9228f40>

2个问题:

  1. 出了什么问题,我该如何解决?
  2. 是否有一个带有elasticsearch ruby​​ gem的“update”命令,这样我每次有新记录时都可以更新索引,或者每次进行搜索时都必须重新索引数据库?
  3. 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你要做的是高度非正统 - 尝试使用相同的数据同步两个不同的存储库是脆弱的,容易出错并且是一个令人头痛的秘诀。

根据您的代码段中显示的数据类型,我甚至没有看到用例,为什么不只是add an index到您的帖子表? Postgres甚至支持full text search,所以即使你真的有诱惑使用弹性搜索(毕竟 - 这是它的主要特征之一),对于大多数用例来说,postgres都会这样做。

在远程情况下,你绝对需要来自elasticsearch的功能,postgres没有提供,我建议将此表移植到elasticsearch 完全而不是试图保留这两个存储库同步...