【问题标题】:Searching particular word in a non-delimited string在非分隔字符串中搜索特定单词
【发布时间】:2026-01-27 11:10:01
【问题描述】:

我有一个包含这样的字符串的大文档,基本上是一个非分隔字符串 - 我的名字是约翰史密斯

我还有一个名字集合,这可能非常大,假设有一百万条记录。我打算做什么来检查文档是否包含集合中可用的名称。一种方法是索引文档并遍历集合,并为每个条目在索引中搜索名称。如果集合中没有名称(100 万次迭代),这可能会非常低效。

我想知道是否有更好的方法来做到这一点。像同时索引文档和名称并找到交叉点之类的东西。 谢谢。

【问题讨论】:

  • 最好的方法是使用 solr/lucene,imo.,但是看这里:*.com/questions/14633286/…
  • This could be really inefficient in case the names is not there in the collection - 如果您使用正确的索引,可能不会。
  • 如果你想自己做,一种方法可能是将文档拆分为单词并构建一些以单词为键的映射(值可能是位置信息等)。然后查找该地图中的名称,如果地图根据初始容量等进行了相应设置,则该名称将接近 O(1)。
  • 查找 Aho-Corasick 或 MRSI 算法。
  • @Thomas:我怎么知道在哪里中断,数据没有分隔:(

标签: java indexing lucene pattern-matching


【解决方案1】:

Aho-Corasick 字符串搜索算法使用有限状态机在文档中同时搜索大量字符串。该算法的复杂性与字符串长度加上搜索文本的长度加上输出匹配的数量成线性关系。这就是病毒扫描软件能够在合理的时间内有效地搜索文件中的大量病毒特征的原因。

【讨论】: