Mengapa Lucene dibutuhkan?
Pencarian adalah salah satu operasi paling umum yang kami lakukan beberapa kali sehari. Pencarian ini dapat dilakukan di beberapa halaman web yang ada di Web atau aplikasi Musik atau repositori kode atau kombinasi dari semuanya. Orang mungkin berpikir bahwa database relasional sederhana juga dapat mendukung pencarian. Ini benar. Basis data seperti MySQL mendukung pencarian teks lengkap. Tapi bagaimana dengan Web atau aplikasi Musik atau repositori kode atau kombinasi dari semuanya?? Basis data tidak dapat menyimpan data ini di kolomnya. Bahkan jika itu terjadi, itu akan memakan waktu yang tidak dapat diterima untuk menjalankan pencarian sebesar ini.
Mesin pencari teks lengkap mampu menjalankan kueri pencarian pada jutaan file sekaligus. Kecepatan penyimpanan data dalam aplikasi saat ini sangat besar. Menjalankan pencarian teks lengkap pada volume data semacam ini adalah tugas yang sulit. Ini karena informasi yang kami butuhkan mungkin ada dalam satu file dari miliaran file yang disimpan di web.
Bagaimana Lucene bekerja??
Pertanyaan yang pasti muncul di benak Anda adalah, bagaimana Lucene begitu cepat dalam menjalankan kueri penelusuran teks lengkap full? Jawaban untuk ini, tentu saja, adalah dengan bantuan indeks yang dibuatnya. Tapi alih-alih membuat indeks klasik, Lucene memanfaatkan Indeks Terbalik.
Dalam indeks klasik, untuk setiap dokumen, kami mengumpulkan daftar lengkap kata atau istilah yang dikandung dokumen. Dalam indeks Terbalik, untuk setiap kata di semua dokumen, kami menyimpan dokumen dan posisi apa kata/istilah ini dapat ditemukan di. Ini adalah algoritma standar tinggi yang membuat pencarian menjadi sangat mudah. Pertimbangkan contoh berikut untuk membuat indeks klasik:
Doc1 -> "Ini", "adalah", "sederhana", "Lucene", "sampel", "klasik", "terbalik", "indeks"Doc2 -> "Menjalankan", "Elasticsearch", "Ubuntu", "Perbarui"
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Spring", "Boot"
Jika kita menggunakan indeks terbalik, kita akan memiliki indeks seperti:
Ini -> (2, 71)Lucene -> (1, 9), (12,87)
Apache -> (12, 91)
Kerangka -> (32, 11)
Indeks terbalik jauh lebih mudah dipertahankan. Misalkan jika kita ingin menemukan Apache dalam istilah saya, saya akan memiliki jawaban langsung dengan indeks terbalik sedangkan dengan pencarian klasik akan berjalan pada dokumen lengkap yang mungkin tidak dapat dijalankan dalam skenario waktu nyata.
Alur kerja Lucene
Sebelum Lucene benar-benar dapat mencari data, ia perlu melakukan langkah-langkah. Mari kita visualisasikan langkah-langkah ini untuk pemahaman yang lebih baik:
Alur Kerja Lucene
Seperti yang ditunjukkan pada diagram, inilah yang terjadi di Lucene:
- Lucene diberi makan dokumen dan sumber data lainnya
- Untuk setiap dokumen, Lucene pertama-tama mengonversi data ini menjadi teks biasa dan kemudian Penganalisis mengonversi sumber ini menjadi teks biasa
- Untuk setiap istilah dalam teks biasa, indeks terbalik dibuat
- Indeks siap untuk dicari
Dengan alur kerja ini, Lucene adalah mesin pencari teks lengkap yang sangat kuat. Tapi ini adalah satu-satunya bagian yang dipenuhi Lucene. Kita perlu melakukan pekerjaan itu sendiri. Mari kita lihat komponen Pengindeksan yang dibutuhkan.
Komponen Lucene
Di bagian ini, kami akan menjelaskan komponen dasar dan kelas Lucene dasar yang digunakan untuk membuat indeks:
- Direktori: Indeks Lucene menyimpan data di direktori sistem file normal atau di memori jika Anda membutuhkan lebih banyak kinerja. Ini sepenuhnya merupakan pilihan aplikasi untuk menyimpan data di mana pun diinginkan, Database, RAM, atau disk.
- Dokumen: Data yang kami masukkan ke mesin Lucene perlu dikonversi ke teks biasa. Untuk melakukan ini, kami membuat objek Dokumen yang mewakili sumber data itu. Nantinya, saat kita menjalankan kueri penelusuran, sebagai hasilnya, kita akan mendapatkan daftar objek Dokumen yang memenuhi kueri yang kita lewati.
- bidang: Dokumen diisi dengan kumpulan Bidang. Field hanyalah sepasang pair (nama, nilai) item. Jadi, saat membuat objek Dokumen baru, kita perlu mengisinya dengan data berpasangan semacam itu. Saat Bidang diindeks secara terbalik, nilai Bidang di-Tokenisasi dan tersedia untuk pencarian. Sekarang, saat kita menggunakan Fields, tidak penting untuk menyimpan pasangan yang sebenarnya tetapi hanya yang diindeks terbalik. Dengan cara ini, kita dapat memutuskan data apa yang hanya dapat dicari dan tidak penting untuk disimpan. Mari kita lihat contohnya di sini:
Pengindeksan Bidang
Pada tabel di atas, kami memutuskan untuk menyimpan beberapa bidang dan yang lainnya tidak disimpan. Bidang tubuh tidak disimpan tetapi diindeks. Ini berarti bahwa email akan dikembalikan sebagai hasil ketika kueri untuk salah satu Persyaratan untuk konten isi dijalankan.
- Syarat: Istilah mewakili kata dari teks. Istilah diekstraksi dari analisis dan tokenisasi nilai Fields, dengan demikian Term adalah unit terkecil tempat pencarian dijalankan.
- Penganalisis: Penganalisis adalah bagian terpenting dari proses pengindeksan dan pencarian. Ini adalah Penganalisis yang mengubah teks biasa menjadi Token dan Ketentuan sehingga dapat dicari. Nah, itu bukan satu-satunya tanggung jawab seorang Analyzer. Penganalisis menggunakan Tokenizer untuk membuat Token. Seorang Analyzer juga melakukan tugas-tugas berikut:
- Stemming: An Analyzer mengubah kata menjadi Stem. Artinya 'bunga' diubah menjadi kata dasar 'bunga'. Jadi, ketika pencarian 'bunga' dijalankan, dokumen akan dikembalikan.
- Pemfilteran: Penganalisis juga memfilter kata berhenti seperti 'The', 'is', dll. karena kata-kata ini tidak menarik kueri apa pun untuk dijalankan dan tidak produktif.
- Normalisasi: Proses ini menghilangkan aksen dan tanda karakter lainnya.
Ini hanya tanggung jawab normal dari StandardAnalyzer.
Contoh Aplikasi
Kami akan menggunakan salah satu dari banyak arketipe Maven untuk membuat proyek sampel untuk contoh kami. Untuk membuat proyek, jalankan perintah berikut di direktori yang akan Anda gunakan sebagai ruang kerja:
pola dasar mvn: hasilkan -DgroupId=com.linuxhint.contoh -DartifactId=LH-LuceneExample -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=falseJika Anda menjalankan maven untuk pertama kalinya, dibutuhkan beberapa detik untuk menyelesaikan perintah generate karena maven harus mengunduh semua plugin dan artefak yang diperlukan untuk membuat tugas pembuatan. Berikut adalah tampilan keluaran proyek:
Pengaturan Proyek
Setelah Anda membuat proyek, jangan ragu untuk membukanya di IDE favorit Anda. Langkah selanjutnya adalah menambahkan Ketergantungan Maven yang sesuai ke proyek. Ini pomnya.xml file dengan dependensi yang sesuai:
Terakhir, untuk memahami semua JAR yang ditambahkan ke proyek saat kita menambahkan dependensi ini, kita dapat menjalankan perintah Maven sederhana yang memungkinkan kita melihat Pohon Ketergantungan lengkap untuk sebuah proyek saat kita menambahkan beberapa dependensi ke dalamnya. Berikut adalah perintah yang dapat kita gunakan:
ketergantungan mvn: pohonKetika kita menjalankan perintah ini, itu akan menunjukkan kepada kita Pohon Ketergantungan berikut:
Akhirnya, kami membuat kelas SimpleIndexer yang berjalan
impor jawa.io.Mengajukan;
impor jawa.io.Pembaca File;
impor jawa.io.IOException;
organisasi impor.apache.lusen.analisis.Penganalisis;
organisasi impor.apache.lusen.analisis.standar.Penganalisis Standar;
organisasi impor.apache.lusen.dokumen.Dokumen;
organisasi impor.apache.lusen.dokumen.Lapangan Tersimpan;
organisasi impor.apache.lusen.dokumen.Bidang Teks;
organisasi impor.apache.lusen.indeks.Penulis Indeks;
organisasi impor.apache.lusen.indeks.IndexWriterConfig;
organisasi impor.apache.lusen.toko.FSDirektori;
impor organisasi.apache.lusen.kegunaan.Versi: kapan;
SimpleIndexer kelas publik
private static final String indexDirectory = "/Users/shubham/somewhere/LH-LuceneExample/Index";
private static final String dirToBeIndexed = "/Users/shubham/somewhere/LH-LuceneExample/src/main/Java/com/linuxhint/example";
public static void main(String[] args) melempar Pengecualian
File indexDir = File baru(indexDirectory);
File dataDir = File baru(dirToBeIndexed);
Pengindeks SimpleIndexer = SimpleIndexer baru();
int numIndexed = pengindeks.indeks(indeksDir, dataDir);
Sistem.di luar.println("Jumlah File Terindeks " + numIndexed);
private int index(File indexDir, File dataDir) melempar IOException
Analyzer analyzer = baru StandardAnalyzer(Versi.LUCENE_46);
IndexWriterConfig config = new IndexWriterConfig(Versi.LUCENE_46,
penganalisis);
IndexWriter indexWriter = new IndexWriter(FSDirectory.buka (indeksDir),
konfigurasi);
File[] file = dataDir.daftarFile();
untuk (File f : file)
Sistem.di luar.println("File pengindeksan " + f.getCanonicalPath());
Dokumen dokumen = Dokumen baru();
dokter.add(new TextField("content", new FileReader(f)));
dokter.tambahkan(new StoredField("fileName", f.getCanonicalPath()));
penulis indeks.tambahkanDokumen(dok);
int numIndexed = indexWriter.maxDoc();
penulis indeks.Menutup();
kembali numIndexed;
Dalam kode ini, kami baru saja membuat instance Dokumen dan menambahkan Bidang baru yang mewakili konten File. Berikut adalah output yang kami dapatkan ketika kami menjalankan file ini:
File pengindeksan /Users/shubham/somewhere/LH-LuceneExample/src/main/Java/com/linuxhint/example/SimpleIndexer.JawaTotal file yang diindeks 1
Juga, direktori baru dibuat di dalam proyek dengan konten berikut:
Data Indeks
Kami akan menganalisis semua file apa yang dibuat dalam Indeks ini dalam pelajaran selanjutnya di Lucene.
Kesimpulan
Dalam pelajaran ini, kami melihat cara kerja Apache Lucene dan kami juga membuat contoh aplikasi sederhana yang berbasis Maven dan java.