我有一大組短字符串。用於過濾包含子字符串的項目列表的一些算法和索引策略是什麼?例如,假設我有一個列表:如何高效地搜索子數據集的大數據集?
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