Temelde bu görev için B + ağaç tabanlı dizinleri iyi bir destek ile herhangi bir SQL veritabanını verimli bir şekilde kullanabilirsiniz (MySQL sadece mükemmel ihtiyacınız paketi olacaktır).
3 tablo oluşturun:
- Belgeler tablosu, sütunlar: kimlik / belge
- N gram tablosu: n_gram_id / n_gram
- N gram ve belgeler arasında eşleme: document_id / n_gram_id
N-gram tablosu / n_gram dizesi ve Eşleme tablosu / n_gram_id'de dizinler oluşturun, ayrıca birincil anahtarlar varsayılan olarak iyi dizinlenir.
Operasyonlarınız verimli olacak:
- Belgenin eklenmesi: tüm n-gramları çıkarın ve belge tablasına ve N-gram tablasına yerleştirin
- Dizin desteği ile in_gram araması hızlı olacaktır
- Bir alt-n-gram içeren tüm n-gramlar için sorgulama: 2 adımda - sadece 2. tablodan alt-n-gram içeren tüm n-gramları endekse göre sorgulayın. Sonra - bu n-gramların her biri için ilgili tüm belgeleri alın.
Tüm bu işlemleri gerçekleştirmek için birleştirme kullanmanıza bile gerek yoktur, böylece dizinler çok yardımcı olacaktır. Ayrıca veriler bir makinede paketlenmezse - bir sunucudan başlatılan n_gramları ve başka bir veya başka bir uygun şemada oz depolamak gibi parçalama şemasını uygulayabilirsiniz.
Ayrıca MongoDB kullanabilirsiniz, ancak tam olarak nasıl indeksleme düzeni uygulamak gerekir emin değilim. MongoDB için, zaten yerleşik olduğu için ücretsiz parçalama şeması alacaksınız.