我正在使用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个问题:
非常感谢您的帮助。
答案 0 :(得分:0)
你要做的是高度非正统 - 尝试使用相同的数据同步两个不同的存储库是脆弱的,容易出错并且是一个令人头痛的秘诀。
根据您的代码段中显示的数据类型,我甚至没有看到用例,为什么不只是add an index到您的帖子表? Postgres甚至支持full text search,所以即使你真的有诱惑使用弹性搜索(毕竟 - 这是它的主要特征之一),对于大多数用例来说,postgres都会这样做。
在远程情况下,你绝对需要来自elasticsearch的功能,postgres没有提供,我建议将此表移植到elasticsearch 完全而不是试图保留这两个存储库同步...