【问题标题】:PHP Solr Client - Request Entity Too LargePHP Solr 客户端 - 请求实体太大
【发布时间】:2011-09-26 18:54:02
【问题描述】:

我正在使用 SOLR PHP 客户端从 solr 服务中查询数据。我的代码类似于下面的代码,因为我传入了一个查询来搜索多个 ID(在我的例子中,很多)。当我一次搜索太多 ID 时,问题就出现了。传入太多 ID 时,我得到一个“请求实体太大”。有没有办法解决这个问题?从我在各种示例中看到的情况来看,语法似乎是 'id:1 OR id:2 OR id:3 etc.'搜索多个值时。这有一种不同的语法可以减少传递给服务的请求的大小吗?例如在 SQL 中,我们可以说,'id in (1,2,3,etc.)'。我们可以为 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();
  }
 }
?>

【问题讨论】:

  • 我遇到了类似的问题,但切换到了另一种搜索表示法,例如 viewPermGroupId:(ANY OR 018f5984be10c58ac950f3de8223d76a OR 021132071593b65c1d9ea28d60ac57c3) 有点短....

标签: php apache lucene solr


【解决方案1】:

Solr 支持通过 POST HTTP 请求而不是 GET 请求进行搜索,这将允许您进行更大的查询。我不知道如何在您使用的 PHP 客户端中启用此功能。

但这只是一个创可贴。真正的问题是您似乎在滥用 Solr。您可能会遇到其他限制和性能问题,这仅仅是因为 Solr 并非旨在完成您想要做的事情。您不会使用 PHP 来编写操作系统,对吧?这个也一样。

我建议使用您遇到的真实问题创建一个新问题,该问题导致您运行此类查询。

【讨论】:

  • 您能否详细说明误用或 Solr?使用 Solr 来加速数据库搜索的决定来自另一个团队。我的团队是这项服务的最终用户,我们只需要与之集成。不用说,我们对 Solr 的了解并不多,因为我们刚刚开始研究它。我很想知道 Solr 是如何被滥用的,以及真正的用途应该是什么。
  • @ttngo:我认为你应该和其他团队谈谈这件事,而不是问我或 stackoverflow。 Stackoverflow 和我不是您项目的一部分。如果您对 Solr 有具体问题,请在此处发布(当然是新问题)。
  • 感谢毛里西奥的这个提示。这解决了我目前的类似问题。顺便说一句:我没有看到 SOLR 的滥用 - 例如,在我的情况下,我正在根据当前用户的组成员身份检查页面的可见性。我的应用程序中的两个用户属于 > 300 个组,这就是查询字符串 > 16 kByte 的原因。
  • 谁想知道:在 SOLR PHP 客户端中切换到 POST 可以通过在末尾添加一个参数,例如:$solr->search(utf8_encode($q), $startLimit, $pageRows, $附加参数,'POST');
【解决方案2】:

Solr 支持范围查询,即 id:[1 TO 10] 或 id:[* TO *] 匹配所有。由于看起来您的许多“OR”都与顺序 ID 有关,因此这应该会有所帮助。

【讨论】:

  • 感谢 csjohn 的快速回复。是的,范围应该有所帮助。虽然我的价值观真的不是按顺序排列的。我只是在我的例子中这样做了,所以我不必做太多思考;)
  • @ttngo 您也可以使用通配符语法来包含一些更大更通用的范围。例如 id:[122 TO *] 将匹配所有 id 大于或等于 122 的文档。
  • 这是个好建议。不过,我的值是用户选择的值,它们可以是任何值。我将无法确定这些值的顺序或范围。
  • 我开始觉得您使用 Solr 来像数据库一样存储值,而不是搜索。这是正确的吗?
  • 没错。我们在数据库中拥有的数据量非常巨大,以至于直接查询数据库需要的时间太长了。我们希望使用 Solr 可以加快我们的搜索速度。
猜你喜欢
  • 2022-06-24
  • 2020-11-08
  • 2023-02-10
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多