首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在文件中搜索单词或短语

在文件中搜索单词或短语
EN

Code Review用户
提问于 2013-07-15 06:31:52
回答 2查看 23.4K关注 0票数 1

我写了一个程序:

代码语言:javascript
复制
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.io.FileUtils;

/**
 *
 * @author Mohammad Faisal
 */
public class FileContentMatcher {

public static void main(String[] args) throws IOException {

    String textToMatch = "Quick Styles gallery on";
    ArrayList<String> paths = new ArrayList<String>();
    String content;
    int found = 0;
    int notFound = 0;
    FilenameFilter filter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.endsWith(".txt");
        }
    };

    File path = new File("E:\\anchit\\temp");
    File[] listOfFiles = path.listFiles(filter);
    for (File file : listOfFiles) {
        content = FileUtils.readFileToString(file);
        if (content.contains(textToMatch)) {
            //System.out.println("Found in: " + file.getAbsolutePath());
            paths.add(file.getAbsolutePath());
            found++;
        } else {
            //System.out.println("No found\n" + content);
            notFound++;
        }
    }
    for (String pth : paths) {
        System.out.println(pth);
    }
    System.out.println("Found in " + found + " files.\nNot found in " + notFound + " files.");
}
}

其中我使用了undefined api。

我的实际要求是列出给定目录中的所有文件,其中包含搜索短语textToMatch,最短时间为4-5秒,其中文件的数量最多可达100000。但是这个计划需要更多的时间。

所以我需要优化这段代码,但不需要怎么做?

有什么API可以帮助我吗?我听说过Lucene,但没有弄明白如何使用它。

EN

回答 2

Code Review用户

回答已采纳

发布于 2013-07-15 08:56:01

作为在评论中指出,您当前的方法可能太慢,无法达到“大约4-5秒”的目标。根据实际用例的不同,使用索引确实是个好主意。这与互联网搜索引擎的做法类似。

要创建索引:

  • 创建一个地图Map<String, List<File>>,用于保存搜索词与文件的关联
  • 遍历所有文件,对于每个文件中的每个单词,将该文件添加到索引地图中与该单词对应的列表中。
  • 您可能希望跳过常见的单词,例如"a“、”“和" the”等,或者您甚至可以应用斯泰默来大幅降低单词的可变性。

一旦创建了索引(这可能需要相当长的时间),您只需在该索引中查找搜索单词,就可以获得包含该单词的文件列表(如果使用词干分析器,则获取包含该单词的语言变体)。

如前所述,这种方法的适用性在很大程度上取决于您的实际用例。如果文件中包含基因序列,并且您正在搜索某个模式,这可能不会有多大帮助。即使您正在搜索某个复杂的短语,这也可能不起作用,因为您必须将每个可能的(子)短语添加到索引中。但是,如果您正在寻找普通文本文件(或HTML等)中的单个单词,这可能会奏效。

更新:由于您似乎确实在搜索复杂的短语,您可以尝试以下方法:

  • 创建索引,如上面所述,可以选择使用词干分析器。
  • 搜索索引中短语(或词干版本)中的每个单词。
  • 对于每个包含所有单词的文件,根据索引,对原始短语进行全文搜索。

最后,如果这仍然不能减少它,您还可以为字数大或甚至是三联字创建索引。

票数 4
EN

Code Review用户

发布于 2013-07-15 08:22:19

以下是一些小窍门:

  • 与其将整个文件读入内存,不如使用Reader,一次只读取一个小缓冲区,以检查是否匹配。这将改善内存使用情况,如果找到textToMatch,则避免读取整个文件。
  • 将遍历文件的代码与检查文件的代码分开。使用检查文件的多个线程。这是使用一个生产者和多个消费者的生产者-消费者模式 (使用阻塞队列)的理想选择。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/28490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档