ElasticSearch не использует все поля (массив строк) для поиска

Я только начинаю с ES в рельсах, и я добавил кое-что, что я не понимаю:

У меня есть модель Artist (упрощенно для примера):

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

  # simplified to get the idea
  def get_aliases
    ["alias1", "alias2"]
  end

  def as_indexed_json(options = {})
   self.as_json({
    methods: [ :get_aliases, :get_tracks ],
    only: [ :name, :get_aliases],
    include: { 
     get_tracks: { only: :name } },
   })
  end
end

Моя проблема в том, что ES-поиск не использует свойство get_aliases для выдачи результатов: ищется только атрибут 'name':

У меня есть разработчик база данных, в которой есть несколько исполнителей, ни у одного из которых нет строки "Фил", но у одного есть псевдоним "Филипп". Когда я пытаюсь Artist.__elasticsearch__.search('phil').count Я получаю 0 результат.

я пытался Artist.all.__elasticsearch__.import получение:

=> 0

а также Artist.__elasticsearch__.refresh_index! получение:

=> {"_shards"=>{"total"=>10, "successful"=>5, "failed"=>0}}

(не уверен, в чем разница между 2 командами...), но не повезло:/

Моя проблема связана с тем, что я использую массив строк в качестве свойства? Должен ли я индексировать это по-другому?

Любая идея / помощь приветствуется!

РЕДАКТИРОВАТЬ:
я использую
gem'asticsearch-rails ',' ~> 0.1.7 '
gem'asticsearch-model', '~> 0.1.7'

и установлен сервер ElasticSearch 1.7.1

1 ответ

Решение

Благодаря содержательному комментарию, я получил его, разница в методе as_indexed_json:

def as_indexed_json(options = {})
  self.as_json({
    methods: [ :get_aliases, :get_tracks ],
    only: [ :name, :get_aliases],
    include: { 
     get_tracks: { only: :name } },
   })
end

Должно быть (обратите внимание, что get_aliases НЕ является символом в массиве "only"):

def as_indexed_json(options = {})
  self.as_json({
    methods: [ :get_aliases, :get_tracks ],
    only: [ :name, get_aliases],
    include: { 
     get_tracks: { only: :name } },
   })
end

Обе реализации (символы или реальный метод) приведут к одному и тому же результату в консоли:

irb(main):016:0> Artist.find(7).as_indexed_json
=> {"name"=>"Mick Jagger", "get_aliases"=>["Michael Phillip Jagger"], "get_tracks"=>[]}

Но в ES это совсем другая история!

Если бы кто-нибудь в качестве хорошей ссылки научился запрашивать ES через Rails, я был бы отличным;)

Еще раз спасибо Omarvelous;)

Другие вопросы по тегам