【问题标题】:Sunspot Rails to order search results by model id?Sunspot Rails 按模型 ID 排序搜索结果?
【发布时间】:2011-10-09 07:52:58
【问题描述】:

假设我有以下模型,并且我已使用 sunspot_rails 使其可搜索。

class Case < ActiveRecord::Base
  searchable do
  end
end

Rails 中 Sunspot 的标准 schema.xmlid 声明为索引字段。当我使用 Web 界面访问 solr 并测试查询时,查询如下:

http://localhost:8982/solr/select/?q=id%3A%22Case+15%22&version=2.2&start=0&rows=10&indent=on

id 等于Case 15 的情况下搜索Cases 可以正常工作并返回结果。

问题是当我在 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'

【问题讨论】:

    标签: sunspot sunspot-rails


    【解决方案1】:

    你说的id是Sunspot内部字段,不应该直接使用。

    为什么不添加自己的 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
    

    【讨论】:

    • 自从我发布这个问题已经有很长时间了,同时,我已经实施了一个解决方法,这类似于你关于添加我自己的 id 字段的第一个建议。但是我添加的是id,如下所示:class Case &lt; ActiveRecord::Base searchable do integer :id end end 这是一种解决方法,因为它创建了另一个可索引字段“id_i”。有人必须告诉我为什么,如果不是,或者如何,如果是,我可以使用原始 id 来订购。
    • 你的两个问题都在我的回复中得到了回答 :) 1. 为什么不:因为它是太阳黑子使用的内部字段,所以你不应该使用它或对它做出假设,因为它会破坏封装原理(同样,随着新版本的太阳黑子,它的含义或它的实现可以完全改变) 2.如果你真的想使用它,请看我回答的最后一部分。
    • 我确实发现你的帖子很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多