0 Pendahuluan
Dengan pengembangan World Wide Web dan munculnya era Big Data, sejumlah besar informasi digital diproduksi, disimpan, ditransmisikan, dan dikonversi setiap hari. Cara menemukan informasi yang memenuhi kebutuhan Anda dengan cara tertentu dari sejumlah besar informasi, sehingga dapat dipesan dan digunakan telah menjadi masalah besar. Teknologi pencarian teks lengkap adalah aplikasi kueri informasi yang paling umum saat ini. Dalam kehidupan, mesin pencari digunakan untuk mencari informasi di forum blog. Prinsip inti dari pencarian ini adalah teknologi pencarian teks lengkap yang akan diimplementasikan dalam artikel ini. Dengan realisasi digitalisasi informasi dokumen, secara efektif menyimpan dan mengekstraksi informasi yang tepat waktu dan akurat adalah dasar bagi setiap perusahaan, perusahaan, dan unit untuk meletakkan dasar yang baik. Sudah ada banyak teori dan metode dewasa untuk pencarian teks lengkap dalam bahasa Inggris. Mesin pencari teks lengkap open source Lucene adalah sub-proyek dari tim proyek Jakarta dari Apache Software Foundation. Tujuannya adalah untuk memberi pengembang perangkat lunak toolkit yang sederhana dan mudah digunakan untuk memfasilitasi implementasi fungsi pencarian teks lengkap dalam sistem target. Lucene tidak mendukung orang Cina, tetapi saat ini ada banyak segmen kata Cina open source yang dapat mengindeks konten Cina. Berdasarkan studi tentang prinsip -prinsip inti Lucene, makalah ini masing -masing merangkak dan pengambilan halaman web Cina dan Inggris.
1 Pengantar Lucene
1.1 Pengantar Lucene
Lucene adalah alat mesin pencari teks lengkap yang ditulis dalam Java, yang mengimplementasikan dua fungsi inti: pengindeksan dan pencarian, dan keduanya tidak tergantung satu sama lain, yang memungkinkan pengembang untuk dengan mudah berkembang. Lucene menyediakan API kaya yang dapat dengan mudah berinteraksi dengan informasi yang disimpan dalam indeks. Perlu dicatat bahwa ini bukan aplikasi pencarian teks lengkap lengkap, tetapi menyediakan fungsi pengindeksan dan pencarian untuk aplikasi tersebut. Artinya, jika Lucene ingin benar -benar bekerja, perlu melakukan beberapa pengembangan sekunder yang diperlukan berdasarkan itu.
Desain struktural Lucene mirip dengan database, tetapi indeks Lucene sangat berbeda dari database. Basis data dan pengindeksan Lucene semuanya untuk kenyamanan pencarian, tetapi database hanya ditetapkan untuk beberapa bidang, dan data perlu dikonversi menjadi informasi yang diformat dan disimpan. Pencarian teks lengkap adalah mengindeks semua informasi dengan cara tertentu. Perbedaan dan persamaan dari dua pencarian ditunjukkan pada Tabel 1-1.
Tabel 1-1: Perbandingan Pencarian Database dan Pencarian Lucene
Perbandingan | Pencarian Lucene | Pengambilan basis data |
Pengambilan data | Lihat dari file indeks Lucene | Ambil catatan dari indeks database |
Struktur indeks | Dokumen | Catatan |
Hasil kueri | Hit: Komposisi dokumen yang memuaskan hubungan | Set Hasil Permintaan: Catatan yang berisi kata kunci |
Pencarian Teks Lengkap | mendukung | Tidak didukung |
Kueri fuzzy | mendukung | Tidak didukung |
Sorting hasil | Atur bobot dan urutkan korelasi | Tidak bisa disortir |
1.2 Struktur keseluruhan Lucene
Bentuk rilis paket perangkat lunak Lucene adalah file jar, dengan pembaruan versi cepat dan celah versi besar. Artikel ini menggunakan versi 5.3.1, dan subpackage utama yang digunakan ditampilkan pada Tabel 1-2.
Tabel 1-2: Subpakim dan Fungsi
Nama paket | Fungsi |
Org.apache.lucene.analysis | Partisip |
Org .apache.lucene .document | Dokumentasi untuk Manajemen Indeks |
Org .apache.lucene .index | Operasi pengindeksan, termasuk penambahan, penghapusan, dll. |
Org.apache.lucene.queryparser | Queryer, membangun ekspresi pencarian |
Org .apache.lucene .Search | Manajemen pencarian |
Org .apache.lucene .store | Manajemen penyimpanan data |
Org .apache.lucene .util | Kategori publik |
1.3 Desain Arsitektur Lucene
Lucene memiliki fungsi yang sangat kuat, tetapi pada dasarnya, ini terutama mencakup dua bagian: satu adalah untuk mengindeks indeks ke perpustakaan setelah konten teks tersegmentasi; Yang lainnya adalah mengembalikan hasilnya sesuai dengan kondisi kueri, yaitu untuk menetapkan indeks dan kueri.
Seperti yang ditunjukkan pada Gambar 1-1, artikel ini membuang antarmuka eksternal dan sumber informasi, yang berfokus pada pengindeksan dan permintaan konten teks yang dirangkak oleh halaman web.
Gambar 1-1: Desain Arsitektur Lucene
2 Instalasi JDK dan Konfigurasi Variabel Lingkungan
1.JDK Unduh:
Unduh paket terkompresi yang cocok dengan versi sistem di situs web resmi Oracle, dan URL adalah sebagai berikut. Klik Instal dan Instal sesuai dengan prompt. Selama proses instalasi, Anda akan meminta apakah akan menginstal JRE, klik Ya.
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. Atur variabel lingkungan:
(1) Klik kanan komputer =》 Properties =》 Pengaturan Sistem Lanjutan =》 Variabel Lingkungan =》 Variabel Sistem =》 Baru =》 Java_Home: Jalur Instalasi
(2) yang baru ditambahkan ke path =》%java_home%/bin
3. Apakah tes berhasil:
Start =》 run =》 cmd masukkan di jendela pop-up dos
Enter: Java -Version akan menampilkan informasi versi.
Masukkan: Informasi Penggunaan Javac muncul di Javac
Penampilannya seperti yang ditunjukkan pada Gambar 2-1 sebagai keberhasilan.
Gambar 2-1: CMD Command Box Test Java Configuration
3. Tulis kode java untuk mendapatkan konten web
Karena Lucene perlu menggunakan segmen kata yang berbeda untuk bahasa yang berbeda, segmen kata standar digunakan dalam bahasa Inggris, dan segmen kata smartcn digunakan dalam bahasa Cina. Saat mendapatkan halaman web, pertama -tama dapatkan halaman web sebagai file HTML. Dalam HTML, gangguan tag akan mempengaruhi efek pengambilan. Oleh karena itu, tag HTML perlu dihilangkan dan konten teks dikonversi menjadi file txt untuk disimpan. Kecuali untuk para partisipasi kata, yang lain dalam bahasa Mandarin dan Inggris pada dasarnya sama, sehingga setiap kode berikutnya dan demonstrasi hasil eksperimen akan dipilih. Artikel ini memilih lima puluh halaman web cerita Cina dan Inggris sebagai contoh.
Desain kode spesifik adalah sebagai berikut: URL2HTML.java Mengubah URL input halaman web menjadi file HTML, dan file html2txt.java mewujudkan penghapusan tag dokumen HTML dan mengubahnya menjadi dokumen TXT. Kode spesifik ditunjukkan pada Gambar 3-1 dan 3-2.
public void way(String filePath,String url) throws Exception{ File dest = new File(filePath);//Create file InputStream is;//Receive byte input stream FileOutputStream fos = new FileOutputStream(dest);//Byte output stream URL wangzhi = new URL(url);//Set URL URL is = wangzhi.openStream(); BufferedInputStream bis = baru bufferedInputStream (is); // buffered bufferedoutputStream untuk byte stream bos = baru bufferedoutputStream (fos); // buffer byte output stream/** Baca panjang byte*/int; byte [] bytes = byte baru [1024*20]; while ((panjang = bis.read (bytes, 0, bytes.length))! = -1) {fos.write (byte, 0, panjang); } /** Tutup aliran buffered dan aliran input dan output* / bos.close (); fos.close (); bis.close (); is.close (); } string publik getBody (string val) {string zyf = val.replaceall ("</? [^>]+>", ""); // Lihatlah <html> tag return zyf;} public void writetxt (string str, string writePath) {file writeName = file baru (writePath); coba {writeName.createNewFile (); BufferedWriter out = BufferedWriter baru (FileWriter baru (WriteName)); out.write (str); out.flush (); out.close (); } catch (ioException e) {e.printstacktrace (); }}Mengambil halaman web dongeng "The Stupid Wolf Going to School" sebagai contoh, jalur dokumen diatur ke "e:/work/lucene/test/data/html" dan "e:/work/lucene/test/data/txt". Dua parameter yang perlu ditetapkan saat membaca halaman web dinamai nama file dan mendapatkan URL URL tujuan. Buat fungsi utama baru untuk mengimplementasikan panggilan ke dua metode. Implementasi spesifik ditunjukkan pada Gambar 3-3:
public static void main (string [] args) {string filename = "jingdizhi"; // nama file string url = "http://www.51test.net/show/8072125.html"; "E: // work // lucene // test // data // html //"+filename+".html"; // tulis jalur file html+file string writeTePath = "e: // work // lucene // test // data // txt //"+nama file+". url2html = URL2HTML baru (); coba {url2html.way (filepath, url); } catch (Exception e) {E.PrintStackTrace (); } Html2txt html2txt = html2txt baru (); String baca = html2txt.readfile (filepath); // Baca html file string txt = html2txt.getbody (baca); // hapus tag html tag system.out.println (txt); coba {html2txt.writetxt (txt, writePath); } catch (Exception e) {E.PrintStackTrace (); }}Setelah menjalankan program, buat "Silly Wolf School.html" dan "Silly Wolf School.txt" masing -masing dalam dua folder.
4. Buat indeks
Prinsip -prinsip dasar pengindeksan dan kueri adalah sebagai berikut:
Pengindeksan: Pengindeksan mesin pencari sebenarnya untuk mengimplementasikan struktur data spesifik dari "matriks kata-dokumen". Ini juga merupakan langkah pertama dalam pengambilan teks lengkap. Lucene menyediakan kelas IndexWriter untuk manajemen indeks, terutama termasuk add (), delete (), dan update (). Ada juga pengaturan bobot. Melalui pengaturan bobot indeks yang berbeda, Anda dapat kembali sesuai dengan ukuran korelasi selama pencarian.
Pencarian: Pencarian langsung asli adalah mencari dokumen secara berurutan. Setelah membuat indeks, Anda dapat menemukan lokasi di mana kata indeks muncul dalam dokumen dengan mencari indeks, dan kemudian mengembalikan posisi dan kata dalam dokumen yang item indeks benar. Lucene menyediakan kelas IndexSearcher untuk mencari dokumen. Formulir pencarian terutama dibagi menjadi dua kategori. Kategori pertama adalah istilah, yang mencari item istilah tunggal; Kategori kedua adalah parser, yang dapat menyesuaikan ekspresi pencarian dan memiliki lebih banyak formulir pencarian. Metode spesifik akan ditunjukkan nanti.
4.1 Lingkungan Eksperimental
PC ini menggunakan sistem Windows 10x64, memori 8G, dan 256G SSD. Lingkungan pengembangan adalah Myeclipse 10, dan versi JDK adalah 1.8. Selama percobaan, karena beberapa perubahan sintaks, beberapa kelas diimplementasikan menggunakan versi 1.6.
4.2 Membuat indeks
Membuat pustaka indeks adalah menambahkan catatan indeks ke perpustakaan indeks. Lucene menyediakan antarmuka untuk menambahkan catatan indeks dan menambahkan indeks.
Ini terutama menggunakan tiga kategori: "Write Indexer", "Document" dan "Domain". Untuk membuat indeks, Anda harus terlebih dahulu membangun objek dokumen dan menentukan berbagai bidang dokumen. Ini mirip dengan pembentukan struktur tabel dalam database relasional. Dokumen setara dengan baris rekaman dalam tabel, dan bidangnya setara dengan kolom berturut -turut. Di Lucene, untuk persyaratan output properti dan data dari berbagai domain, aturan bidang indeks/toko yang berbeda dapat dipilih untuk domain. Dalam percobaan ini, nama file nama file, jalur file fullpath dan konten teks digunakan sebagai bidang dokumen.
IndexWriter bertanggung jawab untuk menerima dokumen yang baru ditambahkan dan menulisnya ke perpustakaan indeks. Saat membuat Write IndexWriter IndexWriter, Anda perlu menentukan penganalisa bahasa yang Anda gunakan. Penciptaan indeks dibagi menjadi dua kategori: yang pertama: indeks tidak tertimbang; Yang kedua: indeks tertimbang.
Public Indexer (String IndexDir) melempar Exception {direktori dir = fsdirectory.open (paths.get (indexdir)); Analyzer analyzer = new StandardAnalyzer (); // pembagi kata standar // smartchineseanalyzer analyzer = new smartchineseanalyzer (); IndexWriterConfig IWC = IndexWriterConfig baru (Analisis); penulis = indexWriter baru (DIR, IWC); }Atur bidang indeks, dan toko menunjukkan apakah konten indeks disimpan: nama file dan fullpath mengambil lebih sedikit memori dan dapat disimpan untuk memfasilitasi pengembalian kueri.
Dokumen Pribadi GetDocument (File f) melempar Exception {document doc = new Document (); doc.add (Textfield baru ("konten", filereader baru (f))); doc.add (Textfield baru ("nama file", f.getName (), Store.yes)); doc.add (Textfield baru ("FullPath", F.GetCanonicalPath (), Store.yes)); // Path Index Return Doc; }Hasilnya setelah mengeksekusi kode utama ditampilkan pada gambar: Saat mengindeks file, desain mengembalikan file "file indeks: + path file" dan menghitung waktu yang dibutuhkan untuk menghasilkan indeks semua file.
4.3 Hapus dan ubah indeks
Secara umum, operasi pada basis data termasuk CRUD (Tambah, Hapus, Perubahan, Kueri). Menambahkan berarti memilih dan membuat item indeks. Permintaan, sebagai fungsi yang lebih inti, akan dibahas nanti. Di sini kami mencatat metode yang digunakan saat menghapus dan memperbarui indeks.
Penghapusan dibagi menjadi dua jenis, termasuk penghapusan biasa dan penghapusan lengkap, karena penghapusan indeks mempengaruhi seluruh database. Selain itu, untuk sistem besar, menghapus indeks berarti mengubah lapisan yang mendasari sistem, yang memakan waktu dan padat karya dan tidak dapat dikembalikan. Ketika indeks pertama kali diindeks, beberapa file kecil dihasilkan setelah indeks ditetapkan. Saat mencari, setiap file akan digabungkan dan kemudian dicari. Penghapusan biasa hanyalah tanda sederhana dari indeks yang ditetapkan sebelumnya, yang membuatnya tidak mungkin untuk mencari dan kembali. Penghapusan lengkap berarti menghancurkan indeks dan tidak dapat dicabut. Ambil contoh menghapus indeks dengan item indeks "id" dari 1:
Penghapusan normal (hapus sebelum bergabung):
writer.deletedocuments (istilah baru ("id", "1")); writer.commit ();Benar -benar hapus (hapus setelah bergabung):
writer.deletedocuments (istilah baru ("id", "1")); writer.forcemergedeletes (); // force delete writer.commit ();Prinsip memodifikasi indeks relatif sederhana, yaitu untuk mengimplementasikan cakupan berdasarkan indeks asli. Kode implementasi sama dengan penambahan indeks dalam teks di atas. Saya tidak akan menjelaskannya di sini.
4.4 Pembobotan Indeks
Lucene diurutkan berdasarkan relevansi secara default. Lucene menyediakan bidang dengan parameter peningkatan yang dapat diatur. Parameter ini digunakan untuk menunjukkan pentingnya catatan. Ketika kondisi pencarian dipenuhi, catatan dengan kepentingan tinggi akan diberikan prioritas dan hasil pengembalian akan ditutup. Jika ada banyak catatan, catatan dengan bobot rendah akan diperingkat di belakang beranda. Oleh karena itu, operasi pembobotan pada indeks adalah faktor penting yang mempengaruhi kepuasan hasil pengembalian. Ketika benar -benar merancang sistem informasi, harus ada rumus perhitungan berat yang ketat untuk memfasilitasi perubahan berat lapangan dan lebih baik memenuhi kebutuhan pengguna.
Misalnya, mesin pencari akan memiliki tarif klik tinggi, dan halaman web yang ditautkan dan keluar akan peringkat halaman pertama saat mereka kembali. Kode implementasi ditunjukkan pada Gambar 4-1, dan pasangan hasil tertimbang jumlah yang tidak tertimbang ditunjukkan pada Gambar 4-2.
TextField Field = TextField baru ("FullPath", F.GetCanonicalPath (), Store.yes); if ("A Great Loef.txt" .Equals (f.getName ())) {field.setBoost (2.0f); // Berat jalur fullpath dengan nama file Second Story.txt; } // Berat default adalah 1.0, dan ubah menjadi 1.2 untuk menambah berat. doc.add (bidang);Gambar 4-1: Pembobotan Indeks
Gambar 4-2: Sebelum bobot
Gambar 4-2: Setelah bobot
Seperti yang dapat dilihat dari hasil Gambar 4-2, ketika ditimbang, dikembalikan dalam urutan kamus. Oleh karena itu, sebelum yang kedua, yang pertama tertimbang dan urutan file bernama kedua diubah ketika pengembalian dikembalikan, mewujudkan tes berat.
5 Lakukan kueri
Antarmuka pencarian Lucene terutama terdiri dari tiga kelas: QueryParser, IndexSearcher, dan Hits. QueryParser adalah parser kueri, yang bertanggung jawab atas kata kunci kueri parsing yang dikirimkan oleh pengguna. Saat membuat parser baru, Anda perlu menentukan domain untuk diuraikan dan penganalisa bahasa apa yang akan digunakan. Penganalisa bahasa yang digunakan di sini harus sama dengan parser yang digunakan ketika pustaka indeks ditetapkan, jika tidak hasil kueri akan salah. IndexSearcher adalah pencari indeks. Saat Instantiating IndexSearcher, Anda perlu menentukan direktori di mana perpustakaan indeks berada. IndexSearcher memiliki metode pencarian untuk melakukan pencarian indeks. Metode ini menerima kueri sebagai parameter dan mengembalikan hit. Hists adalah kumpulan serangkaian hasil kueri yang diurutkan. Elemen koleksi adalah dokumen. Melalui metode GET Dokumen, Anda dapat memperoleh informasi tentang file yang sesuai dengan dokumen ini, seperti: nama file, jalur file, konten file, dll.
5.1 Kueri Dasar
Seperti yang ditunjukkan pada gambar, ada dua cara utama untuk meminta, tetapi disarankan untuk menggunakan jenis pertama dari konstruksi ekspresi queryparser, yang dapat memiliki kombinasi yang fleksibel, termasuk ekspresi logis boolean, pencocokan fuzzy, dll., Tetapi jenis istilah kedua hanya dapat digunakan untuk kueri kosa kata.
1. Bangun formulir kueri queryparser:
Queryparser parser = queryparser baru ("fullpath", analyzer); kueri kueri = parser.parse (q);2. Kueri untuk item tertentu:
Istilah t = istilah baru ("nama file", q); kueri kueri = termquery baru (t);Hasil kueri ditunjukkan pada Gambar 5-1: Ambil nama file nama file kueri yang berisi "besar" sebagai contoh.
Gambar 5-1: Hasil kueri "besar"
5.2 Kueri Fuzzy
Saat membangun queryparser, pencocokan yang tepat dan pencocokan fuzzy dapat dicapai dengan memodifikasi istilah q. Pencocokan fuzzy dimodifikasi dengan menambahkan "~" setelah "Q". Seperti yang ditunjukkan pada Gambar 5-2:
Gambar 5-2: pencocokan fuzzy
5.3 Kueri Kondisi yang Berkualitas
Kueri logis boolean dan kueri fuzzy hanya perlu mengubah kata kueri Q, sementara kueri bersyarat terbatas perlu mengatur ekspresi kueri, yang terutama dibagi menjadi kategori berikut:
Ini adalah pencarian rentang item yang ditentukan, kisaran angka yang ditentukan, awal string yang ditentukan dan kueri multi-kondisi, yang masing-masing mencantumkan kueri yang diterapkan. Parameter yang sebenarnya mengacu pada apakah batas atas dan bawah disertakan.
Tentukan rentang item:
TERMRANGEQUERY QUERY = NEW TERMRANGEQUERY ("DESC", BYTESREF BARU ("B" .getBytes ()), Bytesref baru ("c" .getbytes ()), true, true);Tentukan rentang angka:
NumericrangeQuery <Integer> query = numericrangeQuery.newintrange ("id", 1, 2, true, true);Tentukan awal string:
Query awalan = awalan baru (istilah baru ("kota", "a"));Kueri multi-kondisi:
NumericrangeQuery <Integer> query1 = numericrangeQuery.newintrange ("id", 1, 2, true, true); query prefixQuery2 = prefixQuery baru (istilah baru ("kota", "a")); booleanquery.builder booleanQuery = baru " Booleanquery.builder (); booleanquery.add (query1, booleanclause.occur.must); booleanquery.add (query2, booleanclause.occur.must);5.4 Sorot kueri
Di mesin pencari seperti Baidu dan Google, saat meminta, halaman web yang dikembalikan akan ditampilkan dengan warna merah ketika berisi kata kunci kueri dan akan ditampilkan secara ringkas, yaitu, beberapa konten yang berisi kata kunci dicegat dan dikembalikan. Kueri Sorot adalah mewujudkan perubahan gaya pada kata kunci. Eksperimen ini dilakukan di Myeclipse. Tidak akan ada perubahan gaya saat mengembalikan hasilnya. Ini hanya akan menambahkan tag HTML ke kata kunci yang mengembalikan konten. Jika ditampilkan di halaman web, perubahan gaya akan terjadi.
Kode pengaturan yang disorot ditunjukkan pada Gambar 5-3, dan hasilnya ditunjukkan pada Gambar 5-4. Kata -kata pencocokan Nanjing akan ditambahkan dan diberi label, yang akan tebal dan merah saat ditampilkan di halaman web.
Queryscorer scorer = queryscorer baru (kueri); fragmenter fragmenter = new SimpleSpanFragmenter (pencetak gol); simpleHtmlformatter SimpleHtMlformatTatter = new SimpleHtMlformatTatter ("<b> <font color = 'Red'>," </font> </b> "; pencetak gol); highlighter.settextFragmenter (fragmenter);Gambar 5-3: Pengaturan Sorot
Gambar 5-4: Sorot hasilnya
6 masalah dan kekurangan yang dihadapi selama percobaan
Versi Lucene diperbarui dengan cepat, dan koneksi yang baik diperlukan antara versi JDK, versi Eclipse dan versi Lucene, jika tidak itu akan menyebabkan banyak ketidakcocokan. Ada banyak kesulitan dalam versi debug dan pemilihan JDK1.6 dan JDK1.8. Misalnya, metode tambah dalam perayapan web telah dihapus dalam versi 1.8 dan tidak dapat digunakan. Namun, pembacaan kekuatan jalur dokumen fsdirectory.open () mengharuskan JDK1.8 untuk mendukungnya.
Kekurangan percobaan ini terutama tercermin dalam:
Kode ini kurang fleksibel. Saat merangkak halaman web, itu perlu dilakukan secara manual, dan itu perlu dilakukan secara terpisah dalam bahasa Cina dan Inggris. Kode harus ditingkatkan sehingga ada penilaian pada bahasa halaman web, dan kemudian secara otomatis akan memilih dan menjalankan berbagai segmen kata.
Kode ini memiliki reusability yang rendah dan tidak ada klasifikasi dan konstruksi metode yang lebih masuk akal. Untuk kesederhanaan, efeknya pada dasarnya dicapai dengan anotasi dan menandai dalam beberapa kode inti, yang perlu ditingkatkan.
Kode ini rendah dalam portabilitas, dan merangkak halaman web menggunakan versi JDK1.6, dan implementasi Lucene menggunakan versi JDK1.8. Saat mengekspor ke mesin lain, lingkungan perlu sedikit dimodifikasi dan dikonfigurasi, dan operasi satu klik tidak dapat dicapai.
7 Ringkasan
Berdasarkan prinsip-prinsip Lucene, artikel ini memahami ide dan metode pencarian teks lengkap, dan melakukan percobaan dan tes pada fungsi yang umum digunakan. Selama percobaan, saya belajar tentang prinsip -prinsip mesin pencari dan memiliki pengalaman praktis yang lebih baik berdasarkan isi kursus pengambilan informasi. Lucene adalah kerangka teknologi pencarian teks lengkap open source yang sangat baik. Melalui penelitian mendalam tentang itu, kami lebih akrab dengan mekanisme implementasinya. Dalam proses mempelajarinya, kami telah belajar banyak metode dan ide pemrograman yang berorientasi objek. Kerangka kerja dan skalabilitas sistemnya yang baik layak dipelajari.