0

RailsアプリケーションのThinkingSphinxに深刻な問題があります。私のアプリの仕様は次のとおりです。

  • Rails 3.2.6
  • Ruby 1.9.3
  • Sphinx 2.0.4(r3135)
  • Thinking Sphinx 2.0.12

私のアプリケーションでは、PageモデルとOfferモデルpagesがあり、多くありoffersます。モデルで定義されたインデックスはPage次のようになります。

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から間違った結果が返されました。

たとえばprice、またはの1つのフィルターのみを使用するwidthと、結果はOKですが、のようにフィルターを組み合わせようとすると、 ANDではなく指定されたORprice and widthを持つオファーを含む結果が得られます。pricewidthpricewidth

範囲で検索しているとき、ほとんどの時間: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]}

それでも、すべてのオファーがその範囲の高さを持っているか、すべてのオファーがその範囲の幅を持っているか、価格と同じものであるページ表示されます

4

2 に答える 2

1

わかりました、解決策を見つけました。スフィンクスが私に間違った結果を与えた理由は、彼がすべてのオファーを単一のページ内に集約していたためです。インデックスをページからオファーに移動する必要がありましたが、クエリは意図したとおりに機能するようになりました。オファーの私のインデックスは次のようになります。

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_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))
于 2012-07-19T09:36:45.877 に答える
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
}

私が取り組んでいるプロジェクトでは、結合テーブルを使用していませんが、それは問題ではありません。結合が実行されることを除いて、インデックス付けは同じです。

于 2012-07-18T14:22:50.927 に答える