我需要使用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。
答案 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将它们视为整数集合,因此您的过滤器也更简单。