Пользовательский анализатор elasticsearch-rails

#ruby-on-rails #elasticsearch #elasticsearch-plugin

#ruby-on-rails #elasticsearch #elasticsearch-плагин

Вопрос:

Я использую elasticsearch-rails gem в своем приложении Rails для упрощения интеграции с Elasticsearch. Я пытаюсь использовать плагин фонетического анализа, поэтому мне нужно определить пользовательский анализатор и пользовательский фильтр для моего индекса.

Я попробовал этот фрагмент кода для выполнения пользовательского анализа с помощью фонетического фильтра soundex, но он завершается ошибкой с сообщением об исключении:

[!!!] Ошибка при создании индекса: Elasticsearch::Транспорт::Транспорт::Ошибки::BadRequest [400] {«ошибка»:»MapperParsingException[сопоставление [call_sentence]]; вложенный: MapperParsingException[Анализатор [{tokenizer=standard, filter= [стандартный, строчный, метафонер]}] не найдендля поля [фонетический]]; «,»статус»: 400}

 # Set up index configuration and mapping
#
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
  mapping do
    indexes :text, type: 'multi_field' do
      indexes :processed, analyzer: 'snowball'
      indexes :phone, {analyzer: {
        tokenizer: "standard",
        filter: ["standard", "lowercase", "metaphoner"]
      }, filter: {
        metaphoner: {
            type: "phonetic",
            encoder: "soundex",
            replace: false
        }
      }}
      indexes :raw, analyzer: 'keyword'
    end
  end
end
  

Ответ №1:

Вы также можете указать его в вызове настроек:

 settings index: { 
    number_of_shards: 1, 
    number_of_replicas: 0,
    analysis: {
      filter: {
        metaphoner: { 
          type: 'phonetic',
          encoder: doublemetaphone,
          replace: true,
        } 
      },
      analyzer: {
        phonetic_analyzer: {
          tokenizer: 'standard',
          filter: ["standard", "lowercase", "metaphoner"],
        }
      }
    }
  } do
    mapping do
      indexes :text, type: 'multi_field' do
        indexes :processed, analyzer: 'snowball'
        indexes :phone, analyzer: 'phonetic_analyzer'
        indexes :raw, analyzer: 'keyword'
      end
    end
end
  

Ответ №2:

Хорошо, я изменил конфигурацию elasticsearch.yml, чтобы включить фонетический анализатор

 #################################### Index ####################################
index: 
  analysis: 
    analyzer: 
      phonetic_analyzer: 
        tokenizer: standard
        filter: [metaphoner]
    filter: 
      metaphoner: 
        type: phonetic
        encoder: doublemetaphone
        replace: true