2011-09-26 38 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