1

我正在使用 Algolia rails 构建搜索,但在动态排序时遇到困难。例如,用户可以从下拉列表中选择按价格升序或降序排序。

这是我定义索引的模型

class Product < ActiveRecord::Base
  include AlgoliaSearch

  algoliasearch per_environment: true, if: :publishable? do
    attribute :id, :name, :description, :seller_id, :condition, :location, :slug, :status, :city, :state, :stock_quantity,
      :shipping_method, :price
    attribute :created_at_i do
      created_at.to_i
    end
    attribute :updated_at_i do
      updated_at.to_i
    end
    attribute :price do
      price.to_f
    end
    attributesToIndex ['name', 'unordered(description)', 'seller_id',
      'condition', 'location', 'slug', 'created_at', 'updated_at', 'status',
      'geo(city)', 'geo(state)']
    geoloc :latitude, :longitude
    numericAttributesToIndex ["price", "stock_quantity"]
    attributesForFaceting ['price', 'condition', 'shipping_method']
  end

和产品控制器

def index
queries = { hitsPerPage: 5, page: params[:page].to_i, facets: '*',
      facetFilters: [
        "condition: #{params[:condition]}",
        "shipping_method: #{params[:shipping_method]}"
      ],
      numericFilters: [
        "price:#{params[:min_price] || 0} to #{params[:max_price] || 999999999999999}"
      ],
      sortBy: ["asc(price)"]
    }

    if latLng.present?
      queries[:aroundLatLng] = latLng
      queries[:aroundRadius] = radius
    end


    @response = Product.search(params[:query],queries)

Algolia 返回错误“无效参数 sortBy”。我试图搜索 algolia 文档,但找不到任何信息。感谢您的帮助。

4

1 回答 1

2

以下是 Algolia 网站上的相关文档页面列表,可帮助您了解 Algolia 排名的工作原理:

  • [开始] 调整排名和相关性

    我们的引擎之所以这么快,是因为每个索引都有自己的设置和排名。这意味着您可以通过将数据存储在多个索引中来创建不同的可搜索属性集和属性排名相关性。这是使用与主索引无缝同步的从索引来完成的。然后可以使用自己的一组业务指标配置每个从属索引,以调整相关性计算。

    索引具有无法更改的特定排名公式。但是,您可以通过使用具有不同排名公式的从属索引轻松克服此限制。

  • [教程][排名公式] 平局算法
    [常见问题] Algolia 的平局算法是如何工作的?
    这两个链接将帮助您了解 Algolia 的排名如何运作以及如何调整它。基本上,根据您的用例,在文本相关性之前按价格排序并没有真正意义。因此,根据您的用例,您可能只想将您的 to 更改customRankingprice,或者您可能希望price在排名公式的顶部添加您的属性。

  • [常见问题] 什么是从属索引,它们有什么好处?
    最后一个链接更深入地解释了 Algolia 的“从属索引”是什么。
  • [Rails 文档] 多种排序标准
    [Rails GitHub 文档] 主/从
    在这些最后的链接中,您将找到使用 Algolia 的具有多个从属的 Rails 客户端的代码示例。第一个实际上准确地展示了您的用例:按价格排序。

考虑到所有这些,最后,您只是希望将这些添加到您的模型中(如果您想使用这种customRanking方式):

add_slave 'Product_by_price_asc', per_environment: true do
  customRanking ['asc(price)']
end

add_slave 'Product_by_price_desc', per_environment: true do
  customRanking ['desc(price)']
end

然后在您的控制器中,您可以通过这种方式查询它们

query_params = { slave: "Product_by_price_#{params[:sort_order]}", hitsPerPage: 5, ... }
Product.search params[:query], query_params

您可能还应该在前端执行此实现,以便能够充分利用 Algolia 的即时搜索功能,请参阅[FAQ] 从前端或后端搜索

于 2016-01-15T10:54:39.707 回答