【问题标题】:How do I perfom a partial update for an existing Solr document using Solr 5.2.1 and PHP 5.6.27?如何使用 Solr 5.2.1 和 PHP 5.6.27 对现有 Solr 文档执行部分更新?
【发布时间】:2018-01-31 16:10:09
【问题描述】:

首先我基于https://www.safaribooksonline.com/library/view/apache-solr-php/9781782164920/ch02s04.html 尝试了以下操作:

$update = $solrClient->createUpdate();
$doc = $update->createDocument();
$doc->setKey('id', "systemx en 1 194502");
$doc->setField('name', 'george');
$doc->setFieldModifier('sku', 'set');
$update->addDocument($doc)->addCommit();
$result = $solrClient->update($update);
var_dump($result);

显然,我的 solr 客户端 (2.4.0) 版本不支持此类功能。我出现以下错误:

PHP Fatal error:  Call to undefined method SolrClient::createUpdate() in /opt/labs/developers/yfischer/gend7/tools/testyf.php on line 23
PHP Stack trace:
PHP   1. {main}() /opt/labs/developers/yfischer/gend7/tools/testyf.php:0

然后,我尝试直接使用 curl。

$post = json_encode(array(array(
    'id' => 'systemx en 1 194502',
    'name' => array('set' => 'george')
)));
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, 'http://myserver:8983/solr/dev/update?commit=true');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type:application/json',
));
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post);
curl_exec ($ch); curl_close ($ch);

我得到以下输出:

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Transfer-Encoding: chunked

{"responseHeader":{"status":0,"QTime":132}}

尽管如此,当我尝试使用 http://myserver:8983/solr/dev/select?q=%3A&fq=id%3A%22systemx+en+1+194502%22&wt=json&indent=true 查询文档时,名称字段保持不变。

【问题讨论】:

  • Contenttype 至少应该在您的 curl 条目中为 Content-Type。 Solr 日志说明了什么?此外,书中的示例使用了 Solarium - 这是一个用于与 Solr 对话的纯 PHP 库,因此您可以在不更改 PHP 安装的情况下更新该库。
  • 谢谢,MatsLindh,但不幸的是,这并没有帮助。按照您的建议编辑了内容类型标头,我在 json 中得到了响应: {"responseHeader":{"status":0,"QTime":238}} 仍然没有更新记录。另外,从pecl.php.net/package/solr 看来,solr 客户端的最新稳定版本是 2.4.0,这是我正在使用的版本。
  • 但是您引用的这本书没有使用 PECL Solr 扩展。它正在使用the Solarium PHP Library。如果您要按照示例进行操作,则必须使用编写示例的相同库。
  • 谢谢,MatsLindh。你的评论有帮助。如果你想把它作为答案,我可以奖励你。

标签: php curl solr


【解决方案1】:

您引用的这本书没有使用 PECL Solr 扩展。它使用的是 Solarium PHP 库。如果您要按照示例进行操作,则必须使用编写示例的相同库。

Solarium 库 does have built-in support for updates,而二进制 Solr 扩展目前没有特定的更新支持(但您可以通过 general request function 提交您自己的带有更新请求的 XML)。

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2012-01-19
    • 2017-05-23
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多