1

我正在编写一个使用 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,因为我得到一个未定义的方法错误。

非常感谢您对此的任何帮助!

4

2 回答 2

2

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

像这样的东西:

require 'json'
require 'ostruct'

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

然后您应该能够使用o._type或访问字段o.message

于 2012-05-09T13:38:21.560 回答
0

也许比您正在寻找的答案更广泛……</p>

我使用类似这个要点的东西来包装我对 ElasticSearch 的 RestClient 调用。它解析 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 交互有点超出我的正常经验,但请随时在评论中澄清或提出更多问题。

于 2012-05-09T21:46:59.620 回答