【问题标题】:Search file by Name (using java, lucene or tech stack)按名称搜索文件(使用 java、lucene 或技术堆栈)
【发布时间】:2018-03-25 09:59:00
【问题描述】:

我有很多图像文件,我想按名称搜索特定文件。我正在寻找使用 Java 实现这一点的建议。

注意:我使用过 Apache lucene,但它不适用于图像文件。我认为它是按文件内容搜索的。

请建议可用于在大量图像文件(以 TB 为单位)中按名称搜索文件的最佳技术。


编辑

例子:

用户输入“引擎”,它应该给出如下结果:

X60_031004_P05_16_AJ126SC_ENGINE_COVER_AWD_2.jt X60_031004_P05_16_AJ127SC_ENGINE_COVER.jt

【问题讨论】:

  • 什么是手数? 100.000?百万?一亿?
  • Lots 表示,共享驱动器有 12 到 15 个包含图像文件的文件夹,大小以 TB 为单位。 (一个文件夹中大约 50k 个文件)

标签: java spring apache lucene


【解决方案1】:

您可以使用 Lucene 搜索文件名或一般图像元数据。而且它可能是比 FileUtils 更好的解决方案,特别是如果您想拥有所有不错的“搜索引擎”功能。

我对这种要求没有任何经验,但我会这样做:

  • 使用 Apache Tika (https://tika.apache.org/) 提取元数据
  • 使用 Apache Lucene 进行元数据索引和搜索
  • 图像本身的专用存储,在 Lucene 索引中具有引用

【讨论】:

  • 谢谢。我尝试使用 Apache Lucene 进行索引和搜索,但是当我将数据目录指向 image/it 文件驱动器路径时它不起作用。我在 PDF 文件上尝试过它并且它有效,我认为 lucene 基于文件内容将文件名输出为没有任何内容(文本)的图像文件,不返回文件名/路径
  • 您可以将路径索引为单独的字段。据我了解,您可以定义自己的索引结构。因此,您可以从 tika 获取信息并将它们索引到任何字段中,比如说一个字符串字段,您称之为路径或其他东西。如果您不想搜索这些信息,您可以使用 StoredField。
【解决方案2】:

您可以使用org.apache.commons.io.FileUtils,如下所示:

    File root = new File("C:\\");
    String fileName = "Engine";
    String[] extensions = {"jt"};
    boolean recursive = true;
    Collection files = FileUtils.listFiles(root, extensions, recursive);
    for (Iterator iterator = files.iterator(); iterator.hasNext();) {
        File file = (File) iterator.next();
        if (file.getName().toLowerCase().contains(fileName.toLowerCase()))
            System.out.println(file.getAbsolutePath());
    }

【讨论】:

  • 我没有尝试过 FileUtils,但我认为 FileUtils 不会通过考虑驱动器大小或文件量来按时间线扩展。虽然我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2015-03-21
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2020-10-21
相关资源
最近更新 更多