elasticsearch_hermes 0.0.4.1 → 0.0.4.2
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:
|
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
|