estella 0.2.2 → 0.3.0

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.
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