estella 0.2.1 → 0.2.2
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 +4 -4
- data/.coveralls.yml +2 -0
- data/.gitignore +2 -0
- data/.rubocop_todo.yml +5 -5
- data/CHANGELOG.md +8 -0
- data/Gemfile +4 -0
- data/README.md +23 -0
- data/lib/estella/helpers.rb +15 -9
- data/lib/estella/query.rb +0 -12
- data/lib/estella/searchable.rb +1 -1
- data/lib/estella/version.rb +1 -1
- data/spec/searchable_spec.rb +26 -3
- data/spec/spec_helper.rb +3 -8
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfebaabb0c030f132e17e046fcfea05c28d2fa9d
|
4
|
+
data.tar.gz: 9dbe818723ccfa698c3ad7e6f2775aaef20ec26e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ddf9ea6b35d7e9e3a7a9b2f35c908a3ff3d02b65410fd4a7fad89adbf376946c99930126c78e8a6884c67793cca77018d22b7a9e59742ad80600de576ef4ebd
|
7
|
+
data.tar.gz: 5ff181eaed10c332c34fa21aafc78e415269515c5d0eaf7dfec77eecfe15079d6c0463ae9627f5253443b783abad53170c07be3fe8e888aaac70f71f05b76c34
|
data/.coveralls.yml
ADDED
data/.gitignore
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-01-
|
3
|
+
# on 2017-01-25 11:50:14 -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:
|
9
|
+
# Offense count: 2
|
10
10
|
Metrics/AbcSize:
|
11
11
|
Max: 24
|
12
12
|
|
13
13
|
# Offense count: 3
|
14
14
|
# Configuration parameters: CountComments, ExcludedMethods.
|
15
15
|
Metrics/BlockLength:
|
16
|
-
Max:
|
16
|
+
Max: 117
|
17
17
|
|
18
|
-
# Offense count:
|
18
|
+
# Offense count: 28
|
19
19
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
20
20
|
# URISchemes: http, https
|
21
21
|
Metrics/LineLength:
|
22
|
-
Max:
|
22
|
+
Max: 135
|
23
23
|
|
24
24
|
# Offense count: 1
|
25
25
|
# Configuration parameters: CountComments.
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### 0.2.2 (Next)
|
4
|
+
|
5
|
+
* [#15](https://github.com/artsy/estella/pull/15): Removed undocumented `set_index_alias!` - [@dblock](https://github.com/dblock).
|
6
|
+
* [#15](https://github.com/artsy/estella/pull/15): Added `delete_index!` and `create_index!` - [@dblock](https://github.com/dblock).
|
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
|
+
* [#13](https://github.com/artsy/estella/pull/13): Added code coverage w/ Coveralls - [@dblock](https://github.com/dblock).
|
9
|
+
* Your contribution here.
|
10
|
+
|
3
11
|
### 0.2.1 (1/24/2017)
|
4
12
|
|
5
13
|
* Initial public release as the `estella` gem - [@cavia](https://github.com/cavvia), [@mzikherman](https://github.com/mzikherman).
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
[](https://badge.fury.io/rb/estella)
|
4
4
|
[](https://travis-ci.org/artsy/estella)
|
5
5
|
[](https://git.legal/projects/3493)
|
6
|
+
[](https://coveralls.io/github/artsy/estella?branch=master)
|
6
7
|
|
7
8
|
Builds on [elasticsearch-model](https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-model) to make your Ruby objects searchable with Elasticsearch. Provides fine-grained control of fields, analysis, filters, weightings and boosts.
|
8
9
|
|
@@ -87,6 +88,28 @@ class Artist < ActiveRecord::Base
|
|
87
88
|
end
|
88
89
|
```
|
89
90
|
|
91
|
+
A number of class methods are available for indexing.
|
92
|
+
|
93
|
+
```
|
94
|
+
# returns true if the index exists
|
95
|
+
Artist.index_exists?
|
96
|
+
|
97
|
+
# creates the index
|
98
|
+
Artist.create_index!
|
99
|
+
|
100
|
+
# delete and re-create the index without reindexing data
|
101
|
+
Artist.reload_index!
|
102
|
+
|
103
|
+
# recreate the index and reindex all data
|
104
|
+
Artist.recreate_index!
|
105
|
+
|
106
|
+
# deletes the index
|
107
|
+
Artist.delete_index!
|
108
|
+
|
109
|
+
# commit any outstanding writes
|
110
|
+
Artist.refresh_index!
|
111
|
+
```
|
112
|
+
|
90
113
|
## Custom Analysis
|
91
114
|
|
92
115
|
Estella defines `standard`, `snowball`, `ngram` and `shingle` analysers by default. These cover most search contexts, including auto-suggest. In order to enable full-text search for a field, use:
|
data/lib/estella/helpers.rb
CHANGED
@@ -28,7 +28,7 @@ module Estella
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def es_delete
|
31
|
-
es_delete_document
|
31
|
+
self.class.es_delete_document(id)
|
32
32
|
end
|
33
33
|
|
34
34
|
def es_transform
|
@@ -38,13 +38,13 @@ module Estella
|
|
38
38
|
module ClassMethods
|
39
39
|
## Searching
|
40
40
|
|
41
|
-
def
|
41
|
+
def estella_raw_search(params = {})
|
42
42
|
__elasticsearch__.search(estella_query(params))
|
43
43
|
end
|
44
44
|
|
45
45
|
# @return an array of database records mapped using an adapter
|
46
46
|
def estella_search(params = {})
|
47
|
-
rsp =
|
47
|
+
rsp = estella_raw_search(params)
|
48
48
|
params[:raw] ? rsp.response : rsp.records.to_a
|
49
49
|
end
|
50
50
|
|
@@ -60,18 +60,28 @@ module Estella
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def bulk_index(batch_of_ids)
|
63
|
+
create_index! unless index_exists?
|
63
64
|
__elasticsearch__.client.bulk index: index_name, type: model_name.element, body: batch_to_bulk(batch_of_ids)
|
64
65
|
end
|
65
66
|
|
67
|
+
# @return true if the index exists
|
66
68
|
def index_exists?
|
67
69
|
__elasticsearch__.client.indices.exists index: index_name
|
68
70
|
end
|
69
71
|
|
70
|
-
def
|
71
|
-
__elasticsearch__.client.indices.delete index: index_name
|
72
|
+
def delete_index!
|
73
|
+
__elasticsearch__.client.indices.delete index: index_name
|
74
|
+
end
|
75
|
+
|
76
|
+
def create_index!
|
72
77
|
__elasticsearch__.client.indices.create index: index_name, body: { settings: settings.to_hash, mappings: mappings.to_hash }
|
73
78
|
end
|
74
79
|
|
80
|
+
def reload_index!
|
81
|
+
delete_index! if index_exists?
|
82
|
+
create_index!
|
83
|
+
end
|
84
|
+
|
75
85
|
def recreate_index!
|
76
86
|
reload_index!
|
77
87
|
import
|
@@ -82,10 +92,6 @@ module Estella
|
|
82
92
|
__elasticsearch__.refresh_index!
|
83
93
|
end
|
84
94
|
|
85
|
-
def set_index_alias!(name)
|
86
|
-
__elasticsearch__.client.indices.put_alias index: index_name, name: name
|
87
|
-
end
|
88
|
-
|
89
95
|
def es_delete_document(id)
|
90
96
|
__elasticsearch__.client.delete type: document_type, id: id, index: index_name
|
91
97
|
end
|
data/lib/estella/query.rb
CHANGED
@@ -109,17 +109,5 @@ module Estella
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
112
|
-
|
113
|
-
def bool_filter(field, param)
|
114
|
-
if param
|
115
|
-
{ term: { field => true } }
|
116
|
-
elsif !param.nil?
|
117
|
-
{ term: { field => false } }
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def add_bool_filter(field, param)
|
122
|
-
must bool_filter(field, param) if bool_filter(field, param)
|
123
|
-
end
|
124
112
|
end
|
125
113
|
end
|
data/lib/estella/searchable.rb
CHANGED
data/lib/estella/version.rb
CHANGED
data/spec/searchable_spec.rb
CHANGED
@@ -40,10 +40,11 @@ describe Estella::Searchable, type: :model do
|
|
40
40
|
SearchableModel.reload_index!
|
41
41
|
@jez = SearchableModel.create(title: 'jeremy corbyn', keywords: ['jez'])
|
42
42
|
@tez = SearchableModel.create(title: 'theresa may', keywords: ['tez'])
|
43
|
+
@fab = SearchableModel.create(title: 'david faber', keywords: ['fab'])
|
43
44
|
SearchableModel.refresh_index!
|
44
45
|
end
|
45
46
|
it 'returns relevant results' do
|
46
|
-
expect(SearchableModel.all.size).to eq(
|
47
|
+
expect(SearchableModel.all.size).to eq(3)
|
47
48
|
expect(SearchableModel.estella_search(term: 'jeremy')).to eq([@jez])
|
48
49
|
expect(SearchableModel.estella_search(term: 'theresa')).to eq([@tez])
|
49
50
|
end
|
@@ -74,14 +75,36 @@ describe Estella::Searchable, type: :model do
|
|
74
75
|
expect(SearchableModel.mappings.to_hash[:searchable_model][:properties].keys.include?(:slug)).to eq true
|
75
76
|
end
|
76
77
|
it 'supports boolean filters' do
|
77
|
-
|
78
|
+
liapunov = SearchableModel.create(title: 'liapunov', published: true)
|
78
79
|
SearchableModel.create(title: 'liapunov unpublished')
|
79
80
|
SearchableModel.refresh_index!
|
80
|
-
expect(SearchableModel.estella_search(published: true)).to eq [
|
81
|
+
expect(SearchableModel.estella_search(published: true)).to eq [liapunov]
|
81
82
|
end
|
82
83
|
it 'does not override field method on class' do
|
83
84
|
expect(SearchableModel.methods.include?(:field)).to eq(false)
|
84
85
|
end
|
86
|
+
it 'removes a document from the index after deletion' do
|
87
|
+
@jez.destroy
|
88
|
+
expect(SearchableModel.estella_search(term: 'jeremy')).to eq([])
|
89
|
+
expect(SearchableModel.estella_search(term: 'theresa')).to eq([@tez])
|
90
|
+
end
|
91
|
+
context 'with a deleted index' do
|
92
|
+
before do
|
93
|
+
SearchableModel.delete_index!
|
94
|
+
end
|
95
|
+
it 'recreates an index' do
|
96
|
+
expect { SearchableModel.estella_search(term: 'theresa') }.to raise_error Elasticsearch::Transport::Transport::Errors::NotFound
|
97
|
+
SearchableModel.recreate_index!
|
98
|
+
expect(SearchableModel.estella_search(term: 'theresa')).to eq([@tez])
|
99
|
+
end
|
100
|
+
it 'indexes a bulk set of documents' do
|
101
|
+
SearchableModel.bulk_index([@fab.id, @tez.id])
|
102
|
+
SearchableModel.refresh_index!
|
103
|
+
expect(SearchableModel.estella_search(term: 'jeremy')).to eq([]) # not indexes
|
104
|
+
expect(SearchableModel.estella_search(term: 'theresa')).to eq([@tez])
|
105
|
+
expect(SearchableModel.estella_search(term: 'david')).to eq([@fab])
|
106
|
+
end
|
107
|
+
end
|
85
108
|
end
|
86
109
|
|
87
110
|
describe 'configuration errors' do
|
data/spec/spec_helper.rb
CHANGED
@@ -2,17 +2,12 @@ require 'active_support'
|
|
2
2
|
require 'active_model'
|
3
3
|
require 'rspec'
|
4
4
|
|
5
|
+
require 'coveralls'
|
6
|
+
Coveralls.wear!
|
7
|
+
|
5
8
|
require File.expand_path('../../lib/estella.rb', __FILE__)
|
6
9
|
|
7
10
|
RSpec.configure do |config|
|
8
|
-
config.mock_with :rspec do |c|
|
9
|
-
c.syntax = :expect
|
10
|
-
end
|
11
|
-
|
12
|
-
config.expect_with :rspec do |c|
|
13
|
-
c.syntax = :expect
|
14
|
-
end
|
15
|
-
|
16
11
|
config.raise_errors_for_deprecations!
|
17
12
|
|
18
13
|
config.before(:context, elasticsearch: true) 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.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anil Bawa-Cavia
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-01-
|
12
|
+
date: 2017-01-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: elasticsearch-model
|
@@ -144,6 +144,7 @@ executables: []
|
|
144
144
|
extensions: []
|
145
145
|
extra_rdoc_files: []
|
146
146
|
files:
|
147
|
+
- ".coveralls.yml"
|
147
148
|
- ".gitignore"
|
148
149
|
- ".rspec"
|
149
150
|
- ".rubocop.yml"
|
@@ -185,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
186
|
version: '0'
|
186
187
|
requirements: []
|
187
188
|
rubyforge_project:
|
188
|
-
rubygems_version: 2.4.
|
189
|
+
rubygems_version: 2.4.6
|
189
190
|
signing_key:
|
190
191
|
specification_version: 4
|
191
192
|
summary: Make your Ruby objects searchable with Elasticsearch.
|