【问题标题】:Solr conditional adds/updates?Solr 条件添加/更新?
【发布时间】:2009-08-14 22:03:49
【问题描述】:

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

例如,

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

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

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

谢谢。

【问题讨论】:

  • 您的问题缺少信息。再试一次
  • 对不起,所以吃了我的小于/大于和里面的所有东西。已更正!

标签: search solr add


【解决方案1】:

我可以想到两种方法:

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

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

【讨论】:

  • 谢谢,我希望得到一些已经支持的东西。 #1 听起来很有用但很复杂——我不是 Java 开发人员。 #2 可能是我将在截止日期的限制下采用的方法。
【解决方案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>

【讨论】:

  • 您基本上是通过使用 SolrInputDocument 中的 _VERSION_ 字段来调用乐观并发。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多