estella 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bfebaabb0c030f132e17e046fcfea05c28d2fa9d
4
- data.tar.gz: 9dbe818723ccfa698c3ad7e6f2775aaef20ec26e
3
+ metadata.gz: d881bd248152b83758455a9116ea0c56e382d279
4
+ data.tar.gz: 31d2a0d826ab272ad92627ddd68b10b6ab74d07b
5
5
  SHA512:
6
- metadata.gz: 3ddf9ea6b35d7e9e3a7a9b2f35c908a3ff3d02b65410fd4a7fad89adbf376946c99930126c78e8a6884c67793cca77018d22b7a9e59742ad80600de576ef4ebd
7
- data.tar.gz: 5ff181eaed10c332c34fa21aafc78e415269515c5d0eaf7dfec77eecfe15079d6c0463ae9627f5253443b783abad53170c07be3fe8e888aaac70f71f05b76c34
6
+ metadata.gz: 8c60f3f41f1b4baae0fb677034f8edd524e5f14d40761da4f5484f51e9497ff304c6092e2c6d121c129c06462f48e6511ba35314380c21b6708a27fcdc4e6a88
7
+ data.tar.gz: 1389d0798d01f143d7a9640dc4eba8d367b2fe11e14329d1aa03b90127a2f697b69067c6bfaab946198e4f3a9fa1068100b1d5e2fd257496575a20d2e7f8246c
data/.rubocop_todo.yml CHANGED
@@ -1,21 +1,21 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2017-01-25 11:50:14 -0500 using RuboCop version 0.47.1.
3
+ # on 2017-01-27 12:52:56 -0500 using RuboCop version 0.47.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 2
9
+ # Offense count: 1
10
10
  Metrics/AbcSize:
11
- Max: 24
11
+ Max: 18
12
12
 
13
13
  # Offense count: 3
14
14
  # Configuration parameters: CountComments, ExcludedMethods.
15
15
  Metrics/BlockLength:
16
- Max: 117
16
+ Max: 134
17
17
 
18
- # Offense count: 28
18
+ # Offense count: 30
19
19
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
20
20
  # URISchemes: http, https
21
21
  Metrics/LineLength:
@@ -24,7 +24,7 @@ Metrics/LineLength:
24
24
  # Offense count: 1
25
25
  # Configuration parameters: CountComments.
26
26
  Metrics/MethodLength:
27
- Max: 14
27
+ Max: 13
28
28
 
29
29
  # Offense count: 3
30
30
  # Cop supports --auto-correct.
@@ -34,11 +34,6 @@ Performance/RedundantMerge:
34
34
  - 'lib/estella/parser.rb'
35
35
  - 'lib/estella/searchable.rb'
36
36
 
37
- # Offense count: 1
38
- Style/AccessorMethodName:
39
- Exclude:
40
- - 'lib/estella/helpers.rb'
41
-
42
37
  # Offense count: 1
43
38
  Style/ClassVars:
44
39
  Exclude:
@@ -55,11 +50,10 @@ Style/Documentation:
55
50
  - 'lib/estella/query.rb'
56
51
  - 'lib/estella/searchable.rb'
57
52
 
58
- # Offense count: 3
53
+ # Offense count: 1
59
54
  # Configuration parameters: MinBodyLength.
60
55
  Style/GuardClause:
61
56
  Exclude:
62
- - 'lib/estella/query.rb'
63
57
  - 'lib/estella/searchable.rb'
64
58
 
65
59
  # Offense count: 9
data/CHANGELOG.md CHANGED
@@ -1,10 +1,11 @@
1
1
  ## Changelog
2
2
 
3
- ### 0.2.2 (Next)
3
+ ### 0.3.0 (Next)
4
4
 
5
5
  * [#15](https://github.com/artsy/estella/pull/15): Removed undocumented `set_index_alias!` - [@dblock](https://github.com/dblock).
6
6
  * [#15](https://github.com/artsy/estella/pull/15): Added `delete_index!` and `create_index!` - [@dblock](https://github.com/dblock).
7
7
  * [#14](https://github.com/artsy/estella/pull/14): Fix: destroying documents fails to remove them from the index - [@dblock](https://github.com/dblock).
8
+ * [#17](https://github.com/artsy/estella/pull/17): Added `exclude` to `estella_search` - [@dblock](https://github.com/dblock).
8
9
  * [#13](https://github.com/artsy/estella/pull/13): Added code coverage w/ Coveralls - [@dblock](https://github.com/dblock).
9
10
  * Your contribution here.
10
11
 
data/README.md CHANGED
@@ -27,18 +27,17 @@ Just include the `Estella::Searchable` module and add a `searchable` block in yo
27
27
 
28
28
  ```ruby
29
29
  class Artist < ActiveRecord::Base
30
- include Estella::Searchable
31
-
32
- searchable do
33
- field :name, type: :string, analysis: Estella::Analysis::FULLTEXT_ANALYSIS, factor: 1.0
34
- field :keywords, type: :string, analysis: ['snowball', 'shingle'], factor: 0.5
35
- field :bio, using: :biography, type: :string, index: :not_analyzed
36
- field :birth_date, type: :date
37
- field :follows, type: :integer
38
- field :published, type: :boolean, filter: true
39
- boost :follows, modifier: 'log1p', factor: 1E-3
40
- end
41
- ...
30
+ include Estella::Searchable
31
+
32
+ searchable do
33
+ field :name, type: :string, analysis: Estella::Analysis::FULLTEXT_ANALYSIS, factor: 1.0
34
+ field :keywords, type: :string, analysis: ['snowball', 'shingle'], factor: 0.5
35
+ field :bio, using: :biography, type: :string, index: :not_analyzed
36
+ field :birth_date, type: :date
37
+ field :follows, type: :integer
38
+ field :published, type: :boolean, filter: true
39
+ boost :follows, modifier: 'log1p', factor: 1E-3
40
+ end
42
41
  end
43
42
  ```
44
43
 
@@ -173,7 +172,13 @@ Artist.estella_search(term: 'frank', published: true)
173
172
  Artist.estella_search(term: 'frank', size: 10, from: 5)
174
173
  ```
175
174
 
176
- If you'd like to customize your query further, you can extend `Estella::Query` and override the `query_definition`:
175
+ You can exclude records.
176
+
177
+ ```ruby
178
+ Artist.estella_search(term: 'frank', exclude: { keywords: 'sinatra' })
179
+ ```
180
+
181
+ If you'd like to customize your query further, you can extend `Estella::Query` and override `query_definition` and `field_factors`:
177
182
 
178
183
  ```ruby
179
184
  class MyQuery < Estella::Query
@@ -184,6 +189,30 @@ class MyQuery < Estella::Query
184
189
  }
185
190
  }
186
191
  end
192
+
193
+ def field_factors
194
+ {
195
+ default: 5,
196
+ ngram: 5,
197
+ snowball: 2,
198
+ shingle: 1,
199
+ search: 1
200
+ }
201
+ end
202
+ end
203
+ ```
204
+
205
+ Or manipulate the query in the initializer directly via `query` or using built-in helpers `must` and `exclude`.
206
+
207
+ ```ruby
208
+ class MyQuery < Estella::Query
209
+ def initialize(params)
210
+ super
211
+ # same as query[:filter][:bool][:must] = { keywords: 'frank' }
212
+ must term: { keywords: 'frank' }
213
+ # same as query[:filter][:bool][:must_not] = { keywords: 'sinatra' }
214
+ exclude term: { keywords: 'sinatra' }
215
+ end
187
216
  end
188
217
  ```
189
218
 
data/lib/estella/query.rb CHANGED
@@ -16,17 +16,10 @@ module Estella
16
16
  }
17
17
  add_query
18
18
  add_filters
19
+ add_excludes
19
20
  add_pagination
20
- add_aggregations if params[:aggregations]
21
- add_sort
22
21
  end
23
22
 
24
- # override if needed
25
- def add_aggregations; end
26
-
27
- # override if needed
28
- def add_sort; end
29
-
30
23
  def must(filter)
31
24
  query[:filter][:bool][:must] << filter
32
25
  end
@@ -35,6 +28,22 @@ module Estella
35
28
  query[:filter][:bool][:must_not] << filter
36
29
  end
37
30
 
31
+ def query_definition
32
+ {
33
+ multi_match: {
34
+ type: 'most_fields',
35
+ fields: term_search_fields,
36
+ query: params[:term]
37
+ }
38
+ }
39
+ end
40
+
41
+ def field_factors
42
+ Estella::Analysis::DEFAULT_FIELD_FACTORS
43
+ end
44
+
45
+ private
46
+
38
47
  def add_pagination
39
48
  query[:size] = params[:size] if params[:size]
40
49
  query[:from] = params[:from] if params[:from]
@@ -59,32 +68,19 @@ module Estella
59
68
  add_field_boost
60
69
  end
61
70
 
62
- def query_definition
63
- {
64
- multi_match: {
65
- type: 'most_fields',
66
- fields: term_search_fields,
67
- query: params[:term]
68
- }
69
- }
70
- end
71
-
72
71
  def add_field_boost
73
- if params[:boost]
74
- query[:query][:function_score][:field_value_factor] = {
75
- field: params[:boost][:field],
76
- modifier: params[:boost][:modifier],
77
- factor: params[:boost][:factor]
78
- }
72
+ boost = params[:boost]
73
+ return unless boost
79
74
 
80
- if params[:boost][:max]
81
- query[:query][:function_score][:max_boost] = params[:boost][:max]
82
- end
83
- end
84
- end
75
+ query[:query][:function_score][:field_value_factor] = {
76
+ field: boost[:field],
77
+ modifier: boost[:modifier],
78
+ factor: boost[:factor]
79
+ }
85
80
 
86
- def field_factors
87
- Estella::Analysis::DEFAULT_FIELD_FACTORS
81
+ max = boost[:max]
82
+ return unless max
83
+ query[:query][:function_score][:max_boost] = max
88
84
  end
89
85
 
90
86
  # search all analysed string fields by default
@@ -103,10 +99,19 @@ module Estella
103
99
  end
104
100
 
105
101
  def add_filters
106
- if params[:indexed_fields]
107
- params[:indexed_fields].each do |field, opts|
108
- must term: { field => params[field] } if opts[:filter] && params[field]
109
- end
102
+ indexed_fields = params[:indexed_fields]
103
+ return unless indexed_fields
104
+ indexed_fields.each do |field, opts|
105
+ next unless opts[:filter] && params[field]
106
+ must term: { field => params[field] }
107
+ end
108
+ end
109
+
110
+ def add_excludes
111
+ exclude = params[:exclude]
112
+ return unless exclude
113
+ exclude.each do |k, v|
114
+ exclude(term: { k => v })
110
115
  end
111
116
  end
112
117
  end
@@ -1,3 +1,3 @@
1
1
  module Estella
2
- VERSION = '0.2.2'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -55,6 +55,9 @@ describe Estella::Searchable, type: :model do
55
55
  it 'searches all text fields by default' do
56
56
  expect(SearchableModel.estella_search(term: 'jez')).to eq([@jez])
57
57
  end
58
+ it 'can exclude an instance' do
59
+ expect(SearchableModel.estella_search(term: 'jez tez fab', exclude: { keywords: 'jez' })).to eq([@fab, @tez])
60
+ end
58
61
  it 'boosts on follows_count' do
59
62
  popular_jeremy = SearchableModel.create(title: 'jeremy corban', follows_count: 20_000)
60
63
  SearchableModel.refresh_index!
@@ -105,6 +108,22 @@ describe Estella::Searchable, type: :model do
105
108
  expect(SearchableModel.estella_search(term: 'david')).to eq([@fab])
106
109
  end
107
110
  end
111
+ context 'with query customization' do
112
+ before do
113
+ class CustomQuery < Estella::Query
114
+ def initialize(params)
115
+ super
116
+ exclude term: { keywords: 'jez' }
117
+ end
118
+ end
119
+
120
+ allow(SearchableModel).to receive(:estella_search_query).and_return(CustomQuery)
121
+ end
122
+
123
+ it 'uses the custom query' do
124
+ expect(SearchableModel.estella_search(term: 'jez tez fab')).to eq([@fab, @tez])
125
+ end
126
+ end
108
127
  end
109
128
 
110
129
  describe 'configuration errors' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: estella
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anil Bawa-Cavia