daedal 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +8 -1
- data/.travis.yml +7 -0
- data/Gemfile +9 -7
- data/Gemfile.lock +47 -32
- data/README.md +115 -56
- data/daedal.gemspec +0 -1
- data/lib/daedal.rb +41 -5
- data/lib/daedal/attributes/boost.rb +7 -0
- data/lib/daedal/attributes/facet.rb +13 -0
- data/lib/daedal/attributes/field.rb +7 -0
- data/lib/daedal/attributes/filter.rb +2 -2
- data/lib/daedal/attributes/filter_array.rb +4 -4
- data/lib/daedal/attributes/query.rb +2 -2
- data/lib/daedal/attributes/query_array.rb +2 -2
- data/lib/daedal/attributes/query_value.rb +19 -0
- data/lib/daedal/facets/facet.rb +15 -0
- data/lib/daedal/filters/and_filter.rb +2 -5
- data/lib/daedal/filters/bool_filter.rb +15 -0
- data/lib/daedal/filters/{base_filter.rb → filter.rb} +1 -3
- data/lib/daedal/filters/geo_distance_filter.rb +6 -9
- data/lib/daedal/filters/or_filter.rb +18 -0
- data/lib/daedal/filters/range_filter.rb +8 -8
- data/lib/daedal/filters/term_filter.rb +3 -6
- data/lib/daedal/filters/terms_filter.rb +3 -6
- data/lib/daedal/queries/bool_query.rb +8 -11
- data/lib/daedal/queries/constant_score_query.rb +4 -8
- data/lib/daedal/queries/dis_max_query.rb +5 -9
- data/lib/daedal/queries/filtered_query.rb +3 -8
- data/lib/daedal/queries/fuzzy_query.rb +24 -0
- data/lib/daedal/queries/match_all_query.rb +1 -3
- data/lib/daedal/queries/match_query.rb +11 -15
- data/lib/daedal/queries/multi_match_query.rb +12 -16
- data/lib/daedal/queries/nested_query.rb +7 -10
- data/lib/daedal/queries/prefix_query.rb +7 -9
- data/lib/daedal/queries/{base_query.rb → query.rb} +1 -4
- data/lib/daedal/queries/query_string_query.rb +32 -0
- data/lib/daedal/version.rb +1 -1
- data/spec/spec_helper.rb +4 -2
- data/spec/unit/daedal/filters/and_filter_spec.rb +0 -1
- data/spec/unit/daedal/filters/bool_filter_spec.rb +89 -0
- data/spec/unit/daedal/filters/geo_distance_filter_spec.rb +0 -1
- data/spec/unit/daedal/filters/or_filter_spec.rb +74 -0
- data/spec/unit/daedal/filters/range_filter_spec.rb +0 -1
- data/spec/unit/daedal/filters/term_filter_spec.rb +0 -1
- data/spec/unit/daedal/filters/terms_filter_spec.rb +4 -2
- data/spec/unit/daedal/queries/bool_query_spec.rb +1 -3
- data/spec/unit/daedal/queries/constant_score_query_spec.rb +0 -2
- data/spec/unit/daedal/queries/dis_max_query_spec.rb +1 -2
- data/spec/unit/daedal/queries/filtered_query_spec.rb +1 -3
- data/spec/unit/daedal/queries/fuzzy_query_spec.rb +89 -0
- data/spec/unit/daedal/queries/match_all_query_spec.rb +0 -1
- data/spec/unit/daedal/queries/match_query_spec.rb +2 -3
- data/spec/unit/daedal/queries/multi_match_query_spec.rb +2 -3
- data/spec/unit/daedal/queries/nested_query_spec.rb +0 -2
- data/spec/unit/daedal/queries/prefix_query_spec.rb +0 -1
- data/spec/unit/daedal/queries/query_string_spec.rb +296 -0
- metadata +18 -7
- data/lib/daedal/attributes.rb +0 -15
- data/lib/daedal/filters.rb +0 -11
- data/lib/daedal/queries.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c847bcafde8c2364dd1105418bf51ddb0f6ecd42
|
4
|
+
data.tar.gz: 4abb328be7b9473dec47854db2e1207cce6589e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50cd4b1ab8720509f8b38a7968b2e1f3258d75c7fd79a3771ddf12390210e1d13d0afcbf72fe961d12d75eba477e719922e53cc17feca06fe6a94b51200d89b6
|
7
|
+
data.tar.gz: cab1fa56a98d7f0c3380d57af1e0a96c027235080a19ad3db38818127f610103633fb91e61169ff63ccc24c9fc1a53c406dcf96f31a11a9101872d3e6e3599d2
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
gem '
|
7
|
-
gem '
|
8
|
-
gem '
|
9
|
-
gem '
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development, :test do
|
6
|
+
gem 'rspec'
|
7
|
+
gem 'coveralls'
|
8
|
+
gem 'guard'
|
9
|
+
gem 'guard-rspec'
|
10
|
+
gem 'fuubar'
|
11
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
daedal (0.0.4)
|
5
|
+
virtus (>= 1.0.0)
|
6
|
+
|
1
7
|
GEM
|
2
8
|
remote: https://rubygems.org/
|
3
9
|
specs:
|
@@ -5,64 +11,74 @@ GEM
|
|
5
11
|
descendants_tracker (~> 0.0.1)
|
6
12
|
ice_nine (~> 0.9)
|
7
13
|
backports (3.3.5)
|
8
|
-
|
14
|
+
celluloid (0.15.2)
|
15
|
+
timers (~> 1.1.0)
|
16
|
+
coderay (1.1.0)
|
9
17
|
coercible (0.2.0)
|
10
18
|
backports (~> 3.0, >= 3.1.0)
|
11
19
|
descendants_tracker (~> 0.0.1)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
debugger-ruby_core_source (1.2.3)
|
20
|
+
coveralls (0.7.0)
|
21
|
+
multi_json (~> 1.3)
|
22
|
+
rest-client
|
23
|
+
simplecov (>= 0.7)
|
24
|
+
term-ansicolor
|
25
|
+
thor
|
19
26
|
descendants_tracker (0.0.3)
|
20
|
-
diff-lcs (1.2.
|
27
|
+
diff-lcs (1.2.5)
|
21
28
|
equalizer (0.0.8)
|
22
|
-
ffi (1.9.
|
29
|
+
ffi (1.9.3)
|
23
30
|
formatador (0.2.4)
|
24
31
|
fuubar (1.2.1)
|
25
32
|
rspec (~> 2.0)
|
26
33
|
rspec-instafail (~> 0.2.0)
|
27
34
|
ruby-progressbar (~> 1.0)
|
28
|
-
guard (
|
35
|
+
guard (2.2.4)
|
29
36
|
formatador (>= 0.2.4)
|
30
|
-
listen (~> 1
|
31
|
-
lumberjack (
|
32
|
-
pry (>= 0.9.
|
33
|
-
thor (>= 0.
|
34
|
-
guard-rspec (
|
35
|
-
guard (>= 1.
|
36
|
-
rspec (
|
37
|
+
listen (~> 2.1)
|
38
|
+
lumberjack (~> 1.0)
|
39
|
+
pry (>= 0.9.12)
|
40
|
+
thor (>= 0.18.1)
|
41
|
+
guard-rspec (4.2.0)
|
42
|
+
guard (>= 2.1.1)
|
43
|
+
rspec (>= 2.14, < 4.0)
|
37
44
|
ice_nine (0.10.0)
|
38
|
-
listen (
|
45
|
+
listen (2.4.0)
|
46
|
+
celluloid (>= 0.15.2)
|
39
47
|
rb-fsevent (>= 0.9.3)
|
40
48
|
rb-inotify (>= 0.9)
|
41
|
-
rb-kqueue (>= 0.2)
|
42
49
|
lumberjack (1.0.4)
|
43
50
|
method_source (0.8.2)
|
44
|
-
|
45
|
-
|
51
|
+
mime-types (2.0)
|
52
|
+
multi_json (1.8.2)
|
53
|
+
pry (0.9.12.4)
|
54
|
+
coderay (~> 1.0)
|
46
55
|
method_source (~> 0.8)
|
47
56
|
slop (~> 3.4)
|
48
57
|
rb-fsevent (0.9.3)
|
49
58
|
rb-inotify (0.9.2)
|
50
59
|
ffi (>= 0.5.0)
|
51
|
-
|
52
|
-
|
53
|
-
require_all (1.3.1)
|
60
|
+
rest-client (1.6.7)
|
61
|
+
mime-types (>= 1.16)
|
54
62
|
rspec (2.14.1)
|
55
63
|
rspec-core (~> 2.14.0)
|
56
64
|
rspec-expectations (~> 2.14.0)
|
57
65
|
rspec-mocks (~> 2.14.0)
|
58
|
-
rspec-core (2.14.
|
59
|
-
rspec-expectations (2.14.
|
66
|
+
rspec-core (2.14.7)
|
67
|
+
rspec-expectations (2.14.4)
|
60
68
|
diff-lcs (>= 1.1.3, < 2.0)
|
61
69
|
rspec-instafail (0.2.4)
|
62
|
-
rspec-mocks (2.14.
|
70
|
+
rspec-mocks (2.14.4)
|
63
71
|
ruby-progressbar (1.2.0)
|
64
|
-
|
72
|
+
simplecov (0.7.1)
|
73
|
+
multi_json (~> 1.0)
|
74
|
+
simplecov-html (~> 0.7.1)
|
75
|
+
simplecov-html (0.7.1)
|
76
|
+
slop (3.4.7)
|
77
|
+
term-ansicolor (1.2.2)
|
78
|
+
tins (~> 0.8)
|
65
79
|
thor (0.18.1)
|
80
|
+
timers (1.1.0)
|
81
|
+
tins (0.13.1)
|
66
82
|
virtus (1.0.0)
|
67
83
|
axiom-types (~> 0.0.5)
|
68
84
|
coercible (~> 0.2)
|
@@ -73,10 +89,9 @@ PLATFORMS
|
|
73
89
|
ruby
|
74
90
|
|
75
91
|
DEPENDENCIES
|
76
|
-
|
92
|
+
coveralls
|
93
|
+
daedal!
|
77
94
|
fuubar
|
78
95
|
guard
|
79
96
|
guard-rspec
|
80
|
-
require_all
|
81
97
|
rspec
|
82
|
-
virtus (>= 1.0.0)
|
data/README.md
CHANGED
@@ -1,79 +1,109 @@
|
|
1
1
|
Daedal
|
2
2
|
======
|
3
|
+
[![Build Status](https://travis-ci.org/cschuch/daedal.png?branch=master)](https://travis-ci.org/cschuch/daedal)
|
4
|
+
[![Coverage Status](https://coveralls.io/repos/cschuch/daedal/badge.png)](https://coveralls.io/r/cschuch/daedal)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/daedal.png)](http://badge.fury.io/rb/daedal)
|
3
6
|
|
4
7
|
This repository contains a set of Ruby classes designed to make ElasticSearch
|
5
|
-
query creation simpler and easier to debug.
|
6
|
-
components of the ElasticSearch [Query DSL](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html)
|
7
|
-
to aid in the construction of complex queries. Type checking and attribute
|
8
|
+
query creation simpler and easier to debug. Type checking and attribute
|
8
9
|
coercion are handled using [Virtus](https://github.com/solnic/virtus) to make
|
9
10
|
it harder to construct invalid ElasticSearch queries before sending them to the server.
|
10
11
|
|
11
|
-
The ElasticSearch Query DSL
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
The ElasticSearch [Query DSL](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html)
|
13
|
+
has a tremendous amount of flexibility, allowing users to finely tune their search results.
|
14
|
+
However, elaborate queries often take the form of a complex, deeply nested hash,
|
15
|
+
which can become difficult to create or traverse. By wrapping the core components of the
|
16
|
+
query DSL into Ruby objects, Daedal addresses the following issues:
|
17
|
+
|
18
|
+
* Constructing a large nested hash can be a headache, and using tools like `Hashie` may result in performance issues
|
19
|
+
* Remembering all the optional parameters each query can take, where they reside within the query structure, and what values they can take can be challenging
|
20
|
+
* Improperly structured queries, or queries with bad parameters, are hard to catch before sending to the server (and receiving an error)
|
21
|
+
* Debugging invalid queries can be a grueling task
|
22
|
+
|
23
|
+
Daedal also makes it easy to define custom queries tailored to your specific use case - you can see
|
24
|
+
a simple example at the end of the documentation.
|
15
25
|
|
16
26
|
Installation
|
17
27
|
------------
|
18
28
|
|
29
|
+
From the terminal:
|
19
30
|
``` terminal
|
20
31
|
$ gem install daedal
|
21
32
|
```
|
22
33
|
|
23
|
-
or in your `Gemfile
|
34
|
+
or in your `Gemfile`:
|
24
35
|
|
25
36
|
``` ruby
|
26
37
|
gem 'daedal'
|
27
38
|
```
|
28
39
|
|
40
|
+
Then, it's as simple as including the line:
|
41
|
+
|
42
|
+
``` ruby
|
43
|
+
require 'daedal'
|
44
|
+
```
|
45
|
+
|
29
46
|
Usage
|
30
47
|
--------
|
31
48
|
|
49
|
+
See the [Daedal Wiki](https://github.com/cschuch/daedal/wiki) for some examples.
|
50
|
+
|
32
51
|
### ElasticSearch Query DSL
|
33
52
|
|
34
53
|
Other Ruby packages for ElasticSearch allow you to create queries either as
|
35
54
|
hashes or by constructing raw JSON:
|
36
55
|
|
37
56
|
``` ruby
|
38
|
-
|
57
|
+
author_query = {'match' => {'author' => {'query' => 'Beckett'}}}
|
39
58
|
```
|
40
59
|
|
41
|
-
For
|
42
|
-
|
60
|
+
For simple queries like the example above, this works just fine. However, as queries become
|
61
|
+
more complicated, the hash can quickly take on a life of its own. Inspired by ElasticSearch's
|
43
62
|
[Java API](http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/),
|
44
|
-
Daedal contains Ruby classes designed to make query construction more
|
63
|
+
Daedal contains Ruby classes designed to make query construction more manageable.
|
45
64
|
|
46
65
|
### Queries
|
47
66
|
|
48
|
-
Queries are contained within the `Queries` module. You can construct query components like:
|
67
|
+
Queries are contained within the `Daedal::Queries` module. You can construct query components like:
|
49
68
|
|
50
69
|
``` ruby
|
51
|
-
|
52
|
-
|
53
|
-
# creates the basic match query
|
54
|
-
match_query = Daedal::Queries::MatchQuery.new(field: 'foo', query: 'bar')
|
70
|
+
author_query = Daedal::Queries::MatchQuery.new(field: 'author', query: 'Beckett')
|
55
71
|
```
|
56
|
-
|
72
|
+
|
73
|
+
Each query has `#to_json` defined for easy conversion for use with any of the Ruby
|
57
74
|
ElasticSearch clients out there:
|
75
|
+
|
58
76
|
``` ruby
|
59
|
-
|
77
|
+
author_query.to_json # => "{\"match\":{\"author\":{\"query\":\"Beckett\"}}}"
|
60
78
|
```
|
61
79
|
|
62
|
-
|
80
|
+
The benefits of using Daedal become more obvious for aggregate queries such as the `bool query`:
|
81
|
+
|
82
|
+
``` ruby
|
83
|
+
bool_query = Daedal::Queries::BoolQuery.new(must: [author_query])
|
84
|
+
bool_query.to_json # => "{\"bool\":{\"should\":[],\"must\":[{\"match\":{\"author\":{\"query\":\"Beckett\"}}}],\"must_not\":[]}}"
|
85
|
+
|
86
|
+
lines_query = Daedal::Queries::MatchQuery.new(field: 'lines', query: "We're waiting for Godot")
|
87
|
+
bool_query.should << lines_query
|
88
|
+
|
89
|
+
bool_query.to_json # => "{\"bool\":{\"should\":[{\"match\":{\"lines\":{\"query\":\"We're waiting for Godot\"}}}],\"must\":[{\"match\":{\"author\":{\"query\":\"Beckett\"}}}],\"must_not\":[]}}"
|
90
|
+
```
|
91
|
+
|
92
|
+
Currently, the following queries have been implemented:
|
63
93
|
* [bool query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)
|
64
94
|
* [constant score query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-constant-score-query.html)
|
65
95
|
* [dis max query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-dis-max-query.html)
|
66
96
|
* [filtered query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html)
|
97
|
+
* [fuzzy query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html)
|
67
98
|
* [match all query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-match-all-query.html)
|
68
99
|
* [match query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-match-query.html)
|
69
100
|
* [multi match query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html)
|
70
101
|
* [nested query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html)
|
71
102
|
* [prefix query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html)
|
103
|
+
* [query string query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html)
|
72
104
|
|
73
|
-
|
105
|
+
On deck:
|
74
106
|
* [function score query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html)
|
75
|
-
* [fuzzy query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html)
|
76
|
-
* [query string query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html)
|
77
107
|
* [range query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)
|
78
108
|
* [regexp query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html)
|
79
109
|
* [term query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)
|
@@ -89,28 +119,26 @@ Queries I'm not planning on implementing at all, since they're deprecated:
|
|
89
119
|
|
90
120
|
### Filters
|
91
121
|
|
92
|
-
Filters are contained within the `Filters` module. You can construct filter components
|
122
|
+
Filters are contained within the `Daedal::Filters` module. You can construct filter components
|
93
123
|
in the same way as queries:
|
94
124
|
|
95
125
|
``` ruby
|
96
|
-
|
97
|
-
|
98
|
-
term_filter = Daedal::Filters::TermFilter.new(field: 'foo', term: 'bar')
|
126
|
+
term_filter = Daedal::Filters::TermFilter.new(field: 'characters', term: 'Pozzo')
|
99
127
|
|
100
|
-
term_filter.to_json # => "{\"term\":{\"
|
128
|
+
term_filter.to_json # => "{\"term\":{\"characters\":\"Pozzo\"}}"
|
101
129
|
```
|
102
130
|
|
103
|
-
|
131
|
+
Currently, the following filters have been implemented:
|
104
132
|
* [and filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-and-filter.html)
|
133
|
+
* [bool filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html)
|
105
134
|
* [geo distance filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-filter.html)
|
135
|
+
* [or filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-or-filter.html)
|
106
136
|
* [range filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-range-filter.html)
|
107
137
|
* [term filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-filter.html)
|
108
138
|
* [terms filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-filter.html)
|
109
139
|
|
110
|
-
|
111
|
-
* [bool filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html)
|
140
|
+
On deck:
|
112
141
|
* [nested filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html)
|
113
|
-
* [or filter](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-or-filter.html)
|
114
142
|
|
115
143
|
### Type checking and attribute coercion
|
116
144
|
|
@@ -125,54 +153,85 @@ constant_score_query = {'constant_score' => {'boost' => 'foo', 'query' => {'matc
|
|
125
153
|
would yield a server error, since the `boost` parameter must be a number.
|
126
154
|
|
127
155
|
Daedal uses [Virtus](https://github.com/solnic/virtus) to perform data-type coercions.
|
128
|
-
|
129
|
-
The previous
|
156
|
+
Invalid query parameters are surfaced at runtime, making debugging much easier.
|
157
|
+
The previous example in Daedal would raise an error:
|
130
158
|
|
131
159
|
``` ruby
|
132
|
-
match_all_query = Daedal::Queries::MatchAllQuery.new
|
133
|
-
constant_score_query = Daedal::Queries::ConstantScoreQuery.new(boost: 'foo', query: match_all_query)
|
160
|
+
match_all_query = Daedal::Queries::MatchAllQuery.new
|
134
161
|
|
162
|
+
constant_score_query = Daedal::Queries::ConstantScoreQuery.new(boost: 'foo', query: match_all_query)
|
135
163
|
# Virtus::CoercionError: Failed to coerce "foo" into Float
|
136
164
|
```
|
137
165
|
|
138
|
-
|
166
|
+
Similarly, trying to add non-queries to an aggregate query like the `bool` or `dis max` queries
|
167
|
+
will result in an error:
|
139
168
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
class will be available to you, as well.
|
169
|
+
``` ruby
|
170
|
+
dis_max_query = Daedal::Queries::DisMaxQuery.new
|
171
|
+
|
172
|
+
dis_max_query.queries << :foo
|
173
|
+
# Virtus::CoercionError: Failed to coerce :foo into "Daedal::Queries::Query"
|
174
|
+
```
|
147
175
|
|
148
|
-
|
176
|
+
### Creating custom queries
|
177
|
+
|
178
|
+
Currently, I've only made it through a fraction of the entire Query DSL, but will be adding more
|
179
|
+
as time goes by. If there's a component of the query DSL that you need that isn't implemented yet,
|
180
|
+
it's easy to define it yourself within your project (or, feel free to contribute to Daedal!).
|
181
|
+
|
182
|
+
Creating custom filters or queries tailored specifically to your use case is also pretty straightforward.
|
183
|
+
Here are some guidelines:
|
184
|
+
|
185
|
+
* Make your class inherit from `Daedal::Queries::Query` or `Daedal::Filters::Filter`
|
186
|
+
* Define the parameters for your query using [Virtus](https://github.com/solnic/virtus) attributes (**note**: `strict` coercion is being used)
|
187
|
+
* Define the `#to_hash` method
|
188
|
+
|
189
|
+
Example of a custom query:
|
149
190
|
``` ruby
|
150
|
-
class
|
191
|
+
class PlayQuery < Daedal::Queries::Query
|
151
192
|
|
152
|
-
# define the
|
153
|
-
|
154
|
-
attribute :
|
193
|
+
# define the parameters that you want in your query
|
194
|
+
# if the field is optional, make sure to set required to false
|
195
|
+
attribute :author, String
|
196
|
+
|
197
|
+
attribute :characters, Array[String], required: false
|
198
|
+
attribute :title, String, required: false
|
199
|
+
|
200
|
+
def construct_query
|
201
|
+
author_query = Daedal::Queries::MatchQuery.new(field: 'author', query: author)
|
202
|
+
title_query = Daedal::Queries::MatchQuery.new(field: 'title', query: title)
|
203
|
+
|
204
|
+
full_query = Daedal::Queries::BoolQuery.new(must: [author_query], should: [title_query])
|
205
|
+
characters.each do |character|
|
206
|
+
full_query.should << Daedal::Queries::MatchQuery.new(field: 'characters', query: character)
|
207
|
+
end
|
208
|
+
|
209
|
+
full_query
|
210
|
+
end
|
155
211
|
|
156
212
|
# define the to_hash method to convert for use in ElasticSearch
|
157
213
|
def to_hash
|
158
|
-
|
214
|
+
construct_query.to_hash
|
159
215
|
end
|
160
216
|
end
|
217
|
+
|
218
|
+
play_query = PlayQuery.new(author: 'Beckett', title: 'Waiting for Godot', characters: ['Estragon', 'Vladimir'])
|
219
|
+
puts play_query.to_json # => {"bool":{"should":[{"match":{"title":{"query":"Waiting for Godot"}}},{"match":{"characters":{"query":"Estragon"}}},{"match":{"characters":{"query":"Vladimir"}}}],"must":[{"match":{"author":{"query":"Beckett"}}}],"must_not":[]}}
|
161
220
|
```
|
162
221
|
|
163
222
|
Contributing
|
164
223
|
-------------
|
165
224
|
|
166
|
-
The ElasticSearch Query DSL is pretty
|
225
|
+
The ElasticSearch Query DSL is pretty big and includes a ton of nuance. I'm starting with the
|
167
226
|
most basic parts of the DSL (and the parts I use for work), so if you want to help out with the project
|
168
227
|
to meet your needs please feel free to contribute! I just ask that you:
|
169
228
|
|
170
|
-
* Fork the project
|
171
|
-
* Make your changes or additions
|
172
|
-
* Add tests! My goal is
|
173
|
-
* Send me a pull request
|
229
|
+
* Fork the project
|
230
|
+
* Make your changes or additions
|
231
|
+
* Add tests! My goal is to keep Daedal a thoroughly tested project
|
232
|
+
* Send me a pull request
|
174
233
|
|
175
|
-
Feedback or suggestions are also always welcome
|
234
|
+
Feedback or suggestions are also always welcome!
|
176
235
|
|
177
236
|
License
|
178
237
|
-------
|