2011-09-26 70 views
1

我正在使用SOLR PHP客戶端從solr服務查詢數據。我的代碼看起來類似於下面,因爲我通過查詢來搜索多個ID(在我的情況下,很多)。當我一次搜索太多ID時,問題就出現了。傳入太多ID時,我會收到'Request Entity Too Large'。有沒有辦法解決這個問題?根據我在各種示例中看到的,語法似乎是'id:1或id:2或id:3等'。當搜索多個值時。這有不同的語法,可以減少傳遞到服務中的請求的大小?例如在SQL中,我們可以說'id in(1,2,3等)'。我們可以爲SOLR查詢做類似的事嗎?PHP Solr客戶端 - 請求實體太大

<?php 
    require_once('SolrPHPClient/Apache/Solr/Service.php'); 
    $solr = new Apache_Solr_Service('localhost', '8983', '/solr');  

    $offset = 0; 
    $limit = 10; 

    $queries = array(
    'id: 1 OR id: 2 OR id:3 OR id:4 OR id:5 OR id:6 or id:7 or id:8' // in my case,  this list keeps growing and growing 
    ); 

    foreach ($queries as $query) { 
    $response = $solr->search($query, $offset, $limit); 

    if ($response->getHttpStatus() == 200) { 
    print_r($response->getRawResponse()); 
    } 
    else { 
    echo $response->getHttpStatusMessage(); 
    } 
} 
?> 
+0

我也有類似的問題,但切換到像 viewPermGroupId搜索的另一個符號:(ANY或018f5984be10c58ac950f3de8223d76a或021132071593b65c1d9ea28d60ac57c3) 那是一個有點短.... – cljk

回答

1

Solr支持範圍查詢,即id:[1到10]或id:[* TO *]以匹配全部。由於看起來許多「OR」與順序ID有關,所以這應該有所幫助。

+0

感謝csjohn的快速反應。是的,範圍應該有所幫助。儘管我的價值觀並不是按順序排列的。我只是在我的例子中這樣做了,所以我不必做太多的思考;) – ttngo

+0

@ttngo您也可以使用通配符語法來包含一些更大的更一般的範圍。例如,id:[122 TO *]將匹配所有ID大於或等於122的文檔。 – csjohn

+0

這是一個很好的建議。雖然,我的價值觀是用戶選擇的價值觀,他們可能是任何東西。我將無法確定這些值的順序或範圍。 – ttngo

3

Solr支持通過POST HTTP請求進行搜索,而不是GET請求,這將允許您有更大的查詢。我不知道如何在你使用的PHP客戶端中啓用它。

但是,這只是一個bandaid。真正的問題是你似乎在濫用Solr。您可能會遇到其他限制和性能問題,這是因爲Solr並非設計用於執行您正在嘗試執行的操作。你不會使用PHP來編寫操作系統,對吧?這與此相同。

我建議用真正的問題創建一個新問題,你有這個問題導致你運行這種查詢。

+0

能否詳細說明誤用或Solr?使用Solr加速數據庫搜索的決定來自另一個團隊。我的團隊是這項服務的最終用戶,我們只需要與它整合。不用說,我們對Solr不太瞭解,因爲我們剛剛開始討論Solr。我很想知道Solr是如何被濫用的,以及真正的用法應該是什麼。 – ttngo

+0

@ttngo:我認爲你應該和其他團隊談談這個問題,而不是問我或者stackoverflow。 Stackoverflow和我是**不是你的項目的一部分。如果您有關於Solr的具體問題,請在這裏發佈(當然是新的問題)。 –

+0

謝謝你的提示Mauricio。這解決了我目前的可比問題。順便說一句:我沒有看到那裏濫用SOLR - 在我的情況下,例如,我正在檢查頁面的可見性,取決於當前用戶的組成員資格。我的應用程序中的兩個用戶屬於> 300個組,這就是爲什麼查詢字符串大於16 KB。 – cljk