思考Sphinx过滤has_many关联中的字符串字段

时间:2011-09-05 21:58:07

标签: ruby-on-rails thinking-sphinx

我需要使用Thinking Sphinx来过滤来自has_many关联的另一个表的字符串字段。

比如说学生有很多学位。 “gradu_year”,即所讨论的过滤器字段,位于度表中,必须是一个字符串(出于某些专有原因)。

根据Thinking Sphinx对字符串属性进行过滤的建议,我尝试按如下方式定义索引:

define_index do
  has "CRC32(degrees.graduation_year)", :as => :graduation_years, :type => :integer
end

我在运行索引时遇到此错误:

ERROR: index 'student_delta': sql_range_query: ERROR:  column "degrees.graduation_year" must appear in the GROUP BY clause or be used in an aggregate function

数据库是Postgres。

1 个答案:

答案 0 :(得分:1)

如果我们正在处理has_many,那么您将希望汇总该列的结果:

has "array_to_string(array_agg(CRC32(degrees.graduation_year)), ',')",
  :as => :graduation_years, :type => :multi

如果您使用的是早于8.4的PostgreSQL版本,请将array_agg切换为array_accum。前者是8.4及更高版本的一部分,速度更快。

然而,如果我们处理多年,那么无论如何它们都是整体的,所以为什么不改为:

has "array_to_string(array_agg(degrees.graduation_year), ',')",
  :as => :graduation_years, :type => :multi

不需要CRC值,Sphinx将它们视为整数集合,因此您的过滤器也更简单。