ThinkingSphinx::OutOfBoundsError 配置混乱
ThinkingSphinx::OutOfBoundsError configuration confusion
由于误解了正确的配置语法(这也可能是遗留语法的副产品)而导致 OutOfBoundsError。
manual 建议采用 WillPaginate 样式参数的 Class 搜索。有许多字段可供提取,模型定义为
class AziendaSearch < BaseSearch
set_per_page 10000
accept :terms
end
set_per_page 被放在高级别,因为如果我将它设置为 100 的目标,will_paginate 链接就不会显示。
控制器可能过于复杂以包含排序参数,因此导致两步过程:
@azienda_search = AziendaSearch.new params
@results = @azienda_search.search
@aziendas = Azienda.order('province_id ASC').where('id IN (?)', @results).paginate :page => params[:page], :per_page => 100
视图在@aziendas 的基础上分页:
<%= will_paginate @aziendas, :previous_label => "precedente ", :next_label => " successiva" %>
我怀疑搜索模型设置不正确,但根据手册的指示,语法对我来说并不明显。 page params[:page]
肯定不行...
更新
BaseSearch
是一个 Sphinx method,实际上是从该应用程序的旧版本 (rails2.x...) 继承而来的。所以这可能会造成各种语法混乱。
事实上,按照手册,我现在完全不确定如何最好地做出这些陈述。是否应该为 AziendaSearch 定义单独的 class ?如果不是,应该在哪里调用 Azienda.search
块...在控制器中?
@azienda_search = Azienda.search(
:max_matches => 100_000,
:page => params[:page],
:per_page => 100,
:order => "province_id ASC"
)
@results = @azienda_search.search
我不确定 BaseSearch
对 set_per_page
做了什么(这肯定不是 Thinking Sphinx 方法),但值得注意的是 Sphinx 默认最多 1000 条记录。 It is possible to configure Sphinx to return more,但是 - 您需要将 config/thinking_sphinx.yml
中的 max_matches 设置为您的首选限制(每个环境):
production:
max_matches: 100000
并对相关搜索请求设置限制:
Azienda.search(
:max_matches => 100_000,
:page => params[:page],
:per_page => 100
)
至于双重查询……如果您在索引定义中添加 province_id
作为属性,您将能够 order search queries 通过它。
# in your Azienda index definition:
has province_id
# And then when searching:
Azienda.search(
params[:azienda_search][:terms],
:max_matches => 100_000,
:page => params[:page],
:per_page => 100,
:order => "province_id ASC"
)
由于误解了正确的配置语法(这也可能是遗留语法的副产品)而导致 OutOfBoundsError。
manual 建议采用 WillPaginate 样式参数的 Class 搜索。有许多字段可供提取,模型定义为
class AziendaSearch < BaseSearch
set_per_page 10000
accept :terms
end
set_per_page 被放在高级别,因为如果我将它设置为 100 的目标,will_paginate 链接就不会显示。
控制器可能过于复杂以包含排序参数,因此导致两步过程:
@azienda_search = AziendaSearch.new params
@results = @azienda_search.search
@aziendas = Azienda.order('province_id ASC').where('id IN (?)', @results).paginate :page => params[:page], :per_page => 100
视图在@aziendas 的基础上分页:
<%= will_paginate @aziendas, :previous_label => "precedente ", :next_label => " successiva" %>
我怀疑搜索模型设置不正确,但根据手册的指示,语法对我来说并不明显。 page params[:page]
肯定不行...
更新
BaseSearch
是一个 Sphinx method,实际上是从该应用程序的旧版本 (rails2.x...) 继承而来的。所以这可能会造成各种语法混乱。
事实上,按照手册,我现在完全不确定如何最好地做出这些陈述。是否应该为 AziendaSearch 定义单独的 class ?如果不是,应该在哪里调用 Azienda.search
块...在控制器中?
@azienda_search = Azienda.search(
:max_matches => 100_000,
:page => params[:page],
:per_page => 100,
:order => "province_id ASC"
)
@results = @azienda_search.search
我不确定 BaseSearch
对 set_per_page
做了什么(这肯定不是 Thinking Sphinx 方法),但值得注意的是 Sphinx 默认最多 1000 条记录。 It is possible to configure Sphinx to return more,但是 - 您需要将 config/thinking_sphinx.yml
中的 max_matches 设置为您的首选限制(每个环境):
production:
max_matches: 100000
并对相关搜索请求设置限制:
Azienda.search(
:max_matches => 100_000,
:page => params[:page],
:per_page => 100
)
至于双重查询……如果您在索引定义中添加 province_id
作为属性,您将能够 order search queries 通过它。
# in your Azienda index definition:
has province_id
# And then when searching:
Azienda.search(
params[:azienda_search][:terms],
:max_matches => 100_000,
:page => params[:page],
:per_page => 100,
:order => "province_id ASC"
)