class Chewy::Index::Settings

Stores ElasticSearch index settings and resolves `analysis` hash. At first, you need to store some analyzers or other analysis options to the corresponding repository:

@example

Chewy.analyzer :title_analyzer, type: 'custom', filter: %w(lowercase icu_folding title_nysiis)
Chewy.filter :title_nysiis, type: 'phonetic', encoder: 'nysiis', replace: false

`title_nysiis` filter here will be expanded automatically when `title_analyzer` analyser will be used in index settings:

@example

class ProductsIndex < Chewy::Index
  settings analysis: {
    analyzer: [
      'title_analyzer',
      {one_more_analyzer: {type: 'custom', tokenizer: 'lowercase'}}
    ]
  }
end

Additional analysing options, which wasn't stored in repositories, might be used as well.

Public Class Methods

new(params = {}, &block) click to toggle source
# File lib/chewy/index/settings.rb, line 28
def initialize(params = {}, &block)
  @params = params
  @proc_params = block
end

Public Instance Methods

to_hash() click to toggle source
# File lib/chewy/index/settings.rb, line 33
def to_hash
  settings = @params.deep_symbolize_keys
  settings.merge!((@proc_params.call || {}).deep_symbolize_keys) if @proc_params

  settings[:analysis] = resolve_analysis(settings[:analysis]) if settings[:analysis]

  if settings[:index] || Chewy.configuration[:index]
    settings[:index] = (Chewy.configuration[:index] || {})
      .deep_merge((settings[:index] || {}).deep_symbolize_keys)
  end

  settings.present? ? {settings: settings} : {}
end

Private Instance Methods

collect_dependencies(type, analyzer) click to toggle source
# File lib/chewy/index/settings.rb, line 63
def collect_dependencies(type, analyzer)
  analyzer.map { |_, options| options[type] }.compact.flatten.uniq
end
resolve(params, repository) click to toggle source
# File lib/chewy/index/settings.rb, line 67
def resolve(params, repository)
  if params.is_a?(Array)
    params.flatten.reject(&:blank?).each.with_object({}) do |name_or_hash, result|
      options = if name_or_hash.is_a?(Hash)
        name_or_hash
      else
        name_or_hash = name_or_hash.to_sym
        resolved = repository[name_or_hash]
        resolved ? {name_or_hash => resolved} : {}
      end
      result.merge!(options)
    end
  else
    params || {}
  end
end
resolve_analysis(analysis) click to toggle source
# File lib/chewy/index/settings.rb, line 49
def resolve_analysis(analysis)
  analyzer = resolve(analysis[:analyzer], Chewy.analyzers)

  options = %i[tokenizer filter char_filter].each.with_object({}) do |type, result|
    dependencies = collect_dependencies(type, analyzer)
    resolved = resolve(dependencies.push(analysis[type]), Chewy.send(type.to_s.pluralize))
    result.merge!(type => resolved) if resolved.present?
  end

  options[:analyzer] = analyzer if analyzer.present?
  analysis = analysis.except(:analyzer, :tokenizer, :filter, :char_filter)
  analysis.merge(options)
end