思考狮身人面像,过滤与关联?

时间:2012-07-18 13:15:51

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

我的Rails应用程序中的Thinking Sphinx存在严重问题。我的应用程序规范如下:

  • Rails 3.2.6
  • Ruby 1.9.3
  • Sphinx 2.0.4(r3135)
  • 思考Sphinx 2.0.12

在我的应用程序中,我有一个Page模型和一个Offer模型,pages有很多offersPage模型中定义的索引如下所示:

define_index do

  #other indexes defined here
  #...

  has offers.width, as: :offers_width
  has offers.height, as: :offers_height
  has offers.price, as: :offers_price

  set_property delta: true
end

然后我在Page模型上进行搜索,根据搜索查询和条件选择pages。但是,当我尝试使用:with过滤器时,Sphinx给了我错误的结果。

当我只使用一个过滤器时,例如pricewidth,结果就可以了,但是当我尝试组合过滤器时,例如price and width,我得到了包含给定pricewidth,而非pricewidth的优惠的结果。

当我使用范围搜索时,大多数时间:with参数是范围而不是整数值。

编辑1
使用以下方式查询:

Page.search Riddle.escape(query), conditions: conditions, with: has_cond, star: true, per_page: Page.per_page, page: page

其中 has_cond 是:

{:offers_height=>[175..200], :offers_width=>[175..200], :offers_price=>[10..80]}

它仍然为我提供了 ANY 商品在该范围内的高度或 ANY 商品的宽度为价格范围或相同的东西。

2 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案。 sphinx给我错误结果的原因是因为他在单页内汇总了所有优惠。我不得不将索引从页面移动到商品,现在查询按预期工作。我提供的索引如下:

define_index do

  indexes page(:description), as: :page_description
  indexes page(:address), as: :page_address
  indexes page(:title), as: :page_title
  indexes page(:status), as: :page_status
  indexes page.tags(:name), as: :page_tags_name
  indexes page.category(:id), as: :page_category_id
  indexes page.country(:id), as: :page_country_id
  indexes page(:verified), as: :page_verified

  has page(:id), as: :page_id
  has :width
  has :height
  has :price
end

我需要先查询sphinx,然后再进行活动记录查询。

@sphinx_query = Offer.search Riddle.escape(query), with: has_cond, 
    conditions: conditions, group_function: :attr, group_by: 'page_id', 
    star: true, per_page: Page.per_page, page: page
@pages = Page.find(@sphinx_query.map(&:page_id))

答案 1 :(得分:0)

我相信错误将出现在您的搜索查询中。我只是运行了一些测试,一切都按预期工作......范围和没有。

控制器中的搜索代码:

@titles = Title.search(params[:q], 
                              :rank_mode => :bm25,
                              :match_mode => :any,
                              :star => true,
                              :limit => 35,
                              :with_all => {
                                :runtime => [75..100],
                                :year => 1976
                              })

索引代码:

class Title < ActiveRecord::Base
    ...
    define_index do
      # fields
      indexes clean_name, :sortable => true
      # attributes
      has id, year, runtime, created_at, updated_at
    end
    ...
end

搜索结果(JSON)

{
    resultList: [
        {
            director: "Allan Arkush, Joe Dante",
            id: 34089,
            name: "Hollywood Boulevard",
            rating: "R",
            runtime: 83,
            year: 1976,
            text: "Hollywood Boulevard (1976)",
            identify: "title"
        },
        {
            director: "Patrick M. Wright",
            id: 40875,
            name: "Hollywood High",
            rating: "R",
            runtime: 81,
            year: 1976,
            text: "Hollywood High (1976)",
            identify: "title"
        }
    ],
    resultCount: 2
}

对于我正在进行的项目,它不使用连接表 - 但这不重要。除了正在执行的连接之外,索引仍然相同。