У меня есть 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']
бит не включает необходимые атрибуты. Есть идеи?