elasticsearch_hermes 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|