2013-07-24 57 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個Style記錄。

如果我有:page => 1:per_page => 10當我搜索了11的記錄,我得到一個空數組返回@styles.results

如果我設置:page=>2,做同樣的搜索,我得到了第11屆的風格記錄。

[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

的解釋是有點混亂給我。你可以把「當它像魅力一樣工作」的結果,取決於你的默認頁面大小,它可能是完全不同的。從你顯示的數據看來,一切似乎都有道理。你認爲什麼是錯的? – polmiro

+0

我猜你的參數不是你想象的那樣。你能輸出你的結果沒有神祕的params? – mathieugagne

+0

你如何索引你的模型?全文不是不可思議的,你需要傳遞你想要搜索的字段,並且你需要在'searchable'區塊中將這些字段作爲'text'索引。你也可以顯示這些信息嗎? – 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) 

我從文檔理解:我沒有嘗試過

默認情況下,太陽黑子會向Solr請求前30個結果。這意味着你可以擁有的,可能符合搜索條件的記錄100,但你會看到只有第30,看別人,你必須在PAGINATE添加到您的Solr的搜索,如:

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

情況下,你應該可以訪問2頁。要更新太陽黑子的數量要求,你需要寫:

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

它應該給你50個結果中的一個頁面,或paginate :page => 2, :per_page => 50和結果應在2頁每最多50結果劃分。

+0

感謝您的幫助。我甚至不知道爲什麼它不起作用,因爲突然間它按預期工作。在我只能通過更改per_page來查找控制檯中的記錄之前,現在它按照預期以典型的per_page設置出現。無論如何,這是一些要點。 – Abram

+0

我建議在這種情況下使用'hits'而不是'results',以避免不必要地實例化所有對象兩次,參見[here](https://github.com/sunspot/sunspot#hits-vs-results) 。 – dukedave

1

我也遇到了同樣的問題。所以我刪除:per_page標籤在我的搜索

而且改變了我的查詢作爲

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

要設置per_page_limit,我用下面的代碼在我的初始化

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

您可以使用「hits」方法。

在控制器

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

在視圖

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

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

使用「點擊」是視圖中will_paginate方法的關鍵。 「結果」僅返回model.search方法中分頁方面的結果數量。另一方面,「點擊」提供了一組反映整個搜索量的記錄,因此可以使分頁結果正常工作。 – nfriend21