用于部分文档更新的 solrj api

Posted

技术标签:

【中文标题】用于部分文档更新的 solrj api【英文标题】:solrj api for partial document update 【发布时间】:2012-08-24 09:49:38 【问题描述】:

Solr 4 beta 已发布,GA 版本即将推出。部分文档更新已经存在了一段时间,如下所述:http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/

但是,我还没有弄清楚如何使用 solrj api 来实现。

有谁知道 solrj 是否可行?或者 solrj 只是没有跟上这个功能?

更新: 正如我在邮件列表中描述的(请参阅回复 here),我发现在 solrj api 中,SolrInputField 的值可以是一个映射 - 它没有是一个简单的标量值。 如果是地图,solrj 会在字段的 xml 元素中添加一个额外的 update 属性。 例如, 这段代码:

SolrInputDocument doc = new SolrInputDocument();
Map<String, String> partialUpdate = new HashMap<String, String>();
partialUpdate.put("set", "foo");
doc.addField("id", "test_123");
doc.addField("description", partialUpdate);

生成此文档:

<doc boost="1.0">
    <field name="id">test_123</field>
    <field name="description" update="set">foo</field>
</doc>

在这个例子中,我使用了“set”这个词来表示这个附加属性,但它不起作用。 Solr 没有像我预期的那样更新该字段。 根据此链接: http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ 有效值为“set”和“add”。

有什么想法吗?

【问题讨论】:

这可能会对你有所帮助 [solr-update][1] [1]:***.com/questions/8365713/… @prashant 该问题的答案已过时。该问题的副本中有另一个答案,但它也无济于事 您甚至可以使用ArrayList 插入值列表,然后partialUpdate 将被声明为Map&lt;String, Object&gt; partialUpdate = new HashMap&lt;String, Object&gt;();,键为add 支持 java 代码示例。大多数其他示例只有纯 JSON。谢谢。 【参考方案1】:

事实证明,上面问题中显示的代码 sn-p 确实有效。我第一次尝试时不知道出了什么问题,也许我只是忘记提交或者我的架构配置错误。

无论如何,这个问题是非常本地化的。但是,由于带有哈希映射的 api 的文档记录很差,我认为也许值得保留这个问题和答案。

哈希映射的键可以是三个值之一:

set - 设置字段。 add - 添加到多值字段。 inc - 增加一个字段。

在 solrj 单元测试中有一个此代码的示例,在一个名为 testUpdateField 的方法中。

【讨论】:

要更新具有多个值的多值字段,请创建一个Map&lt;String, List&lt;A&gt;&gt;,如issues.apache.org/jira/browse/… [link]svn.apache.org/repos/asf/lucene/dev/trunk/solr/solrj/src/test/… 可能会阻止某人 remove 和 removeregex 也是哈希cwiki.apache.org/confluence/display/solr/…的可能值 这仅适用于“已存储”字段,否则您需要重新提交整个文档。 cwiki.apache.org/confluence/display/solr/…【参考方案2】:

您可以使用 SOLR API 的更新端点更新部分文档

curl 'https://solr-url/update?commitWithin=1000&overwrite=true&wt=json' \
    -X POST \
    -H 'accept: application/json, text/plain, */*' \
    --data-raw '[ "the-unique-filed": "value", "field-to-change":"set": "new-value" ]' \
    --compressed

或从用户界面

【讨论】:

以上是关于用于部分文档更新的 solrj api的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch Java api - 使用bulkProcessor对文档进行部分更新

Cosmos db 使用 Java SDK 部分更新 SQL api

用于生成API的文档的选型和《Node.js微信开发》文档

搜索引擎系列十:Solr(solrj 索引API 结构化数据导入)

Java文档注释

如何通过 JSON API 实现复杂的条件批量部分更新?