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.
@@ -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,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ class HermesErrors < StandardError
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ module Hook
5
+ class << self
6
+
7
+ end
8
+ end
9
+ 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,7 @@
1
+ module ElasticsearchHermes
2
+ class Logger
3
+ def self.log(msg)
4
+ Rails.logger.info(msg) && (Rails.env.development? && puts(msg))
5
+ end
6
+ end
7
+ 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,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ class Railtie < Rails::Railtie
5
+ # Connect to Elasticsearch on server boot
6
+ config.to_prepare do
7
+ ElasticsearchHermes.connect!
8
+ end
9
+ end
10
+ 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ VERSION = '0.0.5'
5
+ end
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: []