Solr条件添加/更新?

时间:2009-08-14 22:03:50

标签: search solr add

我非常需要在Solr中进行条件更新,这在MySQL中很容易实现。

例如,

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

我怎么能完成这样的事情?

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

感谢。

3 个答案:

答案 0 :(得分:2)

我可以想到两种方式:

  1. 编写您自己的UpdateHandler并覆盖addDoc以实现该检查。
  2. 在客户端代码中放置适当的锁(关键部分),以便获取存储的文档,比较日期,并以线程安全的方式有条件地添加新文档。
  3. 请记住,Solr不是一个数据库,将它与MySQL进行比较是比较苹果和橙子。

答案 1 :(得分: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>

答案 2 :(得分:1)

使用这样的自定义添加逻辑,我发现编写自己的客户端更新程序效果更好。它可以防止您在Solr内部进行混乱,这使得将来更容易更新。您可以在SolrJ中明确地执行此操作,但如果您不是Java开发人员,则可能有您自己首选语言的客户端库... PHP,Python,Ruby,C#等...

rsolr Ruby gem(http://github.com/mwmitchell/rsolr/tree/master)可以非常容易地将自定义加载脚本放在一起。