假设我有以下模型,并且我可以使用sunspot_rails
进行搜索。
class Case < ActiveRecord::Base
searchable do
end
end
Rails中Sunspot的标准schema.xml
将id
声明为索引字段。当我使用Web界面访问solr并测试查询时,查询如下:
http://localhost:8982/solr/select/?q=id%3A%22Case+15%22&version=2.2&start=0&rows=10&indent=on
搜索Cases
且id
等于Case 15
的工作正常并返回结果。
问题是当我在rails控制台中使用Sunspot Rails进行搜索时:
s = Case.search do
keywords('id:"Case 15"')
end
我明白了:
=> <Sunspot::Search:{:fl=>"* score", :rows=>10, :start=>0, :q="id:\"Case 15\"", :defType=>"dismax", :fq=>["type:Case"]}>
表明它正确地输入:q
正确的查询值,但点击数为0:
s.hits
返回
=> []
如果我们假设keywords
不相等且仅搜索text
字段(全文搜索)而不搜索冒号:
之前定义的字段,那么我可以尝试以下内容:
s = Case.search do
with(:id, "Case 15")
end
但是因太阳黑子异常而失败:
Sunspot::UnrecognizedFieldError: No field configured for Case with name 'id'
如何使用模型的索引标准solr / sunspot id
字段进行搜索?
为了使问题更有用,我如何通过id订购。以下不起作用:
s = Case.search do
keywords("xxxx")
order_by :id, :desc
end
不起作用。 Sunspot::UnrecognizedFieldError: No field configured for Case with name 'id'
答案 0 :(得分:4)
您正在谈论的ID是太阳黑子内部字段,不应直接使用。
为什么不添加自己的id字段(更改变量名称,以避免名称冲突):
class Case < ActiveRecord::Base
searchable do
integer :model_id {|content| content.id }
end
end
然后
s = Case.search do
keywords("xxxx")
order_by :model_id, :desc
end
其他(杂乱)选项是直接破解solr params:
s = Case.search do
keywords("xxxx")
adjust_solr_params(:sort, 'id desc')
end