【问题标题】:ThinkingSphinx::OutOfBoundsError configuration confusionThinkingSphinx::OutOfBoundsError 配置混乱
【发布时间】:2018-06-13 07:27:52
【问题描述】:

由于误解了正确的配置语法(这也可能是旧语法的副产品)而导致出现 OutOfBoundsError。

manual 建议使用 WillPaginate 样式参数进行类搜索。有很多领域可供借鉴,模型定义为

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 定义一个单独的类?如果没有,应该在哪里调用 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 链接指向不同的 Sphinx 项目(专注于文档而非全文搜索的项目)。

标签: thinking-sphinx


【解决方案1】:

我不确定BaseSearchset_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"
)

【讨论】:

  • 问题已更新,因为语义被遗留 [ahem] 思维混淆了......
  • 解决您更新后的问题:您可以将 Azienda.search 调用用作单个调用来替换您之前的三行。因此,搜索调用可以分配给@aziendas 实例变量。
  • 奇怪的是我已经尝试过了。但是页面符号出现undefined local variable or method 'params' 错误...
  • 这是在你的控制器里吗?我希望参数在那里存在。
  • 不,那是在继承自 BaseSearch 的模型中。我已将逻辑完全移至控制器,添加了:terms =&gt; params[:azienda_search][:terms],控制台读数返回Parameters: {"utf8"=&gt;"✓", "azienda_search"=&gt;{"terms"=&gt;"pinerolo"}},但Sphinx 查询不是很有选择性Sphinx Query (92.2ms) SELECT * FROM 'azienda_core' WHERE 'sphinx_deleted' = 0 LIMIT 0, 100 OPTION max_matches=100000 并返回所有记录。分页和排序功能如愿。注意:@aziendas = Azienda.search params[:azienda_search][:terms] ( [...] 会产生语法错误。
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 2011-01-13
  • 2017-05-22
  • 1970-01-01
  • 2015-12-13
  • 2014-06-15
  • 2019-09-06
  • 2013-01-15
相关资源
最近更新 更多