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 プロパティを使用して結果を提供していないことです。「名前」属性のみが検索されます。

私は開発者を持っています。いくつかのアーティストが含まれるデータベースには、文字列「Phil」が含まれていませんが、別名に「Phillip」が含まれています。試してみると、Artist.__elasticsearch__.search('phil').count0の結果が得られます。

私はArtist.all.__elasticsearch__.import取得しようとしました:

=> 0

そしてArtist.__elasticsearch__.refresh_index! 取得:

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

(2つのコマンドの違いはわかりません...)、しかし運はありません:/

私の問題は、文字列の配列をプロパティとして使用しているという事実から来ていますか? 別の方法でインデックスを作成する必要がありますか?

どんなアイデア/ヘルプも大歓迎です!

編集: 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 に答える