Saya sedang mengerjakan sebuah aplikasi yang membutuhkan pembuatan database n-gram yang sangat besar yang ada dalam corpus teks besar.
Saya membutuhkan tiga jenis operasi yang efisien: Pencarian dan penyisipan diindeks oleh n-gram itu sendiri, dan permintaan untuk semua n-gram yang berisi sub-n-gram.
Bagi saya ini kedengarannya seperti database harus pohon dokumen raksasa, dan database dokumen, misalnya Mongo, harus dapat melakukan pekerjaan dengan baik, tetapi saya tidak pernah menggunakannya pada skala.
Mengetahui format pertanyaan Stack Exchange, saya ingin mengklarifikasi bahwa saya tidak meminta saran tentang teknologi tertentu, melainkan tipe database yang harus saya cari untuk mengimplementasikan sesuatu seperti ini pada skala.
Jawaban:
Lihat Lucene NGramTokenizer
Apakah Anda yakin tidak bisa menggunakan lucene atau teknik pengindeksan yang serupa?
Indeks terbalik akan menyimpan n-gram hanya sekali, maka hanya id dokumen yang berisi ngram; mereka tidak menyimpan ini sebagai teks mentah yang sangat berlebihan.
Sedangkan untuk menemukan ngram yang berisi sub-n-gram kueri Anda, saya akan membangun indeks pada ngram yang diamati, misalnya menggunakan indeks lucene kedua, atau indeks substring lainnya seperti pohon trie atau suffix. Jika data Anda dinamis, mungkin lucene adalah pilihan yang masuk akal, menggunakan kueri frasa untuk menemukan n-gram Anda.
sumber
Pada dasarnya untuk tugas ini Anda dapat secara efisien menggunakan database SQL apa pun dengan dukungan indeks B + tree yang baik (MySQL akan sesuai dengan kebutuhan Anda dengan sempurna).
Buat 3 tabel:
Buat indeks pada N-gram table / n_gram string dan Mapping table / n_gram_id, kunci primer juga akan diindeks dengan baik.
Operasi Anda akan efisien:
Anda bahkan tidak perlu menggunakan gabungan untuk mencapai semua operasi ini sehingga indeks akan banyak membantu. Juga jika data tidak sesuai dalam satu mesin - Anda dapat menerapkan skema sharding, seperti menyimpan n_gram mulai dari pada satu server dan oz pada skema lain atau yang sesuai lainnya.
Anda juga dapat menggunakan MongoDB, tetapi saya tidak yakin bagaimana tepatnya Anda perlu menerapkan skema pengindeksan. Untuk MongoDB Anda akan mendapatkan skema sharding gratis karena sudah ada di dalamnya.
sumber
Saya belum pernah melakukan ini sebelumnya tetapi kedengarannya seperti pekerjaan untuk basis data grafik mengingat fungsionalitas yang Anda inginkan. Ini demo di neo4j .
sumber