elasticsearch_hermes 0.0.4 → 0.0.6

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