Class: ElasticsearchHermes::Index

Inherits:
Object
  • Object
show all
Defined in:
lib/elasticsearch_hermes/index.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ Index

Returns a new instance of Index.



7
8
9
# File 'lib/elasticsearch_hermes/index.rb', line 7

def initialize(name)
  @name = name
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



5
6
7
# File 'lib/elasticsearch_hermes/index.rb', line 5

def name
  @name
end

Instance Method Details

#analyzer_builder(analyzer_name, analyzer_type, tokenizer, filter) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'lib/elasticsearch_hermes/index.rb', line 74

def analyzer_builder(analyzer_name, analyzer_type, tokenizer, filter)
  {
    "#{analyzer_name}_analyzer": {
      type: analyzer_type,
      tokenizer: tokenizer,
      filter: filter
    }
  }
end

#build_field_mappingsObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/elasticsearch_hermes/index.rb', line 23

def build_field_mappings
  fields_to_index = fields.select { |field| field[:index_name] == @name }
  properties = {}
  analyzer = {}
  tokenizer = {}
  fields_to_index.each do |field|
    # add checks for full_match
    if field[:search_type] == :partial_match
      @field_token = ngram_builder(field[:minimum_match], field[:field_name])
      @field_analyzer = analyzer_builder(field[:field_name], 'custom', "#{field[:field_name]}_tokens", 'lowercase')
    end

    prop = {
      "#{field[:field_name]}": {
        type: field[:field_type],
        analyzer: "#{field[:field_name]}_analyzer"
      }
    }

    analyzer = analyzer.merge(@field_analyzer || {})
    tokenizer = tokenizer.merge(@field_token || {})
    properties = properties.merge(prop || {})
  end

  { properties: properties, analyzer: analyzer, tokenizer: tokenizer }
end

#createObject



11
12
13
# File 'lib/elasticsearch_hermes/index.rb', line 11

def create
  ElasticsearchHermes.client.indices.create index: @name, body: index_options
end

#exist?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/elasticsearch_hermes/index.rb', line 15

def exist?
  ElasticsearchHermes.client.indices.exists? index: @name
end

#field_mappings_builder(field_name, field_type, type_analyzer) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/elasticsearch_hermes/index.rb', line 65

def field_mappings_builder(field_name, field_type, type_analyzer)
  {
    "#{field_name}": {
      type: field_type,
      analyzer: type_analyzer
    }
  }
end

#fieldsObject



19
20
21
# File 'lib/elasticsearch_hermes/index.rb', line 19

def fields
  ElasticsearchHermes.fields || []
end

#index_optionsObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/elasticsearch_hermes/index.rb', line 50

def index_options
  field_mappings = build_field_mappings
  {
    settings: {
      analysis: {
        analyzer: field_mappings[:analyzer],
        tokenizer: field_mappings[:tokenizer]
      }
    },
    mappings: {
      properties: field_mappings[:properties]
    }
  }
end

#ngram_builder(number, field_name) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/elasticsearch_hermes/index.rb', line 84

def ngram_builder(number, field_name)
  {
    "#{field_name}_tokens": {
      type: 'ngram',
      min_gram: number,
      max_gram: number,
      token_chars: [
        'letter'
      ]
    }
  }
end