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;)