2013-07-24 4 views
4

다음 쿼리는 마법처럼 작동 :태양 흑점 SOLR의 전체 텍스트 검색 및 will_paginate

@styles = Style.search { fulltext params[:q] } 

난 데 문제는 페이지 매김과 함께합니다. 다음은 페이지 매김을 사용한 동일한 검색어입니다.

@styles = Style.search { fulltext params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] } 

나는레코드를 가지고 있습니다.

내가 11 레코드를 검색 할 때 나는 :page => 1:per_page => 10이있는 경우

, 나는 내가 :page=>2을 설정하고 내가 11 스타일의 레코드를 가져 동일한 검색을 할 경우는 하늘의 배열이 @styles.results

반환받을.

[11] pry(#<StylesController>)> params[:page]=2 
=> 2 
[12] pry(#<StylesController>)> x=Style.search {fulltext params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] } 
=> <Sunspot::Search:{:fq=>["type:Style"], :q=>"hel", :fl=>"* score", :qf=>"name_textp full_name_textp", :defType=>"dismax", :start=>10, :rows=>10}> 
[13] pry(#<StylesController>)> x.results 
=> [#<Style id: 15...>] 

나는 점이

여기 무슨 일이야 자신의 전체 검색 결과가 아닌 실제 기록을 쪽수를 매기다라고 생각이며 어떻게 해결합니까?

확인 편집, 날이 다른 방법을 설명 해보자. 이제 나는이 여섯 개 기록이 있다고 가정 해 봅시다 :

1 => 'a' 
2 => 'b' 
3 => 'c' 
4 => 'd' 
5 => 'e' 
6 => 'f' 

의 난 'F'

Letter.search { fulltext 'f'; paginate :page => 1, :per_page => 5 } 

내 결과가 될 것입니다 하늘의 배열 이제 []

의 내가

을하려고 생각한를 검색하려고한다고 가정 해 봅시다
Letter.search { fulltext 'f'; paginate :page => 1, :per_page => 6 } 

내 결과는 [6 => 'f']

입니다.
+0

설명에서 제어부

@search = User.search do with :name, 'joe' end 

에서

내게 조금 복잡하다. "매력처럼 작동 할 때"의 결과를 넣을 수 있습니까? 기본 페이지 크기에 따라 상당히 다를 수 있습니다. 데이터를 보면 모든 것이 합리적이라고 보입니다. 당신이 뭘 잘못 생각하니? – polmiro

+0

귀하의 매개 변수가 귀하가 생각하는 것과 다르다고 생각합니다. 이상한 매개 변수없이 결과를 출력 할 수 있습니까? – mathieugagne

+0

모델의 색인은 어떻게 작성합니까? fulltext는 마술 적이 지 않습니다. 검색하려는 필드를 전달해야하며 검색 가능한 블록에서 텍스트를 'index'로 색인화해야합니다. 그 정보를 보여줄 수 있습니까? – mathieugagne

답변

9

내 생각 :

이 같은 SOLR의 결과가 다음을 반환 SOLR IDS에서 모델을 검색하고 페이지를 매기는 무언가를 얻을 :


@search = Sunspot.search(Snippet) do 
    fulltext params[:search] 
end 
@styles = Style.where(id: @search.results.map(&:id)).page(params[:page]).per(5) 
내가 문서에서 이해 무엇 :
나는하지 않았다 그것을 시도했다

기본적으로 Sunspot은 Solr로부터 처음 30 개의 결과를 요청한다. 이에

search = Style.search do 
    fulltext "my cool style" 
    paginate :page => 2 
end 

: 그것은 당신이 검색 기준과 일치 할 수 있습니다 기록 (100)을 가질 수 있지만, 당신은 당신처럼, 당신의 SOLR 검색에 PAGINATE을 추가해야 다른 사람을보고, 첫 번째 (30)를 볼 수 있습니다 의미 경우 2 페이지에 액세스 할 수 있어야합니다.

search = Style.search do 
    fulltext "my cool style" 
    paginate :page => 1, :per_page => 50 
end 

그것은 당신에게 50 개 한 페이지에 결과 또는 paginate :page => 2, :per_page => 50을 제공해야하며, 결과는 최대 50 결과 각각 2 개 페이지에 구분되어야한다 : 태양 흑점의 수를 업데이트하려면하면 작성해야합니다 요청합니다.

+0

도와 주셔서 감사합니다. 갑자기 예상대로 작동하지 않는 이유가 무엇인지 잘 모르겠습니다. 이전에는 per_page를 높게 변경하여 콘솔에서 레코드를 찾을 수 있었지만 이제는 전형적인 per_page 설정으로 예상대로오고 있습니다. 어쨌든 몇 가지 포인트가 있습니다. – Abram

+0

불필요하게 모든 개체를 두 번 인스턴스화하는 것을 피하기 위해이 경우'results' 대신'hits'를 사용하는 것이 좋습니다. [here] (https://github.com/sunspot/sunspot#hits-vs-results) . – dukedave

1

나는 또한 동일한 문제에 직면했다.그래서 제거 : 내 검색

에 per_page 태그를 그리고 per_page_limit을 설정하려면

@styles = Style.search { fulltext params[:q]; paginate :page => params[:page]} 

로 내 쿼리를 변경, 나는

Sunspot.config.pagination.default_per_page = 20 
+0

감사합니다. 내일 다시 시도하고 다시 받으십시오! :) – Abram

+0

죄송합니다. 문제가 해결되지 않습니다. 위의 편집을 참조하십시오. – Abram

2

대체에 공급하려고 내 초기화에 다음 코드를 사용 per_page과 같이 :

@search = Style.search do 
    fulltext params[:q] 
    paginate(page: params[:page], per_page: (params[:per] || 15)) 
end 
+0

죄송합니다. 문제가 해결되지 않습니다. 위의 편집을 참조하십시오. – Abram

1

"히트"방법을 사용할 수 있습니다. 뷰

<% @search.results.each do |result| %> 
    <%= result.name %> 
<% end %> 

<%= will_paginate @search.hits unless @search.nil? %> 
+0

"조회수"를 사용하면보기의 will_paginate 메소드의 핵심입니다. "results"는 model.search 메서드에서 페이지 매김 된 부분의 결과 양을 반환합니다. 반면에 "조회수"는 전체 검색 량을 반영하는 일련의 레코드를 제공하므로 페이지 매김 결과가 올바르게 작동합니다. – nfriend21