Задать вопрос

Как лучше настроить Elastic Search для русского языка под Rails проект?

Пытаюсь настроить ElasticSearch для поиска по русскоязычному словарю терминов. Но почему-то он это производит странным образом. Допустим есть ряд терминов: пожар, пожарная безопасность, пожарная опасность веществ, пожарная охрана, пожарный извещатель, пожарный кран, пожароопасная зона. Так вот при поиске по слову пожар, он выдает в качестве результата только часть списка: пожарный извещатель, пожарный кран, пожароопасная зона.
Разбираюсь в этом деле в одиночестве и зашел в тупик.

Версия ElasticSearch 2.1.0
Так же установлен плагин для русской морфологии: https://github.com/imotov/elasticsearch-analysis-m...
И https://github.com/royrusso/elasticsearch-HQ

И используются гемы

gem 'elasticsearch-model'
gem 'elasticsearch-rails'

Вот мои файлы:
models/dictionary.rb

class Dictionary < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  index_name "dictionary"  
  mapping do #dynamic: 'false'
    [:title].each do |attribute|
      indexes attribute, type: 'string'
    end
  end

  def self.search(query)
    Dictionary.__elasticsearch__.search(
      {
        query: {
          multi_match: {
            query: "#{query}&pretty",
            fields: ['title']
          }
        },
        sort: [{ title: {order:"asc"} }]        
      }
    )
  end
end

if Dictionary.__elasticsearch__.client.indices.index_exists?
  Dictionary.import # for auto sync model with elastic search
else
  Dictionary.__elasticsearch__.client.indices.delete index: Dictionary.index_name rescue nil
  # Create the new index with the new mapping
  Dictionary.__elasticsearch__.client.indices.create(index: Dictionary.index_name)
end


config/initializers/elastic_search.rb
Elasticsearch::Model.client = Elasticsearch::Client.new url: "http://localhost:9200/"
Dictionary.__elasticsearch__.client.indices.delete index: Dictionary.index_name rescue nil


config/elastic_config.yml Так же закинул его в директорию самого elasticsearch - elasticsearch/config

index:
  number_of_shards: 5
  number_of_replicas: 1 

  analysis:
    char_filter:
      ru:
        type: mapping
        mappings: ['Ё=>Е', 'ё=>е']
    analyzer:
      default_index:
        alias: [index_ru]
        type: custom
        tokenizer: nGram
        filter: [stopwords_ru, stop, custom_word_delimiter, lowercase, snowball, russian_morphology, english_morphology]
        char_filter: [ru]
      default_search:
        alias: [search_ru]
        type: custom
        tokenizer: standard
        filter: [stopwords_ru, stop, custom_word_delimiter, lowercase, snowball, russian_morphology, english_morphology]
        char_filter: [ru]
    tokenizer:
      nGram:
        type: nGram
        min_gram: 3
        max_gram: 20
    filter:
      stopwords_ru:
        type: stop
        stopwords: [а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я]
        ignore_case: true
      custom_word_delimiter:
        type: word_delimiter
        # "PowerShot" ⇒ "Power" "Shot", части одного слова становятся отдельными токенами
        generate_word_parts: true
        generate_number_parts: true  # "500-42" ⇒ "500" "42"
        catenate_words: true  # "wi-fi" ⇒ "wifi"
        catenate_numbers: false  # "500-42" ⇒ "50042"
        catenate_all: true  # "wi-fi-4000" ⇒ "wifi4000"
        split_on_case_change: true  # "PowerShot" ⇒ "Power" "Shot"
        preserve_original: true  # "500-42" ⇒ "500-42" "500" "42"
        split_on_numerics: false  # "j2se" ⇒ "j" "2" "se"
      snowball:
        type:     snowball
        language: Russian
  • Вопрос задан
  • 3341 просмотр
Подписаться 6 Оценить 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы