2012-07-18 1 views
0

내 Rails 응용 프로그램에서 Thinking Sphinx에 심각한 문제가 있습니다. 다음과 같이 내 애플의 사양은 다음과 같습니다스핑크스를 생각하고 연관성을 가지고 필터링 하시겠습니까?

  • 레일 3.2.6
  • 루비 1.9.3
  • 스핑크스 2.0.4
  • 에서 스핑크스 2.0.12

생각 (r3135) 내 신청 나는 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 

가 그럼 난 pages는 검색 쿼리 및 조건에 따라 선택되어 Page 모델에서 검색을하고 있어요. 그러나 :with 필터를 사용하려고 할 때 스핑크스가 잘못된 결과를 보였습니다. 내가 예를 price 또는 width를 들어, 하나 개의 필터를 사용

, 결과는 내가 price and width처럼 필터를 조합하기 위해 노력하고있어하지만 때, OK이다, 나는 주어진 price 또는 width,하지와 이벤트를 포함하는 결과를 얻고있다 pricewidth.

범위로 검색 할 때는 대부분 :with 매개 변수가 정수 값이 아닌 범위입니다. 사용

편집 한
쿼리 메신저 :

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 제안의 가격 범위와 가격 범위가 같습니다.

+0

검색 통화를 게시 할 수 있습니까? –

+0

물론, 내 게시물을 편집했습니다. – skipi

답변

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)) 
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 
} 

제가 작업하고있는 프로젝트에서 조인 테이블을 사용하지 않습니다.하지만 그건 중요하지 않습니다. 인덱싱은 수행중인 조인을 제외하고는 동일합니다.

+0

예제 쿼리로 내 질문을 업데이트했습니다. – skipi