我开始在我的项目中使用Elasticsearh,结果排序有问题。
实际上,我需要按照连接( connected,belongs_to)模型中的hstore记录对记录进行排序。
更多详细信息:
所以,我有一个模型,我想成为可搜索的。该模型与另一个模型有关联,这里的代码是:
class PropertyObject < ActiveRecord::Base
belongs_to :country, :counter_cache => true
belongs_to :region, :counter_cache => true
belongs_to :city, :counter_cache => true
belongs_to :property_object_type, :counter_cache => true
belongs_to :property_object_state, :counter_cache => true
has_one :property_object_parameter_pack, dependent: :destroy
has_one :property_object_feature_pack, dependent: :destroy
has_one :property_object_description, dependent: :destroy
has_one :property_object_seo_field, dependent: :destroy
end我想在我的搜索结果中包括下一个字段:
模型PropertyObject:
模式国家
模型域
模型城市
模型PropertyObjectDescription
模型PropertyObjectParameterPack
为了完成这项工作,我创建了可搜索的关注点,并将其添加到我的模型PropertyObject中。这里是它的代码:
module Searchable
extend ActiveSupport::Concern
included do
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
mapping do
indexes :property_object_parameter_pack, type: 'nested' do
indexes :price do
indexes :min, type: :integer
end
end
end
# Customize the JSON serialization for Elasticsearch
def as_indexed_json(options={})
self.as_json(
include: {
country: {only: :title_translations},
region: {only: :title_translations},
city: {only: :title_translations},
property_object_description: {only: [:title_translations, :main_text_translations]},
property_object_parameter_pack: {only: [:price, :area, :rooms]}
})
end
end
end控制器部分,其中搜索正在调用
def search
pagen = params[:page] || 1
@property_objects = PropertyObject.search(params[:q]).page(pagen).records
end所以,现在寻找工作,一切似乎都很好。但我需要按min 排序搜索结果。
我有尝试订单的方法,在我的另一个订单工作-但没有运气。
据我所知,我需要使用Elasticsearch排序,以获得已经排序的结果--但需要花费大量时间来实现这一点,否则就会失败。
你能给我什么建议?
UPDATE尝试了以下代码:
pagen = params[:page] || 1
query = params[:q]
params[:order] ||= 'asc'
property_objects = PropertyObject.search(query) do |s|
s.query do |q|
q.string query
end
s.sort { by :property_object_parameter_pack.price.min, params[:sort]}
end
@property_objects = property_objects.page(pagen).records有不同的变体
s.sort by
也没有点东西的运气。
发布于 2015-05-13 14:37:33
最后,我决定了解Elasticsearch是如何工作的,并开始阅读Elasticsearch:权威指南--答案是在哪里建立的。
首先,我建议阅读本指南并安装漫威。之后,这一切变得更加清晰,比使用卷曲。实际上,我使用Marvel发现了我的索引结构,并将其实现为elasticsearch宝石的搜索查询。
接下来,我将价格从hstore重新构建为独立的整数列:比如price_min和price_max。简单地说,答案代码是:
sq = {
"query": {
"multi_match": {
"query": "Prague",
"fields": [ "country.title_translations.en",
"region.title_translations.en",
"city.title_translations.en",
"property_object_description.main_text_translations.en",
"property_object_description.title_translations.en"
]
}
},
"track_scores": true,
"sort": {
"property_object_parameter_pack.price_min":
{ "order": "desc",
"missing" : "_last"
}
}} PropertyObject.search (sq)事实上,我确信它将与hstore一起工作。因为我将翻译存储在hstore中,而且它的索引很好--只需要指向右字段(在这个任务中,Marvel帮助自动完成)。
发布于 2015-05-04 13:01:32
你试过这个吗?
def search
options = { :page => (params[:page] || 1) }
@property_objects = PropertyObject.search, options do |f|
f.query { string params[:q] }
f.sort { by :price, 'desc' }
end
@property_objects.records
endhttps://stackoverflow.com/questions/30030264
复制相似问题