是否有一个快速Java库来搜索字符串及其在文件中的位置?

是否有一个快速Java库来搜索字符串及其在文件中的位置?,java,string-search,Java,String Search,我需要搜索大量文件(即600个文件,每个文件0.5 MB)以查找特定字符串 我使用的是Java,所以我更喜欢一个Java库,或者在最坏的情况下,一个我可以从Java调用的不同语言的库 我需要搜索返回在文件中找到的字符串的确切位置(因此,例如Lucene似乎是不可能的) 我需要尽快搜索 编辑开始: 这些文件可能具有不同的格式(即EDI、XML、CSV),有时包含非常随机的数据(即数字ID等)。这就是为什么我初步排除了基于索引的搜索引擎 将多次搜索文件以查找相似但不同的字符串(即,可能具有相似长度和

我需要搜索大量文件(即600个文件,每个文件0.5 MB)以查找特定字符串

我使用的是Java,所以我更喜欢一个Java库,或者在最坏的情况下,一个我可以从Java调用的不同语言的库

我需要搜索返回在文件中找到的字符串的确切位置(因此,例如Lucene似乎是不可能的)

我需要尽快搜索

编辑开始:

这些文件可能具有不同的格式(即EDI、XML、CSV),有时包含非常随机的数据(即数字ID等)。这就是为什么我初步排除了基于索引的搜索引擎

将多次搜索文件以查找相似但不同的字符串(即,可能具有相似长度和格式但通常不同的ID)

编辑结束


有什么想法吗?

600个0.5MB的文件,每个大约300MB——这在当今已经不算大了,更不用说大了。任何现代计算机上的简单字符串搜索实际上都应该比CPU绑定更受I/O约束—我的系统上的单个线程可以在1.5秒内搜索300MB的相对简单的正则表达式—如果文件已经存在于操作系统缓存中,则搜索速度会降到0.2

考虑到这一点,如果您的目的是不经常执行这样的搜索,那么使用某种索引可能会导致过度工程化的解决方案。从迭代所有文件开始,逐块或逐行读取每个文件并进行搜索——这非常简单,几乎不值得拥有自己的库

设定性能要求,分析代码,验证实际字符串搜索是否是瓶颈,然后决定是否需要更复杂的解决方案。如果你确实需要更快的东西,你首先要考虑以下的解决方案:复杂性:

  • 使用现有的索引引擎,如Lucene,为每个查询过滤掉大部分文件,然后显式地在剩下的文件中搜索字符串

  • 如果您的文件不是真正的文本,因此基于单词的索引可以工作,那么预处理文件以提取每个文件的术语列表,并使用DB创建您自己的索引系统-我怀疑您是否会找到一个FTS引擎,该引擎使用除单词以外的任何内容进行索引

  • 如果您确实想将搜索时间减少到最小,请从文件中提取术语/位置对,并将它们输入数据库。您可能仍然需要通过查看实际文件来进行验证,但这将大大加快速度

附言:你根本没有提到我们正在讨论的弦乐之王是什么。它是否包含分隔的术语,例如单词,或者您的文件是否包含随机字符?搜索字符串是否可以以有意义的方式拆分为子字符串,或者它是一堆字母?您的搜索字符串是固定的,还是也可以是正则表达式?这些问题的答案可能会极大地限制什么是可行的,什么是不可行的——例如,索引随机字符串可能根本不可能

编辑

从问题更新来看,术语/标记的概念似乎普遍适用,而不是在二进制文件中搜索完全随机的序列。这意味着您可以为这些术语编制索引。通过在索引中搜索搜索字符串中存在的任何标记,可以显著减少需要查看实际文件的情况

  • 您可以保留一个
    term->file
    索引。如果大多数术语对每个文件都是唯一的,那么这种方法可能会提供一个很好的复杂性/性能权衡。基本上,您可以将搜索范围缩小到一个或两个文件,然后仅对这些文件执行完整搜索

  • 您可以保留一个
    term->file:position
    索引。例如,如果您的搜索字符串是“Alan Turing”。首先在索引中搜索标记“Alan”和“Turing”。您将得到两个文件和位置列表,您可以相互参照。例如,通过要求标记“Alan”的位置在标记“Turing”的位置之前最多(比如)30个字符,您将在文件中获得一个候选位置列表,您可以明确验证

  • 我不确定现有的索引库在多大程度上会有所帮助。大多数是针对文本索引的,可能会错误处理其他类型的标记,如数字或日期。另一方面,您的案例也没有本质上的不同,因此您可能能够使用它们—如果必要,通过预处理您提供给它们的文件,使它们更容易接受。根据您的需要构建自己的索引系统似乎也不太困难

    您还没有提到搜索字符串是否有任何灵活性。您希望能够搜索正则表达式吗?是希望逐字查找搜索字符串,还是只需要查找其中的术语?空格重要吗?条款的顺序重要吗


    更重要的是,您没有提到在搜索时是否应该考虑文件中的任何类型的结构。例如,是否希望能够将搜索限制到XML文件的特定元素?

    除非您有SSD,否则您的主要瓶颈将是所有文件访问。无论您在Java中使用的是什么,读取这些文件大约需要10秒钟

    如果您有一个SSD,读取文件将不会是一个问题,Java中的CPU速度将更加重要


    如果您可以为文件创建索引,这将非常有帮助。

    -详细介绍了所有内容。此外,还应helpful@simchona要图书馆!=“给我一个codez”…@MichaelMcGowan即使这样,这里也没有太多的研究,只有需求。@si