Как настроить elasticsearch под RoR?

Подскажите как правильно настроить elastic.

исходники:
#model Products
class Product < ApplicationRecord
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
  include ElasticMyAnalyzer

  settings ES_SETTING do
    mappings dynamic: 'true' do
      indexes :title, type: 'string', analyzer: 'my_analyzer', fielddata: true
      indexes :description, type: 'string', analyzer: 'my_analyzer'
      indexes :searching, type: 'boolean'
    end
  end
end


module ElasticMyAnalyzer
  ES_SETTING = {
    index: {
      number_of_shards: 2
    },
    analysis: {
      filter: {
        my_stopwords: {
          type: 'stop',
          stopwords: 'а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я'
        },
        mynGram: {
          type: 'ngram',
          min_gram: 4,
          max_gram: 8
        }
      },
      analyzer: {
        my_analyzer: {
          type: 'custom',
          tokenizer: 'standard',
          filter: [
            'lowercase', 'russian_morphology', 'my_stopwords'
            # 'lowercase', 'russian_morphology', 'my_stopwords', 'mynGram'
          ]
        }
      }
    }
  }
end


class SearchesController < ApplicationController
  def index
    @query = params[:q]
    @response_query = Product.search(search_query(@query)).records
    @response_query = @response_query.paginate(page: params[:page], per_page: 16)
  endx

  def search_query(query)
    {
      query: {
        bool: {
          must: {
            multi_match: {
              query: query,
              fields: ['title', 'description'],
              operator: 'and'
            }
          },
          filter: [
            {
              # term: { searching: true } 
            }
          ]
        }
      },
      sort: [
        {
          title: { order: 'asc' }
        }
      ]
    }
  end
end


в итоге при существующих настройках: ищет только целые слова. выводит макс. 10 результатов. криво сортирует.

хочу хороший умный поиск. настроить чтоб подсвечивал в title найденное совпадение, сортировал правильно по алфавиту, выводил все результаты и искал от 3 букв - тут в принципе справляется nGram (но мне не совсем нравится как он работает, уж очень много выдает не нужных результатов, если подключать поиск в description ваще жесть), поэтому как можно без него обойтись?
и как можно поставить поиск по title в приоритет. т.е. если в title есть совпадение то в description не искать?
и напоследок )) как прикрутить живой поиск ко всему этому.

+100 к вашей карме )
  • Вопрос задан
  • 278 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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