elasticsearch_hermes 0.0.4.1 → 0.0.4.2
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3923c6822a3a4f1f1fff0d0ba1bce68cbdda83c2
|
4
|
+
data.tar.gz: d15724eb798e20cfecbb0b641a71a8383eb516ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7172c9c57053c493ec15d79b0ad302c71dc9ad2b4cb0151f1cdcab2cab1bfaa956445c73adf25651d2013e1154cbf112fe7e475c1cd34f920a02e22a3f772d5
|
7
|
+
data.tar.gz: 40e4a5ef7d2462610a57ad4fd5ea574345f414f9ade32e4921337ed63e7a7dd0ea5d8ab54470dda05a86937ab0a89efa083d6842fa3eefda3af3734a5f14ba1b
|
@@ -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,23 @@ 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
|
+
|
37
|
+
|
33
38
|
def self.connect!
|
34
39
|
return unless client
|
35
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
|
+
|
36
50
|
info = @client.info
|
37
51
|
cluster_version = info['version']['number']
|
38
52
|
msg = "Connected to Elastic version #{cluster_version}."
|
@@ -9,7 +9,89 @@ module ElasticsearchHermes
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def create
|
12
|
-
ElasticsearchHermes.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
|