5

我有一个相当简单的需要在 Solr 中进行条件更新,这在 MySQL 中很容易完成。

例如,

  • 我有 100 个文档,其中有一个名为<id>
  • 我正在发布 10 个文档,其中一些可能是重复的 s,在这种情况下,Solr 会使用相同的 s<id>更新现有记录<id>
  • 我有一个名为的字段<dateCreated>,我只想更新 a<doc>如果新<dateCreated>的大于旧的<dateCreated>(当然,这仅适用于重复<id>的 s)

我怎么能做到这样的事情?

上下文试图对抗导致相同 ID 的多个添加但以错误顺序执行的竞争条件。

谢谢。

4

3 回答 3

2

我可以想到两种方法:

  1. 编写您自己的UpdateHandler并覆盖addDoc以实现该检查。
  2. 在您的客户端代码中放置适当的锁(关键部分),以便获取存储的文档、比较日期并以线程安全的方式有条件地添加新文档。

请记住,Solr 不是数据库,将其与 MySQL 进行比较是在比较苹果和橘子。

于 2009-08-15T03:34:03.917 回答
2

从 solr 4.0 开始,通过_version_字段启用乐观并发。

http://yonik.com/solr/optimistic-concurrency/

要启用,您需要确保您的 schema.xml 包含

<field name="_version_" type="long" indexed="true" stored="true"/>

并在 solrconfig.xml

<updateHandler class="solr.DirectUpdateHandler2">
    <updateLog>
      <str name="dir">${solr.data.dir:}</str>
    </updateLog>
</updateHandler>
于 2013-04-22T16:52:18.170 回答
1

通过像这样真正自定义的添加逻辑,我发现编写自己的客户端更新程序效果更好。它可以防止你在 Solr 内部乱七八糟,这使得将来更容易更新。您绝对可以在 SolrJ 中执行此操作,但如果您不是 Java 开发人员,则可能有一个您自己喜欢的语言的客户端库……PHP、Python、Ruby、C# 等……

rsolr Ruby gem ( http://github.com/mwmitchell/rsolr/tree/master ) 使得编写自定义加载脚本变得非常容易。

于 2009-08-18T20:42:29.090 回答