slingshot-rb 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +16 -12
- data/lib/slingshot/index.rb +7 -2
- data/lib/slingshot/version.rb +1 -1
- data/test/integration/index_mapping_test.rb +44 -0
- data/test/unit/index_test.rb +38 -0
- metadata +6 -4
data/README.markdown
CHANGED
@@ -11,7 +11,7 @@ RESTful database communicating by JSON over HTTP, based on [Lucene](http://lucen
|
|
11
11
|
written in Java. It manages to very simple and very powerful at the same time.
|
12
12
|
You should seriously consider it to power search in your Ruby applications:
|
13
13
|
it will deliver all the features you want — and many more you may have not
|
14
|
-
imagined yet (native geo search? histogram facets?)
|
14
|
+
imagined yet (native geo search? histogram facets for dates?)
|
15
15
|
|
16
16
|
_Slingshot_ currently allows basic operation with the index and searching. More is planned.
|
17
17
|
|
@@ -21,9 +21,9 @@ Installation
|
|
21
21
|
|
22
22
|
First, you need a running _ElasticSearch_ server. Thankfully, it's easy. Let's define easy:
|
23
23
|
|
24
|
-
$ curl -L -o elasticsearch-0.
|
25
|
-
$ tar -zxvf elasticsearch-0.
|
26
|
-
$ ./elasticsearch-0.
|
24
|
+
$ curl -k -L -o elasticsearch-0.15.0.tar.gz http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.15.0.tar.gz
|
25
|
+
$ tar -zxvf elasticsearch-0.15.0.tar.gz
|
26
|
+
$ ./elasticsearch-0.15.0/bin/elasticsearch -f
|
27
27
|
|
28
28
|
OK, easy. Now, install the gem via Rubygems:
|
29
29
|
|
@@ -40,9 +40,10 @@ Usage
|
|
40
40
|
-----
|
41
41
|
|
42
42
|
Currently, you can use _Slingshot_ via the DSL (eg. by extending your class with it).
|
43
|
-
Plans for full ActiveModel integration (and other convenience layers) are in progress
|
43
|
+
Plans for full ActiveModel integration (and other convenience layers) are in progress
|
44
|
+
(see the [`activemodel`](https://github.com/karmi/slingshot/compare/activemodel) branch).
|
44
45
|
|
45
|
-
To kick the
|
46
|
+
To kick the tires, require the gem in an IRB session or a Ruby script
|
46
47
|
(note that you can run the full example from [`examples/dsl.rb`](https://github.com/karmi/slingshot/blob/master/examples/dsl.rb)):
|
47
48
|
|
48
49
|
require 'rubygems'
|
@@ -112,7 +113,9 @@ We can display the full query JSON:
|
|
112
113
|
puts s.to_json
|
113
114
|
# {"facets":{"current-tags":{"terms":{"field":"tags"}},"global-tags":{"global":true,"terms":{"field":"tags"}}},"sort":[{"title":"desc"}],"query":{"terms":{"tags":["ruby"]}}}
|
114
115
|
|
115
|
-
See, a Ruby DSL for this thing is kinda handy?
|
116
|
+
See, a Ruby DSL for this thing is kinda handy?
|
117
|
+
|
118
|
+
You can display the corresponding `curl` command easily:
|
116
119
|
|
117
120
|
puts s.to_curl
|
118
121
|
# curl -X POST "http://localhost:9200/articles/_search?pretty=true" -d '{"facets":{"current-tags":{"terms":{"field":"tags"}},"global-tags":{"global":true,"terms":{"field":"tags"}}},"sort":[{"title":"desc"}],"query":{"terms":{"tags":["ruby"]}}}'
|
@@ -128,7 +131,7 @@ Currently, _Slingshot_ supports only a limited subset of vast _ElasticSearch_ [S
|
|
128
131
|
* [Querying](https://github.com/karmi/slingshot/blob/master/examples/dsl.rb) the index with the `query_string`, `term` and `terms` types of queries
|
129
132
|
* Sorting the results by `fields`
|
130
133
|
* Retrieving a _terms_ type of [facets](http://www.elasticsearch.org/guide/reference/api/search/facets/index.html) -- other types are high priority
|
131
|
-
* Returning just specific fields from documents
|
134
|
+
* Returning just specific `fields` from documents
|
132
135
|
* Paging with `from` and `size` query options
|
133
136
|
|
134
137
|
See the [`examples/dsl.rb`](blob/master/examples/dsl.rb).
|
@@ -145,12 +148,13 @@ Todo & Plans
|
|
145
148
|
|
146
149
|
In order of importance:
|
147
150
|
|
148
|
-
* Seamless _ActiveModel_ compatibility for easy usage in _Rails_ applications (this also means nearly full _ActiveRecord_ compatibility)
|
151
|
+
* Seamless _ActiveModel_ compatibility for easy usage in _Rails_ applications (this also means nearly full _ActiveRecord_ compatibility). See the [`activemodel`](https://github.com/karmi/slingshot/compare/activemodel) branch
|
149
152
|
* Seamless [will_paginate](https://github.com/mislav/will_paginate) compatibility for easy pagination
|
153
|
+
* [Mapping](http://www.elasticsearch.org/guide/reference/mapping/) definition for models
|
154
|
+
* Proper RDoc annotations for the source code
|
155
|
+
* Dual interface: allow to simply pass queries/options for _ElasticSearch_ as a Hash in any method
|
150
156
|
* [Histogram](http://www.elasticsearch.org/guide/reference/api/search/facets/histogram-facet.html) facets
|
151
157
|
* Seamless support for [auto-updating _river_ index](http://www.elasticsearch.org/guide/reference/river/couchdb.html) for _CouchDB_ `_changes` feed
|
152
|
-
* [Mapping](http://www.elasticsearch.org/guide/reference/mapping/) management
|
153
|
-
* Proper RDoc annotations for the source code
|
154
158
|
* Infrastructure for query filters
|
155
159
|
* [Range](http://www.elasticsearch.org/guide/reference/query-dsl/range-filter.html) filters and queries
|
156
160
|
* [Geo Filters](http://www.elasticsearch.org/blog/2010/08/16/geo_location_and_search.html) for queries
|
@@ -160,7 +164,7 @@ In order of importance:
|
|
160
164
|
* [Analyze](http://www.elasticsearch.org/guide/reference/api/admin-indices-analyze.html) API support
|
161
165
|
* [Highligting](http://www.elasticsearch.org/guide/reference/api/search/highlighting.html) support
|
162
166
|
* [Bulk](http://www.elasticsearch.org/guide/reference/api/bulk.html) API
|
163
|
-
* Embedded webserver to display
|
167
|
+
* Embedded webserver to display statistics and to allow easy searches
|
164
168
|
|
165
169
|
|
166
170
|
Other Clients
|
data/lib/slingshot/index.rb
CHANGED
@@ -13,12 +13,17 @@ module Slingshot
|
|
13
13
|
false
|
14
14
|
end
|
15
15
|
|
16
|
-
def create
|
17
|
-
|
16
|
+
def create(options={})
|
17
|
+
# http://www.elasticsearch.org/guide/reference/api/admin-indices-create-index.html
|
18
|
+
Configuration.client.post "#{Configuration.url}/#{@name}", Yajl::Encoder.encode(options)
|
18
19
|
rescue
|
19
20
|
false
|
20
21
|
end
|
21
22
|
|
23
|
+
def mapping
|
24
|
+
JSON.parse( Configuration.client.get("#{Configuration.url}/#{@name}/_mapping") )[@name]
|
25
|
+
end
|
26
|
+
|
22
27
|
def store(*args)
|
23
28
|
# TODO: Infer type from the document (hash property, method)
|
24
29
|
|
data/lib/slingshot/version.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Slingshot
|
4
|
+
|
5
|
+
class IndexMappingTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Default mapping" do
|
9
|
+
teardown { Slingshot.index('mapped-index').delete }
|
10
|
+
|
11
|
+
should "create and return the default mapping" do
|
12
|
+
|
13
|
+
index = Slingshot.index 'mapped-index' do
|
14
|
+
create
|
15
|
+
store :article, :title => 'One'
|
16
|
+
refresh
|
17
|
+
end
|
18
|
+
sleep 1
|
19
|
+
|
20
|
+
assert_equal 'string', index.mapping['article']['properties']['title']['type'], index.mapping.inspect
|
21
|
+
assert_nil index.mapping['article']['properties']['title']['boost'], index.mapping.inspect
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "Creating index with mapping" do
|
26
|
+
teardown { Slingshot.index('mapped-index').delete; sleep 1 }
|
27
|
+
|
28
|
+
should "create the specified mapping" do
|
29
|
+
|
30
|
+
index = Slingshot.index 'mapped-index' do
|
31
|
+
create :mappings => { :article => { :properties => { :title => { :type => 'string', :boost => 2.0, :store => 'yes' } } } }
|
32
|
+
end
|
33
|
+
sleep 1
|
34
|
+
|
35
|
+
# p index.mapping
|
36
|
+
assert_equal 2.0, index.mapping['article']['properties']['title']['boost'], index.mapping.inspect
|
37
|
+
assert_equal 'yes', index.mapping['article']['properties']['title']['store'], index.mapping.inspect
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/test/unit/index_test.rb
CHANGED
@@ -37,6 +37,44 @@ module Slingshot
|
|
37
37
|
assert_nothing_raised { assert @index.refresh }
|
38
38
|
end
|
39
39
|
|
40
|
+
context "mapping" do
|
41
|
+
|
42
|
+
should "create index with mapping" do
|
43
|
+
Configuration.client.expects(:post).returns('{"ok":true,"acknowledged":true}')
|
44
|
+
|
45
|
+
assert @index.create :settings => { :number_of_shards => 1 },
|
46
|
+
:mappings => { :article => {
|
47
|
+
:properties => {
|
48
|
+
:title => { :boost => 2.0,
|
49
|
+
:type => 'string',
|
50
|
+
:store => 'yes',
|
51
|
+
:analyzer => 'snowball' }
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
should "return the mapping" do
|
58
|
+
json =<<-JSON
|
59
|
+
{
|
60
|
+
"dummy" : {
|
61
|
+
"article" : {
|
62
|
+
"properties" : {
|
63
|
+
"title" : { "type" : "string", "boost" : 2.0 },
|
64
|
+
"category" : { "type" : "string", "analyzed" : "no" }
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
JSON
|
70
|
+
Configuration.client.stubs(:get).returns(json)
|
71
|
+
|
72
|
+
assert_equal 'string', @index.mapping['article']['properties']['title']['type']
|
73
|
+
assert_equal 2.0, @index.mapping['article']['properties']['title']['boost']
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
40
78
|
context "when storing" do
|
41
79
|
|
42
80
|
should "properly set type from args" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slingshot-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Karel Minarik
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02
|
18
|
+
date: 2011-03-02 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- test/fixtures/articles/4.json
|
175
175
|
- test/fixtures/articles/5.json
|
176
176
|
- test/integration/facets_test.rb
|
177
|
+
- test/integration/index_mapping_test.rb
|
177
178
|
- test/integration/index_store_test.rb
|
178
179
|
- test/integration/query_string_test.rb
|
179
180
|
- test/integration/results_test.rb
|
@@ -233,6 +234,7 @@ test_files:
|
|
233
234
|
- test/fixtures/articles/4.json
|
234
235
|
- test/fixtures/articles/5.json
|
235
236
|
- test/integration/facets_test.rb
|
237
|
+
- test/integration/index_mapping_test.rb
|
236
238
|
- test/integration/index_store_test.rb
|
237
239
|
- test/integration/query_string_test.rb
|
238
240
|
- test/integration/results_test.rb
|