class ElasticsearchHermes::Index

Attributes

name[R]

Public Class Methods

new(name:, fields: []) click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 7
def initialize(name:, fields: [])
  @name = name
  @fields = fields
end

Public Instance Methods

create() click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 12
def create
  ElasticsearchHermes.client.indices.create index: @name, body: index_options
end
delete() click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 16
def delete
  ElasticsearchHermes.client.indices.delete index: @name
end
exist?() click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 20
def exist?
  ElasticsearchHermes.client.indices.exists? index: @name
end

Private Instance Methods

analyzer_builder(analyzer_name, analyzer_type, tokenizer, filter) click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 76
def analyzer_builder(analyzer_name, analyzer_type, tokenizer, filter)
  {
    "#{analyzer_name}_analyzer": {
      type: analyzer_type,
      tokenizer: tokenizer,
      filter: filter
    }
  }
end
build_field_mappings() click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 26
def build_field_mappings
  properties = {}
  analyzer = {}
  tokenizer = {}
  @fields.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
field_mappings_builder(field_name, field_type, type_analyzer) click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 67
def field_mappings_builder(field_name, field_type, type_analyzer)
  {
    "#{field_name}": {
      type: field_type,
      analyzer: type_analyzer
    }
  }
end
index_options() click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 52
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) click to toggle source
# File lib/elasticsearch_hermes/index.rb, line 86
def ngram_builder(number, field_name)
  {
    "#{field_name}_tokens": {
      type: 'ngram',
      min_gram: number,
      max_gram: number,
      token_chars: [
        'letter'
      ]
    }
  }
end