我试图找到一个数据结构(和算法),它允许我索引整个文本文档并搜索它的子字符串,无论子字符串的大小如何。在索引过程期间或结束时,数据结构应存储在磁盘中。
例如,给出以下句子:
The book is on the table
算法应该快速(O(log(n))
)找到任何文本子集的出现次数。
例如,如果输入为book
,则应该找到所有匹配项,但book is
和The book is
也应如此。
不幸的是,大多数解决方案都是通过对文本进行标记并使用单个令牌进行搜索来实现的。普通数据库也可以索引任何文本,而不必担心子集搜索(这就是SELECT '%foo%'
完成线性搜索并花费很多的原因?)。
我可以尝试从头开发一些东西(也许是反向索引的变体?)但是我很想发现有人这样做了。
我发现最相似的是SQLite3 Full-text search。
谢谢!
答案 0 :(得分:4)
一种方法是将文档编入索引suffix tree,然后 - 某些后缀的每个前缀 - 是文档中的子字符串。
使用这种方法,你所要做的就是构建你的后缀树,并在查询子串s
时,跟随树中的节点,如果你可以遍历整个查询字符串 - 它意味着那里是一个后缀,它的前缀是查询字符串 - 因此它也是一个子字符串。
如果您只查询完整的单词,inverted index就足够了。反向索引通常将术语(单词)映射到它出现的文档列表。相反,它将映射到文档中的位置。
在查询时,您需要查找查询中每个单词i
的出现位置,其位置(让它为p
),以及查询的单词i+1
是否出现以及位置p+1
。
这可以非常有效地完成,类似于反向索引传统上执行AND查询的方式,但不是搜索同一文档中的所有术语,而是搜索增加位置的术语。