0

我刚刚开始在 Rails 中使用 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' 属性:

我有一个开发者。有几个艺术家的数据库,其中没有一个包含字符串“Phil”,但一个在其别名中有“Phillip”。当我尝试 aArtist.__elasticsearch__.search('phil').count我得到 0 结果。

我试过Artist.all.__elasticsearch__.import得到:

=> 0

Artist.__elasticsearch__.refresh_index! 得到:

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

(不确定这两个命令之间有什么区别......),但没有运气:/

我的问题是因为我使用字符串数组作为属性吗?我应该以不同的方式对其进行索引吗?

欢迎任何想法/帮助!

编辑:
我正在使用
gem 'elasticsearch-rails', '~> 0.1.7'
gem 'elasticsearch-model', '~> 0.1.7'

并且安装的 ElasticSearch 服务器是 1.7.1

4

1 回答 1

0

感谢Omarvelous 的评论,我得到了它的工作,区别在于 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 不是“唯一”数组中的符号):

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 Philip Jagger"], "get_tracks"=>[]}

但在 ES 中,情况就完全不同了!

如果有人有一个很好的链接来学习如何通过 Rails 请求 ES,我将不胜感激;)

再次感谢 Omarvelous ;)

于 2015-09-18T13:55:22.220 回答