2016-03-17 4 views
0

У меня есть equity_contracts стол, который имеет один user_contract и многие prices. EquityContract модель выглядит следующим образом:Как обрабатывать вложенные документы с помощью Searchkick и Rails?

class EquityContract < ActiveRecord::Base 
    validates_presence_of :ticker, :name, :country, :currency 

    has_one :user_contract, as: :contract 
    has_many :prices 

    searchkick 

    scope :search_import, -> { includes(:user_contract, :prices) } 

    def search_data 
    { 
     name: name, 
     ticker: ticker, 
     country: country, 
     user_id: user_contract.try(:user_id), 
     prices: prices.map do |price| 
     { 
      traded_on: price.traded_on.to_s, 
      close: price.close 
     } 
     end 
    } 
    end 
end 

UserContract, который выглядит следующим образом:

class UserContract < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :contract, polymorphic: true 
end 

Теперь я хочу, чтобы индексировать ключи (name, ticker, country, user_id, prices) в EquityContract так я бегу EquityContract.reindex.

Теперь, когда я пытаюсь сделать что-то вроде equity = EquityContract.search "APPL_US" я получаю Searchkick::Results объект, который выглядит примерно так:

[24] pry(main)> equity = EquityContract.search "APPL_US", limit: 1 
ETHON: performed EASY effective_url=http://127.0.0.1:9200/equity_contracts_development/_search response_code=200 return_code=ok total_time=0.101687 
    EquityContract Search (109.5ms) curl http://127.0.0.1:9200/equity_contracts_development/_search?pretty -d '{"query":{"dis_max":{"queries":[{"match":{"_all":{"query":"APPL_US","operator":"and","boost":10,"analyzer":"searchkick_search"}}},{"match":{"_all":{"query":"APPL_US","operator":"and","boost":10,"analyzer":"searchkick_search2"}}},{"match":{"_all":{"query":"APPL_US","operator":"and","boost":1,"analyzer":"searchkick_search","fuzziness":1,"prefix_length":0,"max_expansions":3}}},{"match":{"_all":{"query":"APPL_US","operator":"and","boost":1,"analyzer":"searchkick_search2","fuzziness":1,"prefix_length":0,"max_expansions":3}}}]}},"size":1,"from":0,"fields":[]}' 
=> #<Searchkick::Results:0x0000036f6915a0 
@klass= 
    EquityContract(id: integer, ticker: text, name: string, country: string, currency: string, created_at: datetime, updated_at: datetime), 
@options= 
    {:page=>1, 
    :per_page=>1, 
    :padding=>0, 
    :load=>true, 
    :includes=>nil, 
    :json=>false, 
    :match_suffix=>"analyzed", 
    :highlighted_fields=>[]}, 
@response= 
    {"took"=>99, 
    "timed_out"=>false, 
    "_shards"=>{"total"=>5, "successful"=>5, "failed"=>0}, 
    "hits"=> 
    {"total"=>3, 
    "max_score"=>0.005845671, 
    "hits"=> 
     [{"_index"=>"equity_contracts_development_20160317185615341", 
     "_type"=>"equity_contract", 
     "_id"=>"234", 
     "_score"=>0.005845671}]}}> 

Основной вопрос здесь, что я хотел бы видеть результаты индекса, как я сделал ранее, и увидеть результаты для полей (name, ticker, country, user_id, prices).

Когда я пытаюсь получить доступ к ElasticSearch через RESTful API:

curl http://127.0.0.1:9200/equity_contracts_development/_search\?pretty -d '{"query":{"filtered":{"query":{"match_all":{}},"filter":{"and":[{"not":{"filter":{"missing":{"field":"user_id","existence":true,"null_value":true}}}}]}}},"size":100,"from":0,"fields":[]}' 

я получаю результат, как:

{ 
    "took" : 54, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 207, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "64", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "83", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "90", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "127", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "139", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "590", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "608", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "622", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "658", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "665", 
     "_score" : 1.0 
    }, { 
     "_index" : "equity_contracts_development_20160317185615341", 
     "_type" : "equity_contract", 
     "_id" : "672", 
     "_score" : 1.0 
    }] 
    } 
} 

Как я могу видеть результаты, связанные отображенных объектов, как в prices? На данный момент equity.results возвращает массивы объекта activerecord EquityContract, а не индексированные атрибуты.

Я хочу вернуть атрибуты, указанные в EquityContract#search_data, и попытался equity.response['hits']['hits'] бит не включает необходимые атрибуты. Есть идеи?

ответ

1

Кажется, я должен был добавить load: false к #search что-то вроде:

equity = EquityContract.search "APPL_US", limit: 1, load: false 

Тогда я получить _source с ответом, который включает в себя атрибуты. Вы можете добавить source=true в HTTP-запрос, и вы должны получить полные атрибуты с ответом.

 Смежные вопросы

  • Нет связанных вопросов^_^