如何在思维狮身人面像杆中进行多面搜索

问题描述 投票:0回答:1

在我的应用中使用thinking-sphinx作为方面,并定义两个方面priceyear

我想获取构面嵌套的结果。

现在我每年都在获取方面,它与年份相对应。

years = records[:year]

连同记录数以及年份,我也想获得该年的最低价格。

现在我得到它了

years.map do |year,count|
     price = Data.where(:year=>year).minimum(:price)
     {count: count,cheapest_price: price}
end

但是它像LazyLoading一样是N + 1。我想在一年内获取价格。

有什么办法吗?

ruby-on-rails ruby sphinx facet thinking-sphinx
1个回答
0
投票

思考该代码可以实现您想要的功能-尽管您可能需要进行一些调整才能准确获得所需的内容:

Data.search(
  :select => "groupby() AS year, MIN(price) as min_price, count(DISTINCT sphinx_internal_id) as count",
  :group_by => :year,
  :max_matches => 1000,
  :middleware => ThinkingSphinx::Middlewares::RAW_ONLY
)

每个选项说明:

  • select指定要遵循的适当聚合,groupby()是引用此查询分组依据的属性的函数。
  • group_by指定您要查询分组的属性。 Sphinx在SQL中等同于GROUP BY,尽管在过去它受到了更大的限制。
  • max_matches应该设置为1000,除非您已在Sphinx配置中将其配置为更高的值(通过config/thinking_sphinx.yml)。使用尽可能高的值可确保构面结果扫描尽可能多的文档。您还可以为要返回的特定行数将:limit设置为相同的值。
  • [middleware使用有限的Think Sphinx中间件类集,以避免将结果转换为ActiveRecord对象-相反,您将获得带有Sphinx查询数据的哈希数组。
© www.soinside.com 2019 - 2024. All rights reserved.