elasticsearch_hermes 0.0.5
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 +7 -0
- data/lib/elasticsearch_hermes.rb +12 -0
- data/lib/elasticsearch_hermes/configuration.rb +17 -0
- data/lib/elasticsearch_hermes/elasticsearch_hermes.rb +59 -0
- data/lib/elasticsearch_hermes/errors.rb +6 -0
- data/lib/elasticsearch_hermes/hook.rb +9 -0
- data/lib/elasticsearch_hermes/index.rb +97 -0
- data/lib/elasticsearch_hermes/logger.rb +7 -0
- data/lib/elasticsearch_hermes/query.rb +38 -0
- data/lib/elasticsearch_hermes/railtie.rb +10 -0
- data/lib/elasticsearch_hermes/result/base.rb +24 -0
- data/lib/elasticsearch_hermes/result/hit.rb +0 -0
- data/lib/elasticsearch_hermes/version.rb +5 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d352d3f11b92ce34dc36978cce2b62f52d369bba
|
4
|
+
data.tar.gz: 5beb1384fb2f024ea626ce7b802b1977c3d8a88d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d945a12503c9aa29d502796d5e35c7341a6dcd5beff159b4882291323a7e6932522bab663e8727859b42f20468ed911883212e93e539cf75c17936aa0629ee2d
|
7
|
+
data.tar.gz: a7be38e060daa2d83bc0a75edf5b29aefc9bce322f71769e8f3ee7db9c7229dbf9cc056547d58d7febd8f9949ee0f716f9f8d988889e3432923c40a84bdcc426
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'elasticsearch_hermes/version'
|
4
|
+
require 'elasticsearch_hermes/railtie'
|
5
|
+
require 'elasticsearch_hermes/errors'
|
6
|
+
require 'elasticsearch_hermes/configuration'
|
7
|
+
require 'elasticsearch_hermes/index'
|
8
|
+
require 'elasticsearch_hermes/query'
|
9
|
+
require 'elasticsearch_hermes/result/base'
|
10
|
+
require 'elasticsearch_hermes/hook'
|
11
|
+
require 'elasticsearch_hermes/logger'
|
12
|
+
require 'elasticsearch_hermes/elasticsearch_hermes'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ElasticsearchHermes
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :request_timeout, :retry_on_failure, :es_user, :es_password
|
6
|
+
attr_accessor :es_url, :enable_logs, :fields
|
7
|
+
def initialize
|
8
|
+
@request_timeout = nil
|
9
|
+
@retry_on_failure = nil
|
10
|
+
@es_user = nil
|
11
|
+
@es_password = nil
|
12
|
+
@es_url = nil
|
13
|
+
@enable_logs = nil
|
14
|
+
@fields = nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'elasticsearch'
|
4
|
+
|
5
|
+
module ElasticsearchHermes
|
6
|
+
class << self
|
7
|
+
attr_writer :configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.configuration
|
11
|
+
@configuration ||= Configuration.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.reset
|
15
|
+
@configuration = Configuration.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.setup
|
19
|
+
yield(configuration)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.default_connect_options
|
23
|
+
base_es_urls = configuration.es_url
|
24
|
+
urls = base_es_urls.split(',').compact.uniq
|
25
|
+
options = { url: urls, retry_on_failure: 2, log: true }
|
26
|
+
options
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.client
|
30
|
+
@client ||= ::Elasticsearch::Client.new(default_connect_options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.fields
|
34
|
+
configuration.fields
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def self.connect!
|
39
|
+
return unless client
|
40
|
+
|
41
|
+
|
42
|
+
indices = fields.map { |field| field[:index_name] }.uniq
|
43
|
+
|
44
|
+
indices.each do |index|
|
45
|
+
Logger.log("Checking index #{index}")
|
46
|
+
index_s = ElasticsearchHermes::Index.new(index)
|
47
|
+
index_s.create unless index_s.exist?
|
48
|
+
end
|
49
|
+
|
50
|
+
info = @client.info
|
51
|
+
cluster_version = info['version']['number']
|
52
|
+
msg = "Connected to Elastic version #{cluster_version}."
|
53
|
+
Logger.log(msg)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.refresh
|
57
|
+
client.indices.refresh
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ElasticsearchHermes
|
4
|
+
class Index
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize(name)
|
8
|
+
@name = name
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
ElasticsearchHermes.client.indices.create index: @name, body: index_options
|
13
|
+
end
|
14
|
+
|
15
|
+
def exist?
|
16
|
+
ElasticsearchHermes.client.indices.exists? index: @name
|
17
|
+
end
|
18
|
+
|
19
|
+
def fields
|
20
|
+
ElasticsearchHermes.fields || []
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_field_mappings
|
24
|
+
fields_to_index = fields.select { |field| field[:index_name] == @name }
|
25
|
+
properties = {}
|
26
|
+
analyzer = {}
|
27
|
+
tokenizer = {}
|
28
|
+
fields_to_index.each do |field|
|
29
|
+
# add checks for full_match
|
30
|
+
if field[:search_type] == :partial_match
|
31
|
+
@field_token = ngram_builder(field[:minimum_match], field[:field_name])
|
32
|
+
@field_analyzer = analyzer_builder(field[:field_name], 'custom', "#{field[:field_name]}_tokens", 'lowercase')
|
33
|
+
end
|
34
|
+
|
35
|
+
prop = {
|
36
|
+
"#{field[:field_name]}": {
|
37
|
+
type: field[:field_type],
|
38
|
+
analyzer: "#{field[:field_name]}_analyzer"
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
analyzer = analyzer.merge(@field_analyzer || {})
|
43
|
+
tokenizer = tokenizer.merge(@field_token || {})
|
44
|
+
properties = properties.merge(prop || {})
|
45
|
+
end
|
46
|
+
|
47
|
+
{ properties: properties, analyzer: analyzer, tokenizer: tokenizer }
|
48
|
+
end
|
49
|
+
|
50
|
+
def index_options
|
51
|
+
field_mappings = build_field_mappings
|
52
|
+
{
|
53
|
+
settings: {
|
54
|
+
analysis: {
|
55
|
+
analyzer: field_mappings[:analyzer],
|
56
|
+
tokenizer: field_mappings[:tokenizer]
|
57
|
+
}
|
58
|
+
},
|
59
|
+
mappings: {
|
60
|
+
properties: field_mappings[:properties]
|
61
|
+
}
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def field_mappings_builder(field_name, field_type, type_analyzer)
|
66
|
+
{
|
67
|
+
"#{field_name}": {
|
68
|
+
type: field_type,
|
69
|
+
analyzer: type_analyzer
|
70
|
+
}
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
def analyzer_builder(analyzer_name, analyzer_type, tokenizer, filter)
|
75
|
+
{
|
76
|
+
"#{analyzer_name}_analyzer": {
|
77
|
+
type: analyzer_type,
|
78
|
+
tokenizer: tokenizer,
|
79
|
+
filter: filter
|
80
|
+
}
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
def ngram_builder(number, field_name)
|
85
|
+
{
|
86
|
+
"#{field_name}_tokens": {
|
87
|
+
type: 'ngram',
|
88
|
+
min_gram: number,
|
89
|
+
max_gram: number,
|
90
|
+
token_chars: [
|
91
|
+
'letter'
|
92
|
+
]
|
93
|
+
}
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ElasticsearchHermes
|
4
|
+
module Query
|
5
|
+
def search(query: '', index_name: to_s.underscore, fields: [])
|
6
|
+
@results = ElasticsearchHermes.client.search query_payload(
|
7
|
+
query: query,
|
8
|
+
index_name: index_name,
|
9
|
+
fields: fields
|
10
|
+
)
|
11
|
+
ElasticsearchHermes::Result::Base.new(@results.symbolize_keys)
|
12
|
+
end
|
13
|
+
|
14
|
+
def hermes_search_on(*_fields)
|
15
|
+
yield
|
16
|
+
end
|
17
|
+
|
18
|
+
def search_type; end
|
19
|
+
|
20
|
+
def field_type; end
|
21
|
+
|
22
|
+
def minimum_match; end
|
23
|
+
|
24
|
+
def query_payload(query:, index_name:, fields:)
|
25
|
+
{
|
26
|
+
index: index_name,
|
27
|
+
body: {
|
28
|
+
query: {
|
29
|
+
multi_match: {
|
30
|
+
query: query,
|
31
|
+
fields: fields
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ElasticsearchHermes
|
4
|
+
module Result
|
5
|
+
class Base
|
6
|
+
attr_reader :took, :timed_out, :shards, :hits
|
7
|
+
|
8
|
+
def initialize(took:, timed_out:, hits:, _shards:)
|
9
|
+
@took = took
|
10
|
+
@timed_out = timed_out
|
11
|
+
@shards = _shards
|
12
|
+
@hits = hits
|
13
|
+
end
|
14
|
+
|
15
|
+
def ids
|
16
|
+
@ids ||= @hits['hits'].map { |hit| hit['_id'] }
|
17
|
+
end
|
18
|
+
|
19
|
+
def models
|
20
|
+
@models ||= ''
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: elasticsearch_hermes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ronald Ekambi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-12-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: elasticsearch
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '7.4'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 7.4.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '7.4'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 7.4.0
|
33
|
+
description:
|
34
|
+
email: ronekambi@gmail.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- lib/elasticsearch_hermes.rb
|
40
|
+
- lib/elasticsearch_hermes/configuration.rb
|
41
|
+
- lib/elasticsearch_hermes/elasticsearch_hermes.rb
|
42
|
+
- lib/elasticsearch_hermes/errors.rb
|
43
|
+
- lib/elasticsearch_hermes/hook.rb
|
44
|
+
- lib/elasticsearch_hermes/index.rb
|
45
|
+
- lib/elasticsearch_hermes/logger.rb
|
46
|
+
- lib/elasticsearch_hermes/query.rb
|
47
|
+
- lib/elasticsearch_hermes/railtie.rb
|
48
|
+
- lib/elasticsearch_hermes/result/base.rb
|
49
|
+
- lib/elasticsearch_hermes/result/hit.rb
|
50
|
+
- lib/elasticsearch_hermes/version.rb
|
51
|
+
homepage: https://github.com/roncodingenthusiast/elasticsearch_hermes
|
52
|
+
licenses:
|
53
|
+
- MIT
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 2.6.14.3
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: elasticsearch_hermes is a layer on top of elasticsearch-ruby to handle the
|
75
|
+
complicated configuration of elastic
|
76
|
+
test_files: []
|