【问题标题】:How to use Solr DataImportHandler with XML Files?如何将 Solr DataImportHandler 与 XML 文件一起使用?
【发布时间】:2011-09-28 13:32:57
【问题描述】:

我正在研究使用 DataImportHandler 导入我的数据文件 FileDataSource 和 FileListEntityProcessor 有几个问题 在我开始之前,我希望你们能提供帮助。

1) 我想在配置的本地文件系统上放一个文件 位置并让 Solr 查看和处理文件,而无需额外的努力 我这边。 这是否可行?从我所见,这是不支持的 我必须手动调用一个 URL(例如 http://foo/solr/dataimport?command=full-import)。 手动的、基于 URL 的调用方法在 面向数据库的世界,人们可能会安排更新以定期运行 但在我的情况下,我有几个相同的索引,我在和之间进行负载平衡 不想并行运行相同的大量查询。像这样, 我正在做一个查询,将结果写入 XML 文件,推送该文件 到每个盒子,然后想要处理该文件。我想要这个过程 尽可能自动化。

2) 我希望 Solr 处理的所有文件在被删除后被删除 进口的。我目前还没有看到任何方法可以做到这一点。我以为我可能是 能够继承某些东西,但 FileListEntityProcessor,例如, 似乎没有在工作流中的正确时间提供任何句柄以删除 一份文件。还有什么地方可以看吗?

3) 在阅读 DIH 文档时,我遇到了这样的声明:“当 delta-import 命令被执行,它读取存储在conf/dataimport.properties 中的开始时间。它使用该时间戳来运行增量查询和 完成后,更新 conf/dataimport.properties 中的时间戳。" 如果 它确实将日期更新为完成日期,会发生什么 在开始日期和结束日期之间添加的文件?他们迷路了吗?

4) 对于增量导入,我没有看到处理文件的排序方式 除此之外,它会尝试不重新导入比中提到的文件更早的文件 conf/dataimport.properties 文件。在订单很重要的情况下,是否 按名称或创建日期或...对文件排序?

【问题讨论】:

    标签: xml lucene solr dataimporthandler


    【解决方案1】:

    solr/lucene 的想法不是用作数据库。这是一个索引。这意味着,它是数据的索引,它位于其他地方 - 无论是否有可能(索引和)将数据存储在 solr/lucene 中以获取特殊功能(突出显示等)。 因此,没有开箱即用的可能性来添加单个文档并在导入后删除这些文档。顺便说一句,最好将原始文档保存在数据库、文件系统等中。可能您保留原始文档,但不在 solr/lucene 服务器上?!

    在面向数据库的世界中,基于 URL 的调用方法似乎完全合乎逻辑,人们可能会安排更新以定期运行,但在我的情况下,我有几个相同的索引,我在它们之间进行负载平衡并且不想运行相同的索引大量并行查询。

    您可以定义一个操作系统计划作业 (cronjob) 来启动增量导入。

    我希望 Solr 处理的所有文件在导入后删除

    我从未听说过,solr 能够做到这一点。 正如我上面写的,这个想法是,solr 是存储在其他地方的数据索引。所以 DIH 期望数据/所有文件都在“somewehere”。如果您从“somewehere”中删除原始文档并更新索引,则预期目标是将索引内容与(现在)可用文档同步...

    他们迷路了吗?

    没有。

    it reads the start time stored in conf/dataimport.properties. It uses that timestamp to run delta queries and after completion, updates the timestamp in conf/dataimport.properties."

    Solr reads the start time,运行delta queries and(...如果完成,solr...)updates(...开始时间...)作为timestamp in conf/dataimport.properties."

    它是否按名称或创建日期或...对文件进行排序?

    不确定,但我认为它会按给定顺序从文件系统中读取文件

    【讨论】:

    • 当提到删除文档时,我指的是我用来填充 Solr 的本地文件系统上的物理 XML 文件,而不是索引中的文档。而且由于我会定期进行完整的重新索引,因此保存文件没有任何价值。
    • 至于开始/结束时间......想象一下:开始 delta @ 12:01am。它于上午 12:08 完成。下次运行时,它将针对自 12:08 以来写入的所有文件运行。似乎永远不会解析在 12:04 编写的文件,因为它们没有在第一个 delta 中进行剪切,也不会在第二个中进行。
    • 是否可以从与“完整重新索引”相同的源开始 delte 导入? >下次运行时,它将运行自 12:08 以来写入的所有文件。conf/dataimport.properties
    【解决方案2】:

    在 Solr 邮件列表上得到了 Erick Erickson 的好评:

    http://mail-archives.apache.org/mod_mbox/lucene-solr-user/201109.mbox/browser

    以下具体回复,但我会认真考虑 正在编写我自己的文件系统感知钩子 文档到已知的 Solr 服务器,而不是使用 DIH 拉他们。您可以使用以下代码 FileSystemEntityProcessor 作为基础并从那里开始。 FileSystemEntityProcessor 并不是真的打算 做非常复杂的事情.....

    1> 不要认为这是可能的OOB。没有内置任何东西 放入文件系统挂钩并自动尝试索引的 DIH 它....

    2> 不。 DIH 非常简单,按照 文件列表实体处理器。

    3> 我很确定这与 FileSystemEntityProcessor 无关, 它确实用于数据库导入。

    4> “无论 Java 以何种顺序返回它们”。看看 FileListEntityProcessor 代码,但相关位如下。 所以排序是我不知道的Java所做的任何事情 有什么保证(如果有的话)。

      private void getFolderFiles(File dir, final List<Map<String,Object>> fileDetails) {
      // Fetch an array of file objects that pass the filter, however the
      // returned array is never populated; accept() always returns false.
      // Rather we make use of the fileDetails array which is populated as
      // a side affect of the accept method.
      dir.list(new FilenameFilter() {
        public boolean accept(File dir, String name) {
          File fileObj = new File(dir, name);
          if (fileObj.isDirectory()) {
            if (recursive) getFolderFiles(fileObj, fileDetails);
          } else if (fileNamePattern == null) {
            addDetails(fileDetails, dir, name);
          } else if (fileNamePattern.matcher(name).find()) {
            if (excludesPattern != null && excludesPattern.matcher(name).find())
              return false;
            addDetails(fileDetails, dir, name);
          }
          return false;
        }
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多