Pengantar Lucene

Dalam pelajaran ini, kita akan memahami cara kerja di balik salah satu engine pencari teks lengkap yang paling kuat, Apache Lucene. Dengan Apache Lucene, kita dapat menggunakan API yang ditampilkan dalam banyak bahasa pemrograman dan membangun fitur yang kita butuhkan. Lucene adalah salah satu engine paling kuat di mana Elasticsearch dibangun. Sebelum kita mulai dengan aplikasi yang mendemonstrasikan cara kerja Apache Lucene, kita akan memahami cara kerja Lucene dan banyak komponennya. Mari kita mulai.

Mengapa Lucene dibutuhkan?

Penelusuran 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? Jawaban untuk ini, tentu saja, adalah dengan bantuan indeks yang dibuatnya. Tapi alih-alih membuat indeks klasik, Lucene memanfaatkanInverted Indices.

Dalam indeks klasik, untuk setiap dokumen, kami mengumpulkan daftar lengkap kata atau istilah yang terdapat dalam dokumen. Dalam indeks terbalik, untuk setiap kata di semua dokumen, kami menyimpan dokumen dan posisi apa kata/istilah ini dapat ditemukan. Ini adalah algoritma standar tinggi yang membuat pencarian sangat mudah. Pertimbangkan contoh berikut untuk membuat indeks klasik:

Doc1 -> {"This", "is", "simple", "Lucene", "sample", "classic", "inverted", "index"}
Doc2 -> {"Running", "Elasticsearch", "Ubuntu", "Update"}
Doc3 -> {"RabbitMQ", "Lucene", "Kafka", "", "Spring", "Boot"}

Jika kita menggunakan indeks terbalik, kita akan memiliki indeks seperti:

This -> { (2, 71) }
Lucene -> { (1, 9), (12,87) }
Apache -> { (12, 91) }
Framework -> { (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:

Lucene Workflow

Seperti yang ditunjukkan pada diagram, inilah yang terjadi di Lucene:

  1. Lucene diberi makan dokumen dan sumber data lainnya
  2. Untuk setiap dokumen, Lucene pertama-tama mengonversi data ini menjadi teks biasa, lalu Penganalisis mengonversi sumber ini menjadi teks biasa
  3. Untuk setiap istilah dalam teks biasa, indeks terbalik dibuat
  4. Indeks siap untuk dicari

Dengan alur kerja ini, Lucene adalah engine 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 Indexing yang dibutuhkan.

Komponen Lucene

Di bagian ini, kami akan menjelaskan komponen dasar dan kelas Lucene dasar yang digunakan untuk membuat indeks:

  • Directories: Indeks Lucene menyimpan data dalam direktori
    sistem file normal atau dalam memori jika Anda membutuhkan kinerja lebih. Ini sepenuhnya merupakan pilihan aplikasi untuk menyimpan data di mana pun diinginkan, Database, RAM, atau disk.
  • Documents: Data yang kami masukkan ke engine Lucene perlu dikonversi ke teks biasa. Untuk melakukan ini, kami membuat objek Dokumen yang mewakili sumber data tersebut. Nantinya, saat kita menjalankan kueri penelusuran, sebagai hasilnya, kita akan mendapatkan daftar objek Dokumen yang memenuhi kueri yang kita lewati.
  • Fields: Dokumen diisi dengan kumpulan Fields. Bidang hanyalah sepasang item (nama, nilai). Jadi, saat membuat objek Dokumen baru, kita perlu mengisinya dengan data berpasangan semacam itu.When a Field is invertely indexed, the value of the Field is Tokenized and is available for search. 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:

    Field Indexing

    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.

  • Terms: Istilah mewakili sebuah kata dari teks. Istilah diekstraksi dari analisis dan tokenisasi nilai Fields, dengan demikianTerm is the smallest unit on which the search is run.
  • Analyzers: An Analyzer adalah bagian terpenting dari proses pengindeksan dan pencarian. Penganalisislah yang mengubah teks biasa menjadi Token dan Persyaratan sehingga dapat dicari. Nah, itu bukan satu-satunya tanggung jawab seorang Analyzer. Analyzer menggunakan Tokenizer untuk membuat Token. Seorang Analyzer juga melakukan tugas-tugas berikut:
    • Stemming: An Analyzer mengubah kata menjadi Stem. Ini berarti ‘bunga’ diubah menjadi kata dasar ‘bunga’. Jadi, ketika pencarian ‘bunga’ dijalankan, dokumen akan dikembalikan.
    • Penyaringan: Sebuah Analyzer juga menyaring kata-kata berhenti seperti ‘The’, ‘is’ dll karena kata-kata ini tidak menarik permintaan apapun untuk dijalankan dan tidak produktif.
    • Normalisasi: Proses ini menghilangkan aksen dan tanda karakter lainnya.

    Ini hanya tanggung jawab normal 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:

mvn archetype:generate -DgroupId=com.linuxhint.example -DartifactId=LH-LuceneExample -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Jika Anda menjalankan maven untuk pertama kalinya, dibutuhkan beberapa detik untuk menyelesaikan perintah generate karena maven harus mengdownload semua plugin dan artefak yang diperlukan untuk membuat tugas pembuatan. Berikut adalah tampilan keluaran proyek:

Project Setup

Setelah Anda membuat proyek, jangan ragu untuk membukanya di IDE favorit Anda. Langkah selanjutnya adalah menambahkan Ketergantungan Maven yang sesuai ke proyek. Berikut adalah file pom.xml dengan dependensi yang sesuai:

Related Posts