2015-06-06 48 views
1

我有一個紅寶石碼塊,如下所示:如何使用ruby來遍歷這個json文檔?

require "elasticsearch" 
require "json" 

search_term = "big data" 
city = "Hong Kong" 
client = Elasticsearch::Client.new log: true 
r = client.search index: 'candidates', body: 
{ 
    query: { 
    bool: { 
     must: [ 
     { 
      match: { 
      tags: search_term 
      } 
     }, 
     { 
      match: { 
      city: city 
      } 
     } 
     ] 
    } 
    } 
} 

它產生多個返回像這樣的:

{"_index":"candidates","_type":"data", 
"_id":"AU3DyAmvtewNSFHuYn88", 
"_score":3.889237, 
"_source":{"first":"Kota","last":"Okayama","city":"Tokyo","designation":"Systems Engineer","email":"[email protected]","phone":"phone","country":"Japan","industry":"Technology","tags":["remarks","virtualization big data"]}} 

我想來遍歷它並提取各種元素。我曾嘗試

data = JSON.parse(r) 
    data.each do |row| 
    puts row["_source"]["first"] 
end 

和錯誤是:

no implicit conversion of Hash into String (TypeError) 

什麼是最好的前進道路上這個傢伙?

+0

剛剛嘗試包括完整的字符串爲單引號試試下面的代碼IRB H ='{ 「_指數」: 「考生」, 「_類型」: 「數據」, 「_id」: 「AU3DyAmvtewNSFHuYn88」, 「_score」 :3.889237, 「_source」:{「first」:「Kota」,「last」:「岡山」,「city」:「東京」,「指定」:「系統工程師」,「email」:「user @ hotmail .co.jp「,」phone「:」phone「,」country「:」Japan「,」industry「:」Technology「,」tags「:[」備註「,」虛擬化大數據「]}}' 那麼你可以訪問值h [「國家」] –

+0

謝謝,這將返回多個錯誤。我希望能夠提取元素以將它們打印爲HTML,並使用電子郵件地址發送廣播電子郵件 – user1903663

+0

您可以請檢查一下您是否錯過了某些東西,因爲我剛剛嘗試它後從控制檯上粘貼了它 –

回答

1

我有解決方案,我希望它可以幫助別人。花了我幾個小時的擺弄和試驗。這裏是:

require "elasticsearch" 
require "json" 

search_term = "big data" 
city = "Tokyo" 
client = Elasticsearch::Client.new log: true 

h = client.search index: 'swiss_candidates', body: 
{ 
    query: { 
    bool: { 
     must: [ 
     { 
      match: { 
      tags: search_term 
      } 
     }, 
     { 
      match: { 
      city: city 
      } 
     } 
     ] 
    } 
    } 
} 

data = JSON.parse(h.to_json) 
data["hits"]["hits"].each do |r| 
puts r["_id"] 
puts r["_source"]["first"] 
puts r["_source"]["tags"][1] 
puts r["_source"]["screened"][0] 
end 

重要的事情似乎是將elasticsearch結果轉換成紅寶石友好的結果。

0

JSON.parse預計包含JSON文檔的String,但您傳遞的是從client.search返回的Hash

我不完全確定你在試圖達到什麼目的,爲什麼你想解析一些已經是Ruby Hash的東西到Ruby Hash

+0

謝謝。我希望能夠從散列中提取每個電子郵件地址,例如通過mandrill發送郵件。我將如何隔離電子郵件地址? @email = r [「_ source」] [「email」]例如? – user1903663

+0

謝謝,如果上述情況如此,我如何訪問哈希按原樣來遍歷元素? – user1903663