elasticsearch_hermes 0.0.5

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