1

我正在研究使用 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中的开始时间。它使用该时间戳来运行 delta 查询,并在完成后更新conf/dataimport.properties中的时间戳。” 如果它确实将日期更新为完成日期,那么在开始日期和结束日期之间添加的任何文件会发生什么情况?他们迷路了吗?

4) 对于增量导入,我没有看到处理文件的排序方式,只是它尝试不重新导入比 conf/dataimport.properties 文件中提到的文件更旧的文件。在顺序很重要的情况下,它是按名称或创建日期对文件进行排序还是...?

4

2 回答 2

1

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

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

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

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

我从未听说过,solr 能够做到这一点。正如我上面写的,这个想法是,solr 是存储在其他地方的数据索引。因此,DIH 期望数据/所有文件位于“某处”。如果您从“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(...if it is finished, solr...) updates(... the start time...) astimestamp in conf/dataimport.properties."

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

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

于 2011-09-28T16:19:20.807 回答
0

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

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

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

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

2> 不。根据 FileListEntityProcessor,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;
    }
  });
}
于 2011-10-20T13:35:44.437 回答