【问题标题】:Sync SOLR with another repository将 SOLR 与另一个存储库同步
【发布时间】:2014-09-16 16:41:20
【问题描述】:

我需要使 SOLR 索引与另一个存储库 (SQL DB) 保持同步。 SOLR 是源:对文档的所有操作(更新、删除、'插入')都是在 SOLR 中完成的,并由我无法控制的第三方软件触发。

我必须尽快完成,'一些刚刚好的东西'也是如此:

2 个预定作业:

  • 第一个是针对 SOLR 中新插入和更新的文档:一个简单的 搜索查询给我带来了需要同步的文档,所以它 很容易将其放入我的数据库中。
  • 第二个是删除: 这将获取 SOLR 中的所有 ID,并将它们与 DB 中的 ID 进行比较,即 多余的将被删除。

我将它们放在单独的工作中以获得更大的灵活性(通过配置启用/禁用),并且还因为每个同步计划都不同。

我对我的解决方案不满意,当时我没有太多时间深入研究 SORL 文档。 但是现在,我想知道是否有更好的方法来做到这一点。理想情况下,可以获得近乎实时的同步并按需触发。

可能是 SOLR 配置中的事件处理程序?

如果我可以挂钩更新事件并在数据库中触发相同的操作,我认为更新不会成为事件处理程序的问题。 (如果有人可以确认这是否是最好的方法)

对于删除,这是最需要的,因为我在 ID 之间进行的比较很繁重(SOLR 中的巨大 DB 和巨大的文档集)。

SOLR 中是否有任何事件处理程序可以让我知道正在删除哪些文档(提交删除查询时)?

我想在这里问可以节省我的时间。 另外,如果可能的话,给我一些样本会很棒。 (最好使用 .NET,但我愿意在 JAVA 中这样做,因为它是 SOLR 的框架或将两者混合。) 谢谢。

【问题讨论】:

    标签: solr handler sync


    【解决方案1】:

    Solr 中提供了一个更新挂钩,可让您运行二进制文件:

    <!-- The RunExecutableListener executes an external command.
             exe  - the name of the executable to run
             dir  -  dir to use as the current working directory. default="."
             wait - the calling thread waits until the executable returns.
                    default="true"
             args - the arguments to pass to the program.  default=nothing
             env  - environment variables to set.  default=nothing
          -->
        <!-- A postCommit event is fired after every commit
          -->
        <listener event="postCommit" class="solr.RunExecutableListener">
          <str name="exe">snapshooter</str>
          <str name="dir">solr/bin</str>
          <bool name="wait">true</bool>
          <!--
          <arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
          <arr name="env"> <str>MYVAR=val1</str> </arr>
            -->
        </listener>
      </updateHandler>
    

    documentation

    【讨论】:

    • 谢谢@qux,但是我如何将参数从更新'context'传递到bin,例如如果想知道真正发生了什么样的更新,也可能是文档(或一组文档)参与更新。你知道这是怎么做到的吗?
    • 您可以使用名为deletionDate 的字段进行软删除,并使用该字段同步远程数据库。之后您可以随时硬删除以进行清理。
    • 嗨,抱歉耽搁了,我不在城里,我没有得到自定义字段部分?我该如何做到这一点?我的问题是我无法控制 SOLR 中完成的操作(全部通过第 3 方软件触发),我只能查询 SOLR 以检查那里存在什么。据我所知,没有字段可以说明删除日期是什么(如果文档网仍在 SOLR 中)。所以我现在要做的是真正查询所有文档,并检查丢失的 ID(与我的数据库相比)。
    • 我没有解释清楚,但我只想知道哪些文件被删除了。这应该很容易实现,因为此信息(或至少已删除文档的数量在管理面板上)。我认为最好的方法是在每次删除操作即将发生(或确实发生)时得到通知,但这似乎并不容易/不可能使用 SOLR 中的事件处理程序。有什么建议吗?
    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多