zelastic 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +8 -7
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +41 -9
- data/README.md +6 -3
- data/lib/zelastic/config.rb +13 -12
- data/lib/zelastic/index_manager.rb +4 -11
- data/lib/zelastic/indexer.rb +9 -22
- data/lib/zelastic/version.rb +1 -1
- data/log/.keep +0 -0
- data/zelastic.gemspec +3 -2
- metadata +26 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b45ad7dd15f213cc571c3da4f021ff80129dcccb375ae98aedde7b22b759b05
|
4
|
+
data.tar.gz: '08328c62f6485a0b11300dc9c651ca3e8c99179c84ea2c3f5235a921ca676d9a'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3e38047bf9f47bc8e7353f8e52387a7bd6722e291f96291d09a50257cd28a43cf7fba2abcd9681abb3797aa5acce67f38b09cabb6ecbaf8e4638b2a7e6e21b6
|
7
|
+
data.tar.gz: 94572581d7fa5f6c6de6485cacd9232a310418379f981d12d0523183f6922f5bcbbeb290605e4452ccb51603f702aa5bf52a9540ed681002a1b2e389a2dff670
|
data/.circleci/config.yml
CHANGED
@@ -14,6 +14,7 @@ jobs:
|
|
14
14
|
- image: "elasticsearch:<< parameters.elasticsearch_version >>"
|
15
15
|
environment:
|
16
16
|
"discovery.type": single-node
|
17
|
+
"xpack.security.enabled": false
|
17
18
|
environment:
|
18
19
|
ELASTICSEARCH_GEM_VERSION: "<< parameters.elasticsearch_gem_version >>"
|
19
20
|
steps:
|
@@ -28,20 +29,20 @@ workflows:
|
|
28
29
|
test:
|
29
30
|
jobs:
|
30
31
|
- test:
|
31
|
-
name: "test with elasticsearch
|
32
|
+
name: "test with elasticsearch v8
|
32
33
|
and gem << matrix.elasticsearch_gem_version >>
|
33
34
|
and ruby v<< matrix.ruby_version >>"
|
34
|
-
elasticsearch_version: "
|
35
|
+
elasticsearch_version: "8.3.3"
|
35
36
|
matrix:
|
36
37
|
parameters:
|
37
38
|
ruby_version: ["3.1", "2.7"]
|
38
|
-
elasticsearch_gem_version: ["~>
|
39
|
+
elasticsearch_gem_version: ["~> 8", "~> 7"]
|
39
40
|
- test:
|
40
|
-
name: "test with elasticsearch
|
41
|
-
and gem
|
41
|
+
name: "test with elasticsearch v7
|
42
|
+
and gem << matrix.elasticsearch_gem_version >>
|
42
43
|
and ruby v<< matrix.ruby_version >>"
|
43
|
-
elasticsearch_version: "5
|
44
|
-
elasticsearch_gem_version: "~> 5"
|
44
|
+
elasticsearch_version: "7.17.5"
|
45
45
|
matrix:
|
46
46
|
parameters:
|
47
47
|
ruby_version: ["3.1", "2.7"]
|
48
|
+
elasticsearch_gem_version: ["~> 7"]
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,47 @@
|
|
1
|
-
|
2
|
-
---
|
1
|
+
# Changelog
|
3
2
|
|
4
|
-
|
3
|
+
All notable changes to this project will be documented in this file.
|
5
4
|
|
6
|
-
|
7
|
-
|
5
|
+
The format is based on [Keep a Changelog],
|
6
|
+
and this project adheres to [Semantic Versioning].
|
8
7
|
|
9
|
-
|
8
|
+
[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
|
9
|
+
[Semantic Versioning]: https://semver.org/spec/v2.0.0.html
|
10
10
|
|
11
|
+
## How do I make a good changelog?
|
11
12
|
|
12
|
-
|
13
|
-
---
|
13
|
+
### Guiding Principles
|
14
14
|
|
15
|
-
-
|
15
|
+
- Changelogs are for humans, not machines.
|
16
|
+
- There should be an entry for every single version.
|
17
|
+
- The same types of changes should be grouped.
|
18
|
+
- Versions and sections should be linkable.
|
19
|
+
- The latest version comes first.
|
20
|
+
- The release date of each version is displayed.
|
21
|
+
- Keep an `Unreleased` section at the top to track upcoming changes.
|
22
|
+
|
23
|
+
### Types of changes
|
24
|
+
|
25
|
+
- `Added` for new features.
|
26
|
+
- `Changed` for changes in existing functionality.
|
27
|
+
- `Deprecated` for soon-to-be removed features.
|
28
|
+
- `Removed` for now removed features.
|
29
|
+
- `Fixed` for any bug fixes.
|
30
|
+
- `Security` in case of vulnerabilities.
|
31
|
+
|
32
|
+
## [Unreleased] - XXXX-XX-XX
|
33
|
+
|
34
|
+
## [0.8.0] - 2022-08-19
|
35
|
+
### Added
|
36
|
+
- Support for Ruby 3 (and keep support for 2.7).
|
37
|
+
- Support for Elasticsearch v8 (and keep support for v7).
|
38
|
+
- Support setting a logger in `Config`.
|
39
|
+
- Support refresh on `IndexManager#populate_index`.
|
40
|
+
- Support Proc in `Config#data_source` so it can be lazily evaluated.
|
41
|
+
|
42
|
+
### Removed
|
43
|
+
- Drop support for Ruby 2.6.
|
44
|
+
- Drop support for Elasticsearch v5 and v6.
|
45
|
+
|
46
|
+
[Unreleased]: https://github.com/carwow/zelastic/compare/v0.8.0...HEAD
|
47
|
+
[0.8.0]: https://github.com/carwow/zelastic/releases/tag/v0.8.0
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# Zelastic
|
2
|
+
|
3
|
+
Zero-downtime Elasticsearch tooling for managing indices and indexing from
|
4
|
+
ActiveRecord with PostgreSQL to Elasticsearch.
|
2
5
|
|
3
6
|
## Installation
|
4
7
|
|
@@ -10,13 +13,14 @@ gem 'zelastic'
|
|
10
13
|
|
11
14
|
And then execute:
|
12
15
|
|
13
|
-
$ bundle
|
16
|
+
$ bundle install
|
14
17
|
|
15
18
|
Or install it yourself as:
|
16
19
|
|
17
20
|
$ gem install zelastic
|
18
21
|
|
19
22
|
## Usage
|
23
|
+
|
20
24
|
### Setup
|
21
25
|
|
22
26
|
For each ActiveRecord scope you want to index, you'll need a configuration:
|
@@ -46,7 +50,6 @@ You can also override some defaults, if you wish:
|
|
46
50
|
here
|
47
51
|
- `read_alias`: by default this is the table name of the `data_source`
|
48
52
|
- `write_alias`: by default this is the `read_alias`, with `_write` appended
|
49
|
-
- `type`: by default this is `read_alias.singularize`
|
50
53
|
|
51
54
|
If you pass an array to as the `client` argument, all writes will be applied to every client in the
|
52
55
|
array.
|
data/lib/zelastic/config.rb
CHANGED
@@ -2,31 +2,36 @@
|
|
2
2
|
|
3
3
|
module Zelastic
|
4
4
|
class Config
|
5
|
-
attr_reader :clients
|
5
|
+
attr_reader :clients
|
6
6
|
|
7
7
|
def initialize(
|
8
8
|
client:,
|
9
9
|
data_source:,
|
10
10
|
mapping:,
|
11
|
+
logger: nil,
|
11
12
|
**overrides,
|
12
13
|
&index_data
|
13
14
|
)
|
14
15
|
@clients = Array(client)
|
15
16
|
@data_source = data_source
|
16
17
|
@mapping = mapping
|
17
|
-
@
|
18
|
-
@_type = overrides.fetch(:type, true)
|
18
|
+
@logger = logger
|
19
19
|
@overrides = overrides
|
20
|
-
|
21
|
-
|
22
|
-
def type?
|
23
|
-
@_type
|
20
|
+
@index_data = index_data
|
24
21
|
end
|
25
22
|
|
26
23
|
def index_data(model)
|
27
24
|
@index_data.call(model)
|
28
25
|
end
|
29
26
|
|
27
|
+
def data_source
|
28
|
+
if @data_source.respond_to? :call
|
29
|
+
@data_source.call
|
30
|
+
else
|
31
|
+
@data_source
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
30
35
|
def read_alias
|
31
36
|
@read_alias ||= overrides.fetch(:read_alias) { data_source.table_name }
|
32
37
|
end
|
@@ -35,10 +40,6 @@ module Zelastic
|
|
35
40
|
@write_alias ||= overrides.fetch(:write_alias) { [read_alias, 'write'].join('_') }
|
36
41
|
end
|
37
42
|
|
38
|
-
def type
|
39
|
-
@type ||= overrides.fetch(:type, read_alias.singularize)
|
40
|
-
end
|
41
|
-
|
42
43
|
def logger
|
43
44
|
return Rails.logger if defined?(Rails)
|
44
45
|
|
@@ -48,7 +49,7 @@ module Zelastic
|
|
48
49
|
def index_definition
|
49
50
|
{
|
50
51
|
settings: overrides.fetch(:index_settings, {}),
|
51
|
-
mappings:
|
52
|
+
mappings: mapping
|
52
53
|
}
|
53
54
|
end
|
54
55
|
|
@@ -16,12 +16,12 @@ module Zelastic
|
|
16
16
|
client.indices.put_alias(index: index_name, name: config.write_alias)
|
17
17
|
end
|
18
18
|
|
19
|
-
def populate_index(unique_name = nil, batch_size: 3000)
|
19
|
+
def populate_index(unique_name = nil, batch_size: 3000, refresh: false)
|
20
20
|
index_name = index_name_from_unique(unique_name)
|
21
21
|
|
22
22
|
config.data_source.find_in_batches(batch_size: batch_size).with_index do |batch, i|
|
23
23
|
logger.info(populate_index_log(batch_size: batch_size, batch_number: i + 1))
|
24
|
-
indexer.index_batch(batch, client: client, index_name: index_name)
|
24
|
+
indexer.index_batch(batch, client: client, index_name: index_name, refresh: refresh)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -116,18 +116,11 @@ module Zelastic
|
|
116
116
|
else
|
117
117
|
'First index'
|
118
118
|
end
|
119
|
-
"ES: (#{progress}) Indexing
|
119
|
+
"ES: (#{progress}) Indexing records"
|
120
120
|
end
|
121
121
|
|
122
122
|
def current_index_size
|
123
|
-
@current_index_size ||= client.count(
|
124
|
-
end
|
125
|
-
|
126
|
-
def count_params
|
127
|
-
{
|
128
|
-
index: config.read_alias,
|
129
|
-
type: config.type? ? config.type : nil
|
130
|
-
}.compact
|
123
|
+
@current_index_size ||= client.count(index: config.read_alias)['count']
|
131
124
|
end
|
132
125
|
|
133
126
|
def indexed_percent(batch_size, batch_number)
|
data/lib/zelastic/indexer.rb
CHANGED
@@ -43,10 +43,7 @@ module Zelastic
|
|
43
43
|
|
44
44
|
execute_bulk do |index_name|
|
45
45
|
ids.map do |id|
|
46
|
-
|
47
|
-
delete_params[:_type] = config.type if config.type?
|
48
|
-
|
49
|
-
{ delete: delete_params }
|
46
|
+
{ delete: { _index: index_name, _id: id } }
|
50
47
|
end
|
51
48
|
end
|
52
49
|
end
|
@@ -76,19 +73,14 @@ module Zelastic
|
|
76
73
|
end
|
77
74
|
|
78
75
|
def index_command(index:, version:, record:)
|
79
|
-
version_params =
|
80
|
-
if config.type?
|
81
|
-
{ _version: version, _version_type: :external, _type: config.type }
|
82
|
-
else
|
83
|
-
{ version: version, version_type: :external }
|
84
|
-
end
|
85
|
-
|
86
76
|
{
|
87
77
|
index: {
|
88
78
|
_index: index,
|
89
79
|
_id: record.id,
|
90
|
-
data: config.index_data(record)
|
91
|
-
|
80
|
+
data: config.index_data(record),
|
81
|
+
version: version,
|
82
|
+
version_type: :external
|
83
|
+
}
|
92
84
|
}
|
93
85
|
end
|
94
86
|
|
@@ -123,16 +115,11 @@ module Zelastic
|
|
123
115
|
end
|
124
116
|
|
125
117
|
def ignorable_error?(error)
|
126
|
-
# rubocop:disable Layout/LineLength
|
127
|
-
regexp =
|
128
|
-
if config.type?
|
129
|
-
/^\[#{config.type}\]\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/
|
130
|
-
else
|
131
|
-
/^\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/
|
132
|
-
end
|
133
|
-
# rubocop:enable Layout/LineLength
|
134
118
|
error['type'] == 'version_conflict_engine_exception' &&
|
135
|
-
error['reason'] =~
|
119
|
+
error['reason'] =~ VERSION_CONFLICT_ERROR_REGEXP
|
136
120
|
end
|
121
|
+
|
122
|
+
VERSION_CONFLICT_ERROR_REGEXP =
|
123
|
+
/^\[\d+\]: version conflict, current version \[\d+\] is higher or equal to the one provided \[\d+\]$/.freeze
|
137
124
|
end
|
138
125
|
end
|
data/lib/zelastic/version.rb
CHANGED
data/log/.keep
ADDED
File without changes
|
data/zelastic.gemspec
CHANGED
@@ -22,12 +22,13 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
+
spec.add_dependency 'elasticsearch', '>= 7', '< 9'
|
26
|
+
|
27
|
+
spec.add_dependency 'activerecord'
|
25
28
|
spec.add_dependency 'activesupport'
|
26
29
|
|
27
|
-
spec.add_development_dependency 'activerecord'
|
28
30
|
spec.add_development_dependency 'bundler', '~> 2'
|
29
31
|
spec.add_development_dependency 'carwow_rubocop', '~> 4'
|
30
|
-
spec.add_development_dependency 'elasticsearch', '>= 5', '< 8'
|
31
32
|
spec.add_development_dependency 'pry', '~> 0.14'
|
32
33
|
spec.add_development_dependency 'rake', '~> 13'
|
33
34
|
spec.add_development_dependency 'rspec', '~> 3'
|
metadata
CHANGED
@@ -1,17 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zelastic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- carwow Developers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: elasticsearch
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '7'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '9'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '7'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '9'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: activerecord
|
15
35
|
requirement: !ruby/object:Gem::Requirement
|
16
36
|
requirements:
|
17
37
|
- - ">="
|
@@ -25,13 +45,13 @@ dependencies:
|
|
25
45
|
- !ruby/object:Gem::Version
|
26
46
|
version: '0'
|
27
47
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
48
|
+
name: activesupport
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
30
50
|
requirements:
|
31
51
|
- - ">="
|
32
52
|
- !ruby/object:Gem::Version
|
33
53
|
version: '0'
|
34
|
-
type: :
|
54
|
+
type: :runtime
|
35
55
|
prerelease: false
|
36
56
|
version_requirements: !ruby/object:Gem::Requirement
|
37
57
|
requirements:
|
@@ -66,26 +86,6 @@ dependencies:
|
|
66
86
|
- - "~>"
|
67
87
|
- !ruby/object:Gem::Version
|
68
88
|
version: '4'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: elasticsearch
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '5'
|
76
|
-
- - "<"
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: '8'
|
79
|
-
type: :development
|
80
|
-
prerelease: false
|
81
|
-
version_requirements: !ruby/object:Gem::Requirement
|
82
|
-
requirements:
|
83
|
-
- - ">="
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '5'
|
86
|
-
- - "<"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '8'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: pry
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/zelastic/index_manager.rb
|
155
155
|
- lib/zelastic/indexer.rb
|
156
156
|
- lib/zelastic/version.rb
|
157
|
+
- log/.keep
|
157
158
|
- zelastic.gemspec
|
158
159
|
homepage: https://github.com/carwow/zelastic
|
159
160
|
licenses:
|