thinking-sphinx分页查询0错误:偏移越界,max_matches

时间:2014-05-15 07:12:44

标签: ruby-on-rails ruby sphinx thinking-sphinx

我有TS 3.0.6,will_paginate 3.0.5和sphinx 2.0.4

我使用页面选项对搜索结果进行分页:

@products = Product.search(query_string, {
  order: ordering,
  ranker: :bm25,
  sql: { include: :images },
  with: {
    price_type_for_search => min_price_conditions..max_price_conditions,
    kind_cd: @params[:kind_cd],
    brand_id: [*@params[:brand_ids]],
    category_ids: categories_for_search,
    property_value_names: [*params[:property_value_names]].map{ |s| Zlib.crc32(s) },
  },
  page: @params[:page],
  per_page: @params[:per]
})

我收到错误

query 0 error: offset out of bounds (offset=12, max_matches=12); query 1 error: offset out of bounds (offset=12, max_matches=12); query 2 error: offset out of bounds (offset=12, max_matches=12); query 3 error: offset out of bounds (offset=12, max_matches=12)

其中12是@params [:per]值。

否则我在我的观点中使用will_paginate @products,但我认为这并不重要。为什么我收到错误?我怎么能避免它?

我将这些参数发送到搜索:

order: :created_at
ranker: :bm25,
sql: { include: :images },
with: {
  # no matter
},
page: 2,
per_page: 12

如果我发送per_page == 18& page == 2,然后我得到query 0 error: offset out of bounds (offset=18, max_matches=18) et.c.如果我发送per_page == 12& page == 3,我在错误中得到(offset=36, max_matches=36)

1 个答案:

答案 0 :(得分:1)

好的,我想我已经弄明白了。这里的问题是在上面的示例中调用了facets方法@products。 Facet调用不喜欢:page:per_page选项,因为构面调用只有一个页面。因此,查看两个或更多搜索结果页面会产生错误。

解决方法(我在本地测试)是将大多数搜索选项放在共享方法中:

def common_search_options
  {
    order: ordering,
    ranker: :bm25,
    with: {
      price_type_for_search => min_price_conditions..max_price_conditions,
      kind_cd: @params[:kind_cd],
      brand_id: [*@params[:brand_ids]],
      category_ids: categories_for_search,
      property_value_ids: [*params[:property_value_ids]],
    }
  }
end

然后为搜索结果和构面结果创建单独的对象:

@products = Product.search(query_string, common_search_options.merge({
  sql: { include: :images },
  page: @params[:page],
  per_page: @params[:per]
}))

@product_facets = Product.facets(query_string, common_search_options)

当然,您希望将@ products.facets的任何引用更改为@product_facets。这将确保方面搜索没有分页选项,现在一切都应该顺利进行。