elasticsearch_hermes 0.0.4.1 → 0.0.7

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: fc9f73e651b45f5a8e692dfc08bb441048290141
4
- data.tar.gz: d8a917eedaa40d3297eda5e9bb177ccd3da6a558
3
+ metadata.gz: ca49773931614d5ca56517d8d3944521fb1ee3a4
4
+ data.tar.gz: e9e012689bc7f94c8d9fb4d5d7001aff7653592c
5
5
  SHA512:
6
- metadata.gz: 82f7ddbc439c4813ce7e9af65d914fc1c4f9244c00b8d7f3d2294547b008f620c4e2cd05a25ab8815bb6a26312444cc37d419e5e483b13071929d243e9a4a205
7
- data.tar.gz: c0f4670d78afeafac6eb034c595d2049ce2720be5bcaab904c4d6d73d692438a684017b3c0dac648a29fda674f0e84ade8b650a244de34f200289484dd094310
6
+ metadata.gz: 119b0c54f87925b6b7b846e181a0797b4eccebebda877bc509f1b71ec40397510ea056b0d5f676ab2429f688dbd5cc9e122c930001df0b32d31c585d0ed15fab
7
+ data.tar.gz: 7fb77764cda5b9a10f4d6b5056494a354c25136c331f6e1eb27e6a6ec532168026233c26f1a3bf10fa911616e3768874799bf6cbe781cf9f6365e82fe4c215ef
@@ -5,6 +5,10 @@ require 'elasticsearch_hermes/railtie'
5
5
  require 'elasticsearch_hermes/errors'
6
6
  require 'elasticsearch_hermes/configuration'
7
7
  require 'elasticsearch_hermes/index'
8
+ require 'elasticsearch_hermes/indexing/model'
9
+ require 'elasticsearch_hermes/indexing/helper'
10
+ require 'elasticsearch_hermes/query'
11
+ require 'elasticsearch_hermes/result/base'
8
12
  require 'elasticsearch_hermes/hook'
9
13
  require 'elasticsearch_hermes/logger'
10
14
  require 'elasticsearch_hermes/elasticsearch_hermes'
@@ -3,7 +3,7 @@
3
3
  module ElasticsearchHermes
4
4
  class Configuration
5
5
  attr_accessor :request_timeout, :retry_on_failure, :es_user, :es_password
6
- attr_accessor :es_url, :enable_logs
6
+ attr_accessor :es_url, :enable_logs, :fields
7
7
  def initialize
8
8
  @request_timeout = nil
9
9
  @retry_on_failure = nil
@@ -11,6 +11,7 @@ module ElasticsearchHermes
11
11
  @es_password = nil
12
12
  @es_url = nil
13
13
  @enable_logs = nil
14
+ @fields = nil
14
15
  end
15
16
  end
16
17
  end
@@ -30,9 +30,21 @@ module ElasticsearchHermes
30
30
  @client ||= ::Elasticsearch::Client.new(default_connect_options)
31
31
  end
32
32
 
33
+ def self.fields
34
+ configuration.fields
35
+ end
36
+
33
37
  def self.connect!
34
38
  return unless client
35
39
 
40
+ indices = fields.map { |field| field[:index_name] }.uniq
41
+
42
+ indices.each do |index|
43
+ Logger.log("Checking index #{index}")
44
+ index_s = ElasticsearchHermes::Index.new(name: index)
45
+ Logger.log "Missing Index #{index}" unless index_s.exist?
46
+ end
47
+
36
48
  info = @client.info
37
49
  cluster_version = info['version']['number']
38
50
  msg = "Connected to Elastic version #{cluster_version}."
@@ -2,8 +2,5 @@
2
2
 
3
3
  module ElasticsearchHermes
4
4
  module Hook
5
- class << self
6
-
7
- end
8
5
  end
9
6
  end
@@ -4,12 +4,96 @@ module ElasticsearchHermes
4
4
  class Index
5
5
  attr_reader :name
6
6
 
7
- def initialize(name)
7
+ def initialize(name:, fields: [])
8
8
  @name = name
9
+ @fields = fields
9
10
  end
10
11
 
11
12
  def create
12
- ElasticsearchHermes.client.indices.create index: name, body: {}
13
+ ElasticsearchHermes.client.indices.create index: @name, body: index_options
14
+ end
15
+
16
+ def delete
17
+ ElasticsearchHermes.client.indices.delete index: @name
18
+ end
19
+
20
+ def exist?
21
+ ElasticsearchHermes.client.indices.exists? index: @name
22
+ end
23
+
24
+ private
25
+
26
+ def build_field_mappings
27
+ properties = {}
28
+ analyzer = {}
29
+ tokenizer = {}
30
+ @fields.each do |field|
31
+ # add checks for full_match
32
+ if field[:search_type] == :partial_match
33
+ @field_token = ngram_builder(field[:minimum_match], field[:field_name])
34
+ @field_analyzer = analyzer_builder(field[:field_name], 'custom', "#{field[:field_name]}_tokens", 'lowercase')
35
+ end
36
+
37
+ prop = {
38
+ "#{field[:field_name]}": {
39
+ type: field[:field_type],
40
+ analyzer: "#{field[:field_name]}_analyzer"
41
+ }
42
+ }
43
+
44
+ analyzer = analyzer.merge(@field_analyzer || {})
45
+ tokenizer = tokenizer.merge(@field_token || {})
46
+ properties = properties.merge(prop || {})
47
+ end
48
+
49
+ { properties: properties, analyzer: analyzer, tokenizer: tokenizer }
50
+ end
51
+
52
+ def index_options
53
+ field_mappings = build_field_mappings
54
+ {
55
+ settings: {
56
+ analysis: {
57
+ analyzer: field_mappings[:analyzer],
58
+ tokenizer: field_mappings[:tokenizer]
59
+ }
60
+ },
61
+ mappings: {
62
+ properties: field_mappings[:properties]
63
+ }
64
+ }
65
+ end
66
+
67
+ def field_mappings_builder(field_name, field_type, type_analyzer)
68
+ {
69
+ "#{field_name}": {
70
+ type: field_type,
71
+ analyzer: type_analyzer
72
+ }
73
+ }
74
+ end
75
+
76
+ def analyzer_builder(analyzer_name, analyzer_type, tokenizer, filter)
77
+ {
78
+ "#{analyzer_name}_analyzer": {
79
+ type: analyzer_type,
80
+ tokenizer: tokenizer,
81
+ filter: filter
82
+ }
83
+ }
84
+ end
85
+
86
+ def ngram_builder(number, field_name)
87
+ {
88
+ "#{field_name}_tokens": {
89
+ type: 'ngram',
90
+ min_gram: number,
91
+ max_gram: number,
92
+ token_chars: [
93
+ 'letter'
94
+ ]
95
+ }
96
+ }
13
97
  end
14
98
  end
15
99
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ module Indexing
5
+ module Helper
6
+ def re_index(index_name: to_s.underscore)
7
+ delete_index(index_name: index_name)
8
+ @index_object.create
9
+ all.find_each(&:touch)
10
+ end
11
+
12
+ def delete_index(index_name: to_s.underscore)
13
+ @index_object ||= ElasticsearchHermes::Index.new(name: index_name, fields: @fields)
14
+ @index_object.delete
15
+ rescue Elasticsearch::Transport::Transport::Errors::NotFound
16
+ Logger.log("No Such index: #{index_name}")
17
+ end
18
+
19
+ def index_on(fields: [])
20
+ @fields = fields
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ module Indexing
5
+ module Model
6
+ def elastic_update(type: '_doc', index_name: self.class.to_s.underscore, id:, body:)
7
+ ElasticsearchHermes.client.index index_payload(
8
+ index_name: index_name,
9
+ type: type,
10
+ body: body,
11
+ id: id
12
+ )
13
+ end
14
+
15
+ def index_payload(index_name:, type:, id:, body:)
16
+ {
17
+ type: type,
18
+ index: index_name,
19
+ id: id,
20
+ body: body
21
+ }
22
+ end
23
+ end
24
+ end
25
+ 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,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
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticsearchHermes
4
+ module Result
5
+ class Hit
6
+ #TODO: abstract hits from results class
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ElasticsearchHermes
4
- VERSION = '0.0.4.1'
4
+ VERSION = '0.0.7'
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.1
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronald Ekambi
@@ -42,8 +42,13 @@ files:
42
42
  - lib/elasticsearch_hermes/errors.rb
43
43
  - lib/elasticsearch_hermes/hook.rb
44
44
  - lib/elasticsearch_hermes/index.rb
45
+ - lib/elasticsearch_hermes/indexing/helper.rb
46
+ - lib/elasticsearch_hermes/indexing/model.rb
45
47
  - lib/elasticsearch_hermes/logger.rb
48
+ - lib/elasticsearch_hermes/query.rb
46
49
  - lib/elasticsearch_hermes/railtie.rb
50
+ - lib/elasticsearch_hermes/result/base.rb
51
+ - lib/elasticsearch_hermes/result/hit.rb
47
52
  - lib/elasticsearch_hermes/version.rb
48
53
  homepage: https://github.com/roncodingenthusiast/elasticsearch_hermes
49
54
  licenses:
@@ -68,6 +73,5 @@ rubyforge_project:
68
73
  rubygems_version: 2.6.14.3
69
74
  signing_key:
70
75
  specification_version: 4
71
- summary: elasticsearch_hermes is a layer on top of elasticsearch-ruby to handle the
72
- complicated configuration of elastic
76
+ summary: I will fix this eventually
73
77
  test_files: []