首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序elasticsearch结果,elasticsearch-rails宝石,Rails

排序elasticsearch结果,elasticsearch-rails宝石,Rails
EN

Stack Overflow用户
提问于 2015-05-04 12:31:47
回答 2查看 3.4K关注 0票数 1

我开始在我的项目中使用Elasticsearh,结果排序有问题。

实际上,我需要按照连接( connected,belongs_to)模型中的hstore记录对记录进行排序。

更多详细信息:

所以,我有一个模型,我想成为可搜索的。该模型与另一个模型有关联,这里的代码是:

代码语言:javascript
复制
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:

  • *代码:string

模式国家

  • :title_translations :hstore

模型域

  • :title_translations :hstore

模型城市

  • :title_translations :hstore

模型PropertyObjectDescription

  • :title_translations :hstore
  • :main_text_translations :hstore

模型PropertyObjectParameterPack

  • 价格:hstore (示例:{min => 10,max=>100})

为了完成这项工作,我创建了可搜索的关注点,并将其添加到我的模型PropertyObject中。这里是它的代码:

代码语言:javascript
复制
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

控制器部分,其中搜索正在调用

代码语言:javascript
复制
def search
    pagen = params[:page] || 1
    @property_objects = PropertyObject.search(params[:q]).page(pagen).records

end

所以,现在寻找工作,一切似乎都很好。但我需要按min 排序搜索结果。

我有尝试订单的方法,在我的另一个订单工作-但没有运气。

据我所知,我需要使用Elasticsearch排序,以获得已经排序的结果--但需要花费大量时间来实现这一点,否则就会失败。

你能给我什么建议?

UPDATE尝试了以下代码:

代码语言:javascript
复制
 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

  • 按:价格
  • 由:price.min
  • 按:价格:最低
  • 由:property_object_parameter_pack.price.min
  • 由:property_object_parameter_pack.price:min

也没有点东西的运气。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 14:37:33

最后,我决定了解Elasticsearch是如何工作的,并开始阅读Elasticsearch:权威指南--答案是在哪里建立的。

首先,我建议阅读本指南并安装漫威。之后,这一切变得更加清晰,比使用卷曲。实际上,我使用Marvel发现了我的索引结构,并将其实现为elasticsearch宝石的搜索查询。

接下来,我将价格从hstore重新构建为独立的整数列:比如price_min和price_max。简单地说,答案代码是:

代码语言:javascript
复制
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帮助自动完成)。

票数 2
EN

Stack Overflow用户

发布于 2015-05-04 13:01:32

你试过这个吗?

代码语言:javascript
复制
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
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30030264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档