SolrJ API 用于部分文档更新。

27

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的值可以是一个map——它不必是一个简单的标量值。 如果它是一个映射,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”。有什么想法吗?

1
这可能会对你有所帮助 solr-update - prashant
@prashant 那个问题的答案已经过时了。在那个问题的一个副本中有另一个答案,但它也没有帮助到我们。 - Yoni
你甚至可以使用 ArrayList 插入值,然后将 partialUpdate 声明为 Map<String, Object> partialUpdate = new HashMap<String, Object>();,键为 add - veer7
点赞这个Java代码示例。大多数其他示例只有普通的JSON。谢谢。 - ilinca
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
31

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

无论如何,这个问题非常局限。然而,由于使用哈希映射的api文档非常差,所以我认为保留这个问题和答案可能是值得的。

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

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

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


1
要更新一个具有多个值的字段,并且需要使用多个值,可以创建一个Map<String, List<A>>,如https://issues.apache.org/jira/browse/SOLR-4134?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13537900#comment-13538174所示。 - juanmirocks
4
这段话的意思是:这个链接可能会对某些人有所帮助。该链接指向Apache Lucene项目中的一个Java文件,其中包含SolrExampleTests类的测试代码。 - Halis Yılboğa
remove和removeregex也是哈希值的可能取值 https://cwiki.apache.org/confluence/display/solr/Updating+Parts+of+Documents - ilinca
只有当字段被“存储”时,此方法才有效,否则您需要重新提交整个文档。https://cwiki.apache.org/confluence/display/solr/Updating+Parts+of+Documents#UpdatingPartsofDocuments-AtomicUpdates - Prashant Saraswat

0

您可以使用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

或者从UI界面操作

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,