Pendekatan termudah yang saya kira adalah:
- Buat dua tabel baru:
keywords
(id, kata) dankeywords_comments
(keyword_id, comment_id, count)keywords
menyimpan id unik dan kata kunci yang Anda temukan dalam tekskeywords_comments
menyimpan satu baris untuk setiap koneksi antara setiap komentar yang berisi kata kunci tersebut. Dalamcount
Anda akan menyimpan berapa kali kata kunci ini muncul di komentar. Dua kolom keyword_id + comment_id bersama-sama membentuk kunci utama yang unik atau langsung.
- Ambil semua komentar dari database
- Uraikan semua komentar dan pisahkan dengan non-karakter (atau batas lainnya)
- Tulis entri ini ke tabel Anda
Contoh
Anda memiliki dua komentar berikut:
Sekarang Anda akan mengulangi keduanya dan membaginya dengan non-karakter. Ini akan menghasilkan kata-kata kecil berikut untuk setiap teks:- Teks pertama:hello, how, are, you- Teks kedua:wow, hello, my, name, is, stefan
Segera setelah Anda menguraikan salah satu teks ini, Anda sudah dapat memasukkannya ke dalam database lagi. Saya kira Anda tidak ingin memuat 100.000 komentar ke RAM.
Jadi begini:
- Parsing teks pertama dan dapatkan kata kunci di atas
- Tuliskan setiap kata kunci ke dalam tab
keywords
jika belum ada - Tetapkan referensi dari kata kunci ke komentar (
keywords_comments
) dan atur hitungannya dengan benar (dalam contoh kita, setiap kata hanya muncul sekali dalam setiap teks, Anda harus menghitungnya). - Mengurai teks kedua
- …
Peningkatan kecil
Peningkatan yang sangat mudah yang mungkin harus Anda gunakan untuk 100.000 komentar, adalah dengan menggunakan variabel penghitung atau tambahkan bidang baru telah_dianalisis untuk setiap komentar. Kemudian Anda dapat membacanya komentar demi komentar dari database.
Saya biasanya menggunakan menghitung variabel ketika saya membaca data chunkwise dan tahu bahwa data tidak dapat berubah dari arah saya mulai (yaitu akan tetap konsisten sampai titik saya saat ini). Lalu saya melakukan sesuatu seperti:
SELECT * FROM table ORDER BY created ASC LIMIT 0, 100
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100
…
Pertimbangkan bahwa ini hanya berfungsi jika kita tahu pasti bahwa tidak ada tanggal untuk ditambahkan di tempat yang kita pikir sudah kita baca. Misalnya. menggunakan DESC
tidak akan berfungsi, karena mungkin ada data yang dimasukkan. Kemudian seluruh offset akan rusak dan kami akan membaca satu artikel dua kali dan tidak pernah membaca artikel baru.
Jika Anda tidak dapat memastikan bahwa variabel penghitungan luar tetap konsisten, Anda dapat menambahkan bidang baru dianalisis yang Anda setel ke true segera setelah Anda membaca komentar. Kemudian Anda selalu dapat melihat komentar mana yang sudah dibaca dan mana yang belum. Kueri SQL kemudian akan terlihat seperti ini:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */
Ini berfungsi selama Anda tidak memparalelkan beban kerja (dengan banyak klien atau utas). Jika tidak, Anda harus memastikan bahwa pembacaan + pengaturan benar adalah atomar (disinkronkan).