Java : Membuat Search Engine Sederhana Menggunakan Lucene

Hey all, tidak terasa sekarang kita sudah memasuki bulan Ramadhan ya ūüôā Bagi yang beragama Islam, saya ucapkan selamat menjalankan ibadah puasa, semoga bulan ini membawa berkah kepada kita semua.

Oke, kali ini saya akan mencoba berbagi tutorial tentang cara membuat search engine sederhana menggunakan Lucene. Bagi yang belum tau, Lucene adalah framework untuk search engine, information retrieval dan recommender system buatan Apache Software Foundation. Lucene terkenal dan banyak digunakan karena pengimplementasiannya yang sangat mudah, yang akan saya tunjukkan pada postingan kali ini.

Download Lucene

Pertama-tama, kalian harus men-download library Lucene terlebih dahulu. Bisa di-download pada link ini. Versi Lucene yang digunakan adalah Lucene versi 4.2.1.

Setelah itu, buatlah project Java baru pada Netbeans dengan nama package id.web.twoh.lucene.se. Supaya menjadi sebuah search engine sederhana, project itu harus menggunakan beberapa library Lucene yang penting. Setelah project baru selesai dibuat, impor library yang dibutuhkan, yaitu :

  • lucene-core-4.2.1.jar, ini adalah¬†library¬†inti dari Lucene
  • lucene-queryparser-4.2.1.jar, library yang berfungsi untuk mem-parsing query
  • lucene-analyzers-common-4.2.1.jar,¬†library yang berfungsi untuk melakukan fungsi-fungsi analisis pada search engine

Library tersebut bisa kalian temukan di dalam folder Lucene yang telah kalian download dari link di atas.

Code Craftmanship

Jika ke semua¬†library¬†sudah diimpor, maka sekarang kita akan menuliskan kode program-nya. Pada contoh ini, kita akan membuat sebuah program sederhana untuk mencari lowongan kerja berdasarkan kota. Cara kerjanya, kita memasukkan nama kota dan kemudian akan keluar hasil berupa lowongan pekerjaan yang ada pada kota tersebut. Sangat simpel bukan. ūüėČ

Indexing

Untuk membuat sebuah mesin pencari, hal pertama yang harus kita lakukan adalah melakukan indexing terlebih dahulu terhadap data yang ada. Proses ini dilakukan pada file Index.java yang akan kita buat. Buatlah sebuah file .java dengan nama Index, dan copy paste kan kode berikut.

Index.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package id.web.twoh.lucene.se;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

/**
 *
 * @author Herdi Naufal
 */
public class Index {

    public Directory doIndexing()
    {
        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);

        // Membuat index baru dalam bentuk RAMDirectory
        Directory index = new RAMDirectory();

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, analyzer);
        try {
            IndexWriter w = new IndexWriter(index, config);
            //Menambahkan dokumen yang di-index
            addDoc(w, "Semarang", "Lowongan Android Programmer");
            addDoc(w, "Semarang", "Lowongan User Interface Desinger");
            addDoc(w, "Bandung", "Dicari Developer Java");
            addDoc(w, "Jakarta", "Dicari Web Designer");
            addDoc(w, "Jakarta", "Lowongan Android UI Designer");
            addDoc(w, "Jakarta", "Lowongan Developer Apple");
            addDoc(w, "Jakarta", "Dicari Developer Dot Net");
            addDoc(w, "Jakarta", "Dicari JSP Developer");
            addDoc(w, "Bandung", "Lowongan Data Analis");
            addDoc(w, "Bogor", "Lowongan Mobile Application Developer");
            addDoc(w, "Bandung", "Dicari Developer PHP");
            addDoc(w, "Tangerang", "Dicari Web Designer familiar dengan CodeIgniter");
            addDoc(w, "Jogjakarta", "Lowongan Windows Phone Development");
            addDoc(w, "Semarang", "Lowongan User Interface Desingner");
            addDoc(w, "Bandung", "Dicari Developer Java Enterprise");
            addDoc(w, "Bandung", "Dicari Master Java");
            addDoc(w, "Surabaya", "Dicari Developer Cloud Application (Java)");
            addDoc(w, "Semarang", "Dibutuhkan developer Linux ");

            w.close();
        } catch (IOException ex) {
            Logger.getLogger(Index.class.getName()).log(Level.SEVERE, null, ex);
        }

        return index;
    }

    //method yang digunakan untuk menambahkan dokumen ke index
    private static void addDoc(IndexWriter w, String city, String job) throws IOException {
        Document doc = new Document();
        doc.add(new TextField("title", city, Field.Store.YES));
        doc.add(new StringField("isbn", job, Field.Store.YES));
        w.addDocument(doc);
    }

}

Searching

Setelah proses indexing, berikutnya kita akan melakukan proses searching. Proses ini bekerja dengan cara menggunakan query kota yang diinputkan oleh pengguna, yang kemudian akan dicocokkan dengan data lowongan pekerjaan yang ada di index. Buatlah file Search.java, dan copy pastekan kode berikut.

Search.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package id.web.twoh.lucene.se;

import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Version;

/**
 *
 * @author Herdi Naufal
 */
public class Search {

    public void doSearching(String args) throws ParseException, IOException
    {
        Index indexing = new Index();
        Directory index = indexing.doIndexing();
        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);
        String querystr = args;

        // "title" arg adalah data yang digunakan untuk pencarian
        // jika tidak ada data yang dispesifikasikan pada query
        Query q = new QueryParser(Version.LUCENE_42, "title", analyzer).parse(querystr);

        // Proses pencarian
        int hitsPerPage = 10;
        try (IndexReader reader = DirectoryReader.open(index)) {
            IndexSearcher searcher = new IndexSearcher(reader);
            TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
            searcher.search(q, collector);
            ScoreDoc[] hits = collector.topDocs().scoreDocs;

            // Menampilkan hasil pencarian
            System.out.println("Menemukan " + hits.length + " lowongan kerja di Semarang.");
            for(int i=0;i<hits.length;++i) {
              int docId = hits[i].doc;
              Document d = searcher.doc(docId);
              System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title"));
            }
        }
    }

}

Main program

Setelah file yang berperan untuk indexing dan searching selesai dibuat, yang terakhir adalah membuat file utama yang berisi main program. Buatlah sebuah file .java bernama HelloLucene, file ini akan berfungsi sebagai tampilan utama program dimana pengguna bisa menginputkan nama kota, dan menjalankan proses searching dan juga indexing. Kodenya adalah seperti berikut.
HelloLucene.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package id.web.twoh.lucene.se;

/**
 *
 * @author Herdi Naufal
 */
import java.io.IOException;
import java.util.Scanner;
import org.apache.lucene.queryparser.classic.ParseException;

public class HelloLucene {
  public static void main(String[] args) throws IOException, ParseException {

      String kota;
      System.out.print("Masukkan nama kota: ");
      Scanner in = new Scanner(System.in);
      kota = in.nextLine();
      Search search = new Search();
      search.doSearching(kota);

  }
}

DEMO

Tampilan Awal Search Engine

Tampilan Awal Search Engine

Kita coba masukkan kota Semarang (kuthane dewe) ūüėÄ

 

Hasil lowongan kerja di kota Semarang

Hasil lowongan kerja di kota Semarang

Tentunya aplikasi ini masih sangat sederhana sekali, dan hanya untuk kepentingan demonstrasi Lucene saja. ūüôā Semua kembali kepada pembaca sekalian untuk mengembangkan tutorial ini ke aplikasi yang lebih kompleks.





Download aplikasi kami di Google Play Store


Tutorial Menarik Lainnya :

3 Comments

  1. Hendrik March 11, 2015
  2. Abdiansah April 4, 2015
    • amril November 5, 2015

Leave a Reply

Do NOT follow this link or you will be banned from the site!