次の問題を解決するためのデータ構造を探しています。かなり短い文字列(たとえば、5,000万、30文字未満)の大規模なコレクションを入力として受け取り、必要に応じてインデックスを付けます。次に、新しい文字列を指定し、提供された文字列に類似した初期セットからの文字列を提供するクエリに回答します(たとえば、そのような文字列の中で最も優れたもの10個)。「類似性」の概念は、理想的には編集距離やジャロウィンクラー距離、またはそれらの近似値のようなものですが、スペルや語順の小さな変更、およびジャンク単語の追加に対して回復力がある必要があります。(たとえば、標準のインデックス作成タスクとは異なり、「foo bar」をリクエストすると、コレクション内で実際に最も近い文字列である場合は「foo」が生成されます)。
例を挙げると、文字列コレクションが{"Charles Dickens"、 "Mary Shelley"、"RobertStephenson"}であるとします。「ディケンズ、チャールズ」をクエリすると、「チャールズディケンズ」が見つかります。「byShelley」をクエリすると、「MaryShelley」が返されます。
コレクション内のすべての文字列に対するクエリ文字列の類似性を1つずつ計算する簡単なアプローチは、大規模なコレクションには遅すぎます。そのようなクエリにより効率的に答えるための良いデータ構造は何でしょうか?理想的には、これの優れたJava実装を探しています。