我正在使用Datamapper作为ORM编写Rails 3应用程序。我正在寻找使用ElasticSearch进行搜索但不能使用Tire gem,因为它似乎依赖于ActiveRecord。
我正在使用RestClient向ElasticSearch提交请求,但在ruby中解析响应时遇到问题。
如果我提交GET请求“http://localhost:9200/twitter/tweet/2
”,我会在浏览器中收到以下内容:
{
"_index": "twitter",
"_type": "tweet",
"_id": "2",
"_version": 3,
"exists": true,
"_source": {
"user": "kimchy",
"post_date": "2009-11-15T14:12:12",
"message": "kimchy kimchy says"
}
}
在Rails中,当我键入以下内容时:
response = RestClient.get 'http://localhost:9200/twitter/tweet/2',{:content_type => :json, :accept => :json}
我得到了这个结果:
{
"_index": "twitter",
"_type": "tweet",
"_id": "2",
"_version": 3,
"exists": true,
"_source": {
"user": "kimchy",
"post_date": "2009-11-15T14:12:12",
"message": "kimchy kimchy says"
}
}
这看起来很正确,但是我无法像使用JSON那样使用点符号来获取数据。
例如,我无法编写response._type
,因为我收到了未定义的方法错误。
真的很感激任何帮助!
答案 0 :(得分:2)
如果您想进行手动转换,可以解析json的响应并手动将其转换为对象以访问带点符号的字段。
这样的事情:
require 'json'
require 'ostruct'
response = RestClient.get '...url...'
o = OpenStruct.new(JSON.parse(response))
然后,您应该能够访问包含o._type
或o.message
。
答案 1 :(得分:0)
或许比你正在寻找的答案更广泛......
我使用this gist之类的东西将我的RestClient调用包装到ElasticSearch。它解析JSON输出,并挽救一些RestClient的异常以解析并将服务器输出传递给客户端代码。
以下是您的简明版本:
# url and method are provided as a param
options = { url: '...', method: '...' }
# default options
options = {
headers: {
accept: :json,
content_type: :json
},
open_timeout: 1,
timeout: 1
}
begin
request = RestClient::Request.new(options)
response = request.execute
JSON.parse(response.to_str)
rescue RestClient::BadRequest => e # and others...
# log e.message
JSON.parse(e.response.to_str)
end
最后,您将获得从ElasticSearch的JSON响应中解析的哈希值。
这一切如何与DataMapper交互有点超出我的正常体验,但可以在评论中澄清或提出进一步的问题。