我已经设置了一些索引,一切似乎都运行良好,直到我想尝试将结果排序。我有几个模型,但我定义我的索引的是“医生”。我这样定义它们:
class SearchController < ApplicationController
define_index do
indexes :firstname, :sortable => true
indexes :lastname, :sortable => true
indexes :sex, :sortable => true
indexes practice(:name), :as => :practice_name, :sortable => true
indexes practice(:address), :as => :practice_address, :sortable => true
# Added after denormalization
indexes county(:name), :as => :county
indexes municipality(:name), :as => :municipality
# Can only filter on integers, thus CRC32-ing
has "CRC32(sex)", :as => :sex_filter, :type => :integer
end
end
搜索似乎工作正常。当尝试对任何属性进行排序时,我会收到类似以下
的错误index employee_core:未找到排序依据属性'firstname'
对于名字,姓氏和性别。我可以通过添加
来部分“解决”这个问题有名字,姓氏,性别
到define_index
块,但我不知道如何对其他模型(练习)的引用做同样的事情,或者甚至可能。
任何人一开始都知道我可能做错了什么导致:sortable => true
不起作用,或者我如何定义练习作为属性的引用?
我正在以一种上述方式失败的Thinking Sphinx调用的一个例子:
ThinkingSphinx.search "<some search string>", {:with=>{}, :order=>:firstname, :sort_mode=>:desc, :page=>1}
答案 0 :(得分:3)
所以,这里的问题是Sphinx字段根本不可排序。思考Sphinx通过添加:sortable
选项来解决这个问题 - 它添加了一个具有相同名称和_sort后缀的属性 - 所以,在此示例中为firstname_sort
。
当您在单个模型(Employee.search
)上搜索时,Thinking Sphinx可以引用该模型并查看哪些字段是可排序的,并自动将firstname切换为firstname_sort。但是,您正在全球搜索,因此没有简单的TS参考。因此,解决方法是使用完整的属性名称:
ThinkingSphinx.search "foo", :order => :firstname_sort, :sort_mode => :desc
另外:如果您要搜索所有索引模型,请确保所有索引定义中都存在过滤器和排序中使用的属性。
添加:对关联字段进行排序也可以正常工作,给出相同的警告。