elasticsearch_hermes 0.0.4 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f59f38fcf425e8d7895b3b44a32ed4013d9c552
4
- data.tar.gz: 0a42e7b1b434136d7c7c3372ffe6e3c720a15b52
3
+ metadata.gz: 81930c441e75a5180feaf4c83e2bfd2c56c5b4ca
4
+ data.tar.gz: 68a12ce9d23fd52993aaa17107c7e0203c069a10
5
5
  SHA512:
6
- metadata.gz: 27c21a254b77f5c5468dc91a33a696c509103cf9f2a5db00a4ddd4508d36b3b878000eeee216b6081ee9e493ef8f44f2bc462ca2834a43e04c729ffc0e6f97c9
7
- data.tar.gz: 78746eadc2492afff69a76d007facc4e4188ed578f702ad4ae3d574424e9161dbb28701b65f3f890f996dd37836f307d838e62ad94f744cc72ffab28b84718af
6
+ metadata.gz: b849aaf675784c2c9ea8c45add69a5d8d2a1ecb766b7b48e4587a98c4740533069623d1bd0142b303a5e37b3b2004d1587e93f0d1303a9a9aaaea321b4771d92
7
+ data.tar.gz: 6ff1279329c4e213b7e660e9c4b4960a0a3e9425ca76774152fa2906cc49d33b39903924cd09681b10e47df179029d117ca204c0467dc7215937f4b75a163486
@@ -1,39 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'elasticsearch'
4
- require 'elasticsearch_hermes/configuration'
5
3
  require 'elasticsearch_hermes/version'
4
+ require 'elasticsearch_hermes/railtie'
5
+ require 'elasticsearch_hermes/errors'
6
+ require 'elasticsearch_hermes/configuration'
6
7
  require 'elasticsearch_hermes/index'
7
-
8
- module ElasticsearchHermes
9
- class << self
10
- attr_writer :configuration
11
- end
12
-
13
- def self.configuration
14
- @configuration ||= Configuration.new
15
- end
16
-
17
- def self.reset
18
- @configuration = Configuration.new
19
- end
20
-
21
- def self.configure
22
- yield(configuration)
23
- end
24
-
25
- def self.default_connect_options
26
- base_es_urls = configuration.elasticsearch_url
27
- urls = base_es_urls.split(',').compact.uniq
28
- options = { url: urls, retry_on_failure: 2, log: true }
29
- options
30
- end
31
-
32
- def self.client
33
- @client ||= ::Elasticsearch::Client.new(default_connect_options)
34
- end
35
-
36
- def self.refresh
37
- client.indices.refresh
38
- end
39
- end
8
+ require 'elasticsearch_hermes/indexing'
9
+ require 'elasticsearch_hermes/query'
10
+ require 'elasticsearch_hermes/result/base'
11
+ require 'elasticsearch_hermes/hook'
12
+ require 'elasticsearch_hermes/logger'
13
+ require 'elasticsearch_hermes/elasticsearch_hermes'
@@ -2,15 +2,16 @@
2
2
 
3
3
  module ElasticsearchHermes
4
4
  class Configuration
5
- attr_accessor :request_timeout, :retry_on_failure, :elasticsearch_user, :elasticsearch_password, :elasticsearch_url, :is_protected
6
-
5
+ attr_accessor :request_timeout, :retry_on_failure, :es_user, :es_password
6
+ attr_accessor :es_url, :enable_logs, :fields
7
7
  def initialize
8
8
  @request_timeout = nil
9
9
  @retry_on_failure = nil
10
- @elasticsearch_user = nil
11
- @elasticsearch_password = nil
12
- @elasticsearch_url = nil
13
- @is_protected = nil
10
+ @es_user = nil
11
+ @es_password = nil
12
+ @es_url = nil
13
+ @enable_logs = nil
14
+ @fields = nil
14
15
  end
15
16
  end
16
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,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ module Hook
5
+ end
6
+ end
@@ -9,7 +9,89 @@ module ElasticsearchHermes
9
9
  end
10
10
 
11
11
  def create
12
- client.indices.create index: name, body: {}
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
+ }
13
95
  end
14
96
  end
15
97
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ module Indexing
5
+ def elastic_update(type: '_doc', index_name: self.class.to_s.underscore, id:, body:)
6
+ ElasticsearchHermes.client.index index_payload(
7
+ index_name: index_name,
8
+ type: type,
9
+ body: body,
10
+ id: id
11
+ )
12
+ end
13
+
14
+ def index_payload(index_name:, type:, id:, body:)
15
+ {
16
+ type: type,
17
+ index: index_name,
18
+ id: id,
19
+ body: body
20
+ }
21
+ end
22
+ end
23
+ 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: @hermes_search_on)
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
+ @hermes_search_on ||= fields.map(&:to_s)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ElasticsearchHermes
4
- VERSION = '0.0.4'
4
+ VERSION = '0.0.6'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elasticsearch_hermes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronald Ekambi
@@ -9,7 +9,27 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2019-12-01 00:00:00.000000000 Z
12
- dependencies: []
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
13
33
  description:
14
34
  email: ronekambi@gmail.com
15
35
  executables: []
@@ -18,7 +38,16 @@ extra_rdoc_files: []
18
38
  files:
19
39
  - lib/elasticsearch_hermes.rb
20
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
21
44
  - lib/elasticsearch_hermes/index.rb
45
+ - lib/elasticsearch_hermes/indexing.rb
46
+ - lib/elasticsearch_hermes/logger.rb
47
+ - lib/elasticsearch_hermes/query.rb
48
+ - lib/elasticsearch_hermes/railtie.rb
49
+ - lib/elasticsearch_hermes/result/base.rb
50
+ - lib/elasticsearch_hermes/result/hit.rb
22
51
  - lib/elasticsearch_hermes/version.rb
23
52
  homepage: https://github.com/roncodingenthusiast/elasticsearch_hermes
24
53
  licenses:
@@ -43,5 +72,5 @@ rubyforge_project:
43
72
  rubygems_version: 2.6.14.3
44
73
  signing_key:
45
74
  specification_version: 4
46
- summary: elasticsearch_hermes is a layer on top of elasticsearch to handle searching
75
+ summary: I will fix this eventually
47
76
  test_files: []