解析RestClient中的弹性搜索响应

时间:2012-05-03 11:20:28

标签: ruby-on-rails-3 json datamapper elasticsearch rest-client

我正在使用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,因为我收到了未定义的方法错误。

真的很感激任何帮助!

2 个答案:

答案 0 :(得分:2)

如果您想进行手动转换,可以解析json的响应并手动将其转换为对象以访问带点符号的字段。

这样的事情:

require 'json'
require 'ostruct'

response = RestClient.get '...url...'
o = OpenStruct.new(JSON.parse(response))

然后,您应该能够访问包含o._typeo.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交互有点超出我的正常体验,但可以在评论中澄清或提出进一步的问题。