elastic-rails 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +83 -28
- data/lib/elastic/configuration.rb +3 -2
- data/lib/elastic/core/connector.rb +8 -0
- data/lib/elastic/railties/rspec.rb +8 -3
- data/lib/elastic/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a12b5aa58fd03c89b2da12c996b19994bb3a3c1a
|
4
|
+
data.tar.gz: d1e4d3dee93fd0d9fd92c700b4367b415225a142
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf802900bc06db2cf8c4457c2839580d255c61fbefe4a616e8323699708ee20231be44220eb5149996501b88d5d0675cbecfccae050f8293e68821a0c5258b60
|
7
|
+
data.tar.gz: 3879b379633548e1d7d7d18b1500dd5e8e73feaf31858c892e056a1c38a03aaabcb150c37bba2534df28795f03044d2a987086040228c5f9890369ccb9f96607
|
data/README.md
CHANGED
@@ -1,8 +1,15 @@
|
|
1
|
-
# Elastic
|
1
|
+
# Elastic Rails
|
2
2
|
|
3
|
-
|
3
|
+
Elasticsearch + Ruby on Rails made easy.
|
4
4
|
|
5
|
-
|
5
|
+
## Features
|
6
|
+
|
7
|
+
* Easy setup
|
8
|
+
* Chainable query DSL
|
9
|
+
* Easy to use results
|
10
|
+
* Seamless rails integration
|
11
|
+
* Multiple enviroment support
|
12
|
+
* Zero downtime index migrations
|
6
13
|
|
7
14
|
## Installation
|
8
15
|
|
@@ -20,25 +27,45 @@ Or install it yourself as:
|
|
20
27
|
|
21
28
|
$ gem install elastic-rails
|
22
29
|
|
23
|
-
Finally execute the initialization script:
|
30
|
+
Finally execute the initialization script to generate configuration files:
|
24
31
|
|
25
32
|
$ rails g es:init
|
26
33
|
|
27
|
-
## Usage
|
34
|
+
## Usage overview
|
35
|
+
|
36
|
+
[For detailed usage reference check out the GUIDE]
|
28
37
|
|
29
|
-
|
38
|
+
Suppose that you already have a model called `Bike`, start by creating an index for it:
|
30
39
|
|
31
40
|
rails g es:index Bike
|
32
41
|
|
33
|
-
This will generate a new index definition file in `app/indices`
|
42
|
+
This will generate a new index definition file in `app/indices/bike_index.rb`
|
34
43
|
|
35
|
-
Add some fields to the index
|
44
|
+
Add some fields to the index:
|
36
45
|
|
37
|
-
|
46
|
+
```ruby
|
47
|
+
class BikeIndex < ElasticType
|
48
|
+
# field types are extracted from the target model
|
49
|
+
fields :brand_id, :model, :year, :price
|
50
|
+
|
51
|
+
# you can also explicitly set the field type
|
52
|
+
field :category, type: :term
|
53
|
+
field :description, type: :string
|
54
|
+
field :created_at, type: :time
|
55
|
+
|
56
|
+
# you can also have nested documents, the following will require a nested PartIndex to be defined.
|
57
|
+
nested :parts
|
58
|
+
|
59
|
+
# you can override fields or create new ones
|
60
|
+
def year
|
61
|
+
object.batch.year
|
62
|
+
end
|
63
|
+
end
|
64
|
+
```
|
38
65
|
|
39
66
|
Every time you create or change and index you will neeed to synchronize the Elasticsearch index mappings:
|
40
67
|
|
41
|
-
rake es:
|
68
|
+
rake es:remap
|
42
69
|
|
43
70
|
If you already have some data that needs to be indexed then run the reindex task:
|
44
71
|
|
@@ -52,35 +79,63 @@ some_bike.index_later # this will queue a reindexing job on the record
|
|
52
79
|
BikeIndex.import([bike_1, bike_2, bike_3]) # this will perform a bulk insertion
|
53
80
|
```
|
54
81
|
|
55
|
-
|
82
|
+
You can also setup automatic indexation/unindexation for a given model:
|
56
83
|
|
57
84
|
```ruby
|
58
|
-
|
59
|
-
|
60
|
-
|
85
|
+
class Bike < ActiveRecord::Base
|
86
|
+
index on: :save
|
87
|
+
end
|
61
88
|
```
|
62
89
|
|
63
|
-
|
64
|
-
|
65
|
-
reindex: attempts to rotate if index already exist
|
66
|
-
|
67
|
-
TODO: Write usage instructions here
|
68
|
-
|
69
|
-
## Missing Features
|
70
|
-
|
71
|
-
These are some features that will be added in the future:
|
90
|
+
After some data has been added you can start quering:
|
72
91
|
|
92
|
+
```ruby
|
93
|
+
# List bikes of brand Trek or Cannondale, preferably 2015 or later models:
|
94
|
+
BikeIndex
|
95
|
+
.must(brand: ['Trek', 'Cannondale'])
|
96
|
+
.should(year: { gte: 2015 })
|
97
|
+
.to_a
|
98
|
+
|
99
|
+
# List bikes of brand Trek, preferably 2015 or 2016, give higher score to 2016 models:
|
100
|
+
BikeIndex
|
101
|
+
.must(brand: ['Trek', 'Cannondale'])
|
102
|
+
.should(year: 2015)
|
103
|
+
.boost(2.0) { should(year: 2016) }
|
104
|
+
.to_a
|
105
|
+
|
106
|
+
# More score manipulation:
|
107
|
+
BikeIndex
|
108
|
+
.coord_similarity(false) # disable coord similarity (no score normalization)
|
109
|
+
.boost(0.0) { must(brand: ['Trek', 'Cannondale']) } # no score
|
110
|
+
.boost(fixed: 1.0) { should(year: 2015) } # fixed score
|
111
|
+
.boost(fixed: 2.0) { should(year: 2016) }
|
112
|
+
.each_with_score { |bike, score| puts "#{bike.name} got score: #{score}" }
|
113
|
+
|
114
|
+
# Get average bike price by year and category, for bikes newer than 2014
|
115
|
+
BikeIndex
|
116
|
+
.must(year: { gte: 2014 })
|
117
|
+
.segment(:year)
|
118
|
+
.segment(:category)
|
119
|
+
.average(:price)
|
120
|
+
.each { |keys, price| puts "#{keys[:year]}/#{keys[:category]} => #{price}" }
|
121
|
+
|
122
|
+
# Search bikes ids that have shimano parts:
|
123
|
+
BikeIndex.must(parts: { brand: 'shimano' }).ids
|
124
|
+
```
|
73
125
|
|
74
|
-
##
|
126
|
+
## Missing features
|
75
127
|
|
76
|
-
|
128
|
+
The following are some features that we plan to implement in the future:
|
77
129
|
|
78
|
-
|
130
|
+
* Highlighting support
|
131
|
+
* Suggesters support
|
132
|
+
* Geo fields and queries support
|
133
|
+
* Custom analizers support
|
134
|
+
* More queries types support (multi-match, common-terms, wildcard, fuzzy, etc)
|
79
135
|
|
80
136
|
## Contributing
|
81
137
|
|
82
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
83
|
-
|
138
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/platanus/elastic-rails. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
84
139
|
|
85
140
|
## License
|
86
141
|
|
@@ -9,11 +9,12 @@ module Elastic
|
|
9
9
|
whiny_indices: false,
|
10
10
|
api_client: nil, # set by method
|
11
11
|
logger: nil, # set by method
|
12
|
-
time_zone: nil # set by method
|
12
|
+
time_zone: nil, # set by method
|
13
|
+
disable_indexing: false
|
13
14
|
}
|
14
15
|
|
15
16
|
attr_accessor :host, :port, :api_client, :index, :page_size, :coord_similarity, :logger,
|
16
|
-
:import_batch_size, :whiny_indices, :time_zone
|
17
|
+
:import_batch_size, :whiny_indices, :time_zone, :disable_indexing
|
17
18
|
|
18
19
|
def initialize
|
19
20
|
assign_attributes DEFAULTS
|
@@ -12,6 +12,8 @@ module Elastic::Core
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def status
|
15
|
+
return :ready if Elastic.config.disable_indexing
|
16
|
+
|
15
17
|
actual_name = resolve_actual_index_name
|
16
18
|
return :not_available if actual_name.nil?
|
17
19
|
return :not_synchronized unless mapping_synchronized? actual_name
|
@@ -49,6 +51,8 @@ module Elastic::Core
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def index(_document)
|
54
|
+
return if Elastic.config.disable_indexing
|
55
|
+
|
52
56
|
# TODO: validate document type
|
53
57
|
operations = write_indices.map do |write_index|
|
54
58
|
{ 'index' => _document.merge('_index' => write_index) }
|
@@ -58,6 +62,8 @@ module Elastic::Core
|
|
58
62
|
end
|
59
63
|
|
60
64
|
def bulk_index(_documents)
|
65
|
+
return if Elastic.config.disable_indexing
|
66
|
+
|
61
67
|
# TODO: validate documents type
|
62
68
|
body = _documents.map { |doc| { 'index' => doc } }
|
63
69
|
|
@@ -72,6 +78,8 @@ module Elastic::Core
|
|
72
78
|
raise ArgumentError, 'document must provide an id' unless _document['_id']
|
73
79
|
raise ArgumentError, 'document must provide a type' unless _document['_type']
|
74
80
|
|
81
|
+
return if Elastic.config.disable_indexing
|
82
|
+
|
75
83
|
write_index, rolling_index = write_indices
|
76
84
|
|
77
85
|
operations = [{ 'delete' => _document.merge('_index' => write_index) }]
|
@@ -1,6 +1,11 @@
|
|
1
1
|
RSpec.configure do |config|
|
2
|
-
config.before(:example
|
3
|
-
|
4
|
-
|
2
|
+
config.before(:example) do |example|
|
3
|
+
if example.metadata[:elasticsearch]
|
4
|
+
Elastic.drop
|
5
|
+
Elastic.migrate
|
6
|
+
Elastic.config.disable_indexing = false
|
7
|
+
else
|
8
|
+
Elastic.config.disable_indexing = true
|
9
|
+
end
|
5
10
|
end
|
6
11
|
end
|
data/lib/elastic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastic-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ignacio Baixas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: elasticsearch
|