我有一大组短字符串。用于过滤包含子字符串的项目列表的一些算法和索引策略是什么?例如,假设我有一个列表:如何高效地搜索子数据集的大数据集?
val words = List(
"pick",
"prepick",
"picks",
"picking",
"kingly"
...
)
如何找到包含子字符串“king”的字符串?我可以像这样蛮力的问题:
words.filter(_.indexOf("king") != -1) // yields List("picking", "kingly")
这只适用于小集;今天,我需要支持1000万字符串,未来的目标是数十亿美元。显然我需要建立一个索引。 什么样的索引?
我已经看过了使用存储在MySQL的NGRAM指数,但我不知道这是最好的办法。当搜索字符串长于ngram大小时,我不确定如何优化查询索引。
我已经使用Lucene也认为,但这是围绕优化匹配的令牌,而不是子串匹配,并且似乎不支持简单的串匹配的要求。 Lucene确实有一些与ngram相关的类(org.apache.lucene.analysis.ngram.NGramTokenFilter
就是一个例子),但这些类似于拼写检查和自动完成用例,而不是子字符串匹配,而且文档很薄。
我应该考虑哪些其他的算法和索引策略?有没有支持这个的开源库? SQL或Lucene策略(上面)可以工作吗?
另一种方式来说明要求与SQL:
SELECT word FROM words WHERE word LIKE CONCAT('%', ?, '%');
凡?
为用户提供的搜索字符串,其结果是包含搜索字符串中的单词的列表。
后缀树应该完成这项工作。 – nhahtdh 2012-08-02 17:41:02
1000万个字符串是不同的? – 2012-08-02 18:34:32
@GordonLinoff是的。 – 2012-08-02 19:30:52