基本的にこのタスクでは、B + treeベースのインデックスを適切にサポートしている任意のSQLデータベースを効率的に使用できます(MySQLは最適なスイートを提供します)。
3つのテーブルを作成します。
- ドキュメントテーブル、列:id / document
- N-gramテーブル:n_gram_id / n_gram
- n-gramとドキュメント間のマッピング:document_id / n_gram_id
N-gramテーブル/ n_gram文字列とマッピングテーブル/ n_gram_idにインデックスを作成します。また、デフォルトでプライマリキーにもインデックスが作成されます。
操作が効率的になります。
- ドキュメントの挿入:すべてのn-gramを抽出し、ドキュメントテーブルとN-gramsテーブルに挿入するだけ
- in_gramのルックアップは、インデックスのサポートにより迅速になります
- サブnグラムを含むすべてのnグラムのクエリ:2ステップ-2番目のテーブルのサブnグラムを含むすべてのnグラムのインデックスに基づいてクエリを実行します。次に、これらのn-gramのそれぞれに対応するすべてのドキュメントを取得します。
これらすべての操作を達成するために結合を使用する必要さえないので、インデックスは大いに役立ちます。また、データが1台のマシンに収まらない場合は、1つのサーバーから開始されたn_gramsを別のサーバーまたは他の適切なスキームに保存するなど、シャーディングスキームを実装できます。
また、MongoDBを使用できますが、インデックススキームを実装する必要があるかどうかはわかりません。MongoDBの場合、シャーディングスキームは既に組み込まれているため、無料で入手できます。