Solr原子更新

2019-03-27 01:27|来源: 网路

Solr4.0开始支持简单的原子更新和添加字段

 

参数说明

Solr支持多种修饰符,自动更新文档的值。

  • set – 更新一个字段
  • add – 添加一个字段
  • inc – 在原有值的基础上增加(看下面的例子更清楚)

备注: 所有原始字段必须存储(在fieldType 里面设置 stored=true)

 

操作例子

第一步、添加一条数据

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '

[
  { "id" : "book1" , "title" : "Snow Crash" ,
   "copies_i" : 5, "cat" : "Science Fiction"
  }
]'
第二步、修改一个字段author,把copies_i字段的值加3,添加一个cat字段

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '

[
  { "id"       : "book1" ,
   "author"   : { "set" : "Neal Stephenson" },
   "copies_i" : { "inc" :3},
   "cat"      : { "add" : "Cyberpunk" }
  }
]'
第三步、查询一下数据的情况

$ curl http://localhost:8983/solr/get?id=book1
{
“doc”: {
“id”:”book1″,
“title”:["Snow Crash"],
“copies_i”:8,
“cat”:["Science Fiction", "Cyberpunk"],
“author”:”Neal Stephenson”,
“_version_”:1408729977723027456}}

两个遗留问题:
用中文分词器的字段更新后丢失
solrj没有提供相应的方法,这部分有待研究一下
java例子 下载

转自:http://www.solr.cc/blog/?p=266

相关问答

更多
  • 在将文档发送到UpdateHandler时,可以使用相同的uniqueIndex禁用自动覆盖文档,并在add元素中指定属性overwrite="false" 。 看看这里 。 id 无论如何, 这允许将重复文档放入solr ,而不是跳过具有相同ID的现有文档。 我不认为这是你想要的行为。 我认为您应该编写自己的UpdateHandler或 ...
  • ScriptTransformer的答案是肯定的,我通过试验和错误发现。 Solr文档显示了如何使用“set”,“add”或“inc”将更新属性添加到字段节点。 如果我使用必要的更新属性创建测试XML文件,那么传递到常规更新处理程序时它可以正常工作。 但是,当传递给DIH时 - 即使没有任何转换 - 更新属性也会被完全忽略。 以下是我用来重新引入update属性并获得原子更新工作的脚本转换器的简化版本。 请注意使用Java HashMap。 var atomicTransformer = function ...
  • 每天20k更新对于Solr来说并非不合理。 OTOH,非常频繁地更新字段(假设一个用户可以一天多次登录,因此您可能希望在所有这些时间更新它),您可以使用外部字段将该字段保存在索引之外(在文本文件中)和仍然使用它在solr中进行排序。 20k updates/day is not unreasonable at all for Solr. OTOH, for very frequently updating fields (imagine one user could log in multiple time ...
  • 您可以安装插件,不包括其中的Solr库版本,然后明确包含更新版本。 此处的详细信息将在另一个插件的上下文中进行描述。 假设您已经拥有一个插件开发者帐户,那么下载插件源代码,升级库和发布新版本可能会更容易。 仅供参考,任何人都可以发布新的插件版本,而不仅仅是原始的插件作者。 你的Solr插件用户会为此感谢你。 You could install the plugin, excluding the version of the Solr library therein, then explicitly incl ...
  • 您使用版本 :1的解决方案是正确的。 但请注意,如果您批量发送原子更新,则任何失败都将导致批处理中的后续更新被丢弃。 在您给出的示例中,id:7将导致409状态代码(版本冲突),但应更新id:2和id:3的文档。 Your solution of using version:1 is correct. But beware that if you send your atomic updates in a batch then any failure will cause the subsequent up ...
  • 您列出的文档参考描述了Solr 4中的原子更新参数,SolrNet目前不支持这些参数 - 有关更多详细信息,请参阅问题199 。 在将此支持添加到SolrNet之前,更新索引中文档的唯一选择是重新发送整个文档(C#中的对象),并适当设置所需的更新/删除的字段。 在内部,Solr将使用更新的字段将文档重新添加到索引中。 此外,在索引中添加/更新文档时,在发出提交之前,对索引的查询将不会显示这些更改。 我建议使用AddParameters的CommitWithin选项来允许Solr在内部处理它,这在SolrWi ...
  • 您目前无法使用PySolr对Solr进行原子更新。 有一个拉动: https://github.com/toastdriven/pysolr/pull/99 但它尚未合并。 最后评论不到一个月前,如果你有兴趣我会评论它 - 或者如果你愿意的话,尝试自己合并代码。 You cannot currently make atomic updates to Solr using PySolr. There is a pull for it: https://github.com/toastdriven/pysolr ...
  • 是的,如果您不想存储字段,则必须重新编制索引。 Solr中的原子更新实现为获取文档,更改已更改的字段的值,并在内部重新提交文档。 如果未存储这些值,则重新提交将缺少这些值。 您不必重新索引整个核心 ,只需更改已更改的文档。 但是,如果您要对某些字段使用原子更新,则必须将这些字段设置为存储或将docvalues设置为true。 Yes, if you don't want to store the fields, you'll have to reindex them. An atomic update in ...
  • 从solr 4开始,Solr允许更新部分文档。 您可以更新字段的值或从多值字段添加/删除值。 在solr中使用部分更新或原子更新时的最佳实践是,将架构中的所有索引字段定义为stored=true 。 当在文档上发生部分更新时,Solr在内部从先前存储的文档中提取其他字段的值以重建文档。 然后,它将先前的文档标记为已删除,并使用更高版本索引新文档。 优点是,如果要从索引更新特定的小字段,则无需再次发送大型文档。 使用部分更新功能的缺点可能是索引的大小更大。 因为以前,您可能只想索引某些字段而不存储它们。 这将 ...
  • 好吧,我在调试了一下SolrJ代码后解决了它。 你必须这样做: SolrInputDocument doc2 = new SolrInputDocument(); Map fpValue2 = new HashMap(); fpValue2.put("add","fp2"); doc2.setField("FACTURES_PRODUIT", fpValue2); Ok, I solved it ...