| = Using Solr From Ruby |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| Solr has an optional Ruby response format that extends the <<response-writers.adoc#json-response-writer,JSON output>> to allow the response to be safely eval'd by Ruby's interpreter |
| |
| This Ruby response format differs from JSON in the following ways: |
| |
| * Ruby's single quoted strings are used to prevent possible string exploits |
| ** `\` and `'` are the only two characters escaped... |
| ** unicode escapes not used... data is written as raw UTF-8 |
| * nil used for null |
| * `\=>` used as the key/value separator in maps |
| |
| Here's an example Ruby response from Solr, for a request like `\http://localhost:8983/solr/techproducts/select?q=iPod&wt=ruby&indent=on` (with Solr launching using `bin/solr start -e techproducts`): |
| |
| [source,ruby] |
| ---- |
| { |
| 'responseHeader'=>{ |
| 'status'=>0, |
| 'QTime'=>0, |
| 'params'=>{ |
| 'q'=>'iPod', |
| 'indent'=>'on', |
| 'wt'=>'ruby'}}, |
| 'response'=>{'numFound'=>3,'start'=>0,'docs'=>[ |
| { |
| 'id'=>'IW-02', |
| 'name'=>'iPod & iPod Mini USB 2.0 Cable', |
| 'manu'=>'Belkin', |
| 'manu_id_s'=>'belkin', |
| 'cat'=>['electronics', |
| 'connector'], |
| 'features'=>['car power adapter for iPod, white'], |
| 'weight'=>2.0, |
| 'price'=>11.5, |
| 'price_c'=>'11.50,USD', |
| 'popularity'=>1, |
| 'inStock'=>false, |
| 'store'=>'37.7752,-122.4232', |
| 'manufacturedate_dt'=>'2006-02-14T23:55:59Z', |
| '_version_'=>1491038048794705920}, |
| { |
| 'id'=>'F8V7067-APL-KIT', |
| 'name'=>'Belkin Mobile Power Cord for iPod w/ Dock', |
| 'manu'=>'Belkin', |
| 'manu_id_s'=>'belkin', |
| 'cat'=>['electronics', |
| 'connector'], |
| 'features'=>['car power adapter, white'], |
| 'weight'=>4.0, |
| 'price'=>19.95, |
| 'price_c'=>'19.95,USD', |
| 'popularity'=>1, |
| 'inStock'=>false, |
| 'store'=>'45.18014,-93.87741', |
| 'manufacturedate_dt'=>'2005-08-01T16:30:25Z', |
| '_version_'=>1491038048792608768}, |
| { |
| 'id'=>'MA147LL/A', |
| 'name'=>'Apple 60 GB iPod with Video Playback Black', |
| 'manu'=>'Apple Computer Inc.', |
| 'manu_id_s'=>'apple', |
| 'cat'=>['electronics', |
| 'music'], |
| 'features'=>['iTunes, Podcasts, Audiobooks', |
| 'Stores up to 15,000 songs, 25,000 photos, or 150 hours of video', |
| '2.5-inch, 320x240 color TFT LCD display with LED backlight', |
| 'Up to 20 hours of battery life', |
| 'Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video', |
| 'Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication'], |
| 'includes'=>'earbud headphones, USB cable', |
| 'weight'=>5.5, |
| 'price'=>399.0, |
| 'price_c'=>'399.00,USD', |
| 'popularity'=>10, |
| 'inStock'=>true, |
| 'store'=>'37.7752,-100.0232', |
| 'manufacturedate_dt'=>'2005-10-12T08:00:00Z', |
| '_version_'=>1491038048799948800}] |
| }} |
| ---- |
| |
| Here is a simple example of how one may query Solr using the Ruby response format: |
| |
| [source,ruby] |
| ---- |
| require 'net/http' |
| |
| h = Net::HTTP.new('localhost', 8983) |
| http_response = h.get('/solr/techproducts/select?q=iPod&wt=ruby') |
| rsp = eval(http_response.body) |
| |
| puts 'number of matches = ' + rsp['response']['numFound'].to_s |
| #print out the name field for each returned document |
| rsp['response']['docs'].each { |doc| puts 'name field = ' + doc['name'] } |
| ---- |
| |
| For simple interactions with Solr, this may be all you need! If you are building complex interactions with Solr, then consider the libraries mentioned at https://wiki.apache.org/solr/Ruby%20Response%20Format |