2012-04-06 103 views

回答

7

返回所有的結果從來都不是一個好的選擇,因爲這將是性能非常緩慢。
你能提一下你的用例嗎?

另外,Solr rows參數可幫助您調整要返回結果的數量。
但是,我不認爲有一種方法可以調整行以返回所有結果。它不需要-1作爲值。
因此,您需要爲所有要返回的結果設置較高的值。

+0

我們的經驗(和收到的諮詢)是一樣的:使用Solr作爲過濾器和返回所有結果系統遠非最佳。它只是不是爲返回所有結果而設計的。然而,我們希望有一些方法可以獲得至少所有匹配的「鍵」(鍵字段值)。請參閱此[類似問題](http://stackoverflow.com/questions/16280837/solr-query-get-results-without-scanning-files) – Yonatan 2013-04-29 15:51:06

32

我記得自己做&行= 2147483647

2,147,483,647是整數的最大值。我記得使用比這更大的數字,並且因爲無法將其解析爲int而導致NumberFormatException。我不知道他們現在是否使用龍,但20億行通常綽綽有餘。

小注:
如果您打算在生產中做到這一點,一定要小心。如果您執行查詢如*:*並且索引很大,則可以在該查詢中傳輸幾千兆字節。
如果您知道您的文檔不多,請繼續使用整數的最大值。另一方面,如果您正在執行一次性腳本並只需要轉儲所有結果(例如文檔ID),那麼此方法是有效的,如果您不介意等待3-5分鐘查詢回來。

+3

請勿將Integer.MAX_VALUE(2147483647)用作生產中的行值。即使你有一個小的結果集,這也會嚴重降低你的查詢速度,因爲solr預先分配了這個大小的隊列。請參閱https://issues.apache.org/jira/browse/SOLR-7580 – Simulant 2016-10-13 09:03:04

+1

危險。只爲少量的文件做這個。 – freedev 2017-04-27 09:14:29

0

要通過Solarium php客戶端選擇dismax/edismax中的所有文檔,正常查詢語法不起作用。要選擇所有文檔,請將日光浴室查詢中的默認查詢值設置爲空字符串。這是必需的,因爲日光浴室中的默認查詢是。還可以將備選查詢設置爲。 Dismax/eDismax正常查詢語法不支持,但替代查詢語法的確如此。

對於下面的書籍的更多細節可以被稱爲

http://www.packtpub.com/apache-solr-php-integration/book

-3

query.setRows(Integer.MAX_VALUE的); 適合我!

+0

你是如何得到這個聲明的。即使在使用此聲明後,它也只能得到10。 – 2015-02-18 10:16:04

+1

請注意這一點。我在一個非常特殊的情況下使用它,其中實際數量受到客戶端應用程序的限制。當我部署在生產服務器上時,由於這個原因,我得到了一個java.lang.NegativeArraySizeException。 – s1m3n 2015-06-21 09:52:50

2

你應該做的是首先創建一個SolrQuery,如下所示,並設置你想批量獲取的文檔的數量。

int lastResult=0; //this is for processing the future batch 

String query = "id:[ lastResult TO *]"; // just considering id for the sake of simplicity 

SolrQuery solrQuery = new SolrQuery(query).setRows(500); //setRows will set the required batch, you can change this to whatever size you want. 

SolrDocumentList results = solrClient.query(solrQuery).getResults(); //execute this statement 

這裏我正在考慮一個按id搜索的例子,你可以用你的任何參數替換它來搜索。

「lastResult」是執行前500條記錄(500是批處理大小)後可以更改的變量,並將其設置爲從結果中獲取的最後一個id。

這將幫助您從上一批次的最後結果開始執行下一批次。

希望這會有所幫助。如果您需要任何澄清,請在下面發表評論。

0

正如其他答案指出的那樣,您可以將行配置爲最大整數以返回查詢的所有結果。 我會建議,儘管使用Solr feature of pagination,並建立一個函數,將使用cursorMark API返回所有結果。其要點是您將cursorMark參數設置爲'*',您可以設置頁面大小(rows參數),並且在每個結果上您都會爲下一頁獲得cursorMark,因此只能使用cursorMark執行相同的查詢從最後的結果給出。通過這種方式,您將以更高性能的方式獲得更多靈活性,從而獲得更多的結果。

2

我會建議使用深度尋呼。

簡單分頁是一件很簡單的事情,當你只需要幾個文檔閱讀時,所有你需要做的就是玩startrows參數。但如果你有很多文件,我的意思是數十萬甚至數百萬這不是一個可行的方法。
這是一種可能會讓你的Solr服務器癱瘓的事情。

用於顯示搜索結果給人類用戶的典型應用, 這往往不是太大的問題,因爲大多數用戶並不關心 有關下鑽過去的搜索結果頁面 第一少數 - 但對於希望收集與查詢匹配的所有文檔的數據的自動化系統而言,它可能會嚴重受限。

這意味着,如果你有一個網站,並分頁搜索結果,真正的用戶不要走那麼進一步,但考慮另一方面,如果一隻蜘蛛或刮刀嘗試讀取所有的網頁會發生什麼。

現在我們正在談論Deep Paging

我會建議閱讀這個驚人的帖子:

https://lucidworks.com/blog/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

,並採取看看這個文檔頁面:

https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results

這裏是試圖解釋一個例子如何使用遊標進行分頁。

SolrQuery solrQuery = new SolrQuery(); 
solrQuery.setRows(500); 
solrQuery.setQuery("*:*"); 
solrQuery.addSort("id", ORDER.asc); // Pay attention to this line 
String cursorMark = CursorMarkParams.CURSOR_MARK_START; 
boolean done = false; 
while (!done) { 
    solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark); 
    QueryResponse rsp = solrClient.query(solrQuery); 
    String nextCursorMark = rsp.getNextCursorMark(); 
    for (SolrDocument d : rsp.getResults()) { 
      ... 
    } 
    if (cursorMark.equals(nextCursorMark)) { 
     done = true; 
    } 
    cursorMark = nextCursorMark; 
} 
+0

如果我按ID排序它會影響默認的相關性分數?是否有解決方法 – Cybermonk 2017-11-14 08:08:32

+1

改寫,我可以不對其進行排序並仍使用光標標記嗎? – Cybermonk 2017-11-14 08:26:35

+0

經過一些閱讀發現'sort = score desc,id asc'將啓用默認排序。身份證被用作打破平局 – Cybermonk 2017-11-14 11:10:04

相關問題