Tutorial Membuat Search Engine Menggunakan Lucene dan XML

Posted in Lucene, Saturday, January 12th, 2013, by Muhammad Fahmi Al Azhar

Berikut ini adalah tutorial untuk membuat search engine dengan menggunakan library Apache Lucene. Project dibuat dengan menggunakan Netbeans dan Lucene versi 3.4.0

Tutorial ini adalah bagian dari tutorial membuat Search Engine Lucene.

Langsung saja, untuk membuat search engine anda dapat mengikuti tutorial di bawah ini dengan mudah.

Tutorial Membuat Search Engine Menggunakan Lucene dan XML

Pertama buka Netbeans IDE anda, buat project baru dengan nama LuceneProject. Tambahkan Library Lucene  ke dalam project dengan cara: klik kanan folder Libraries di LuceneProject -> Add JAR/Folder. Masukkan library berikut:

lucene-core-3.4.0.jar

lucene-core-3.4.0-javadoc.jar

lucene-test-framework-3.4.0.jar

lucene-test-framework-3.4.0-javadoc.jar

Jika anda menggunakan Lucene dengan versi yang berbeda, silakan menyesuaikan, dan kalau bingung, masukkan saja semua JAR nya #eh

Setelah itu masukkan file XML ke dalam direktori root LuceneProject anda. Berikut ini adalah cuplikan dari file XML tersebut:

DataSiswa.xml

<DATABASE NAME="ABSENSI2010">
<!-- SISWA siswa -->
<SISWA>
<NIS>
1001
</NIS>
<NAMA>
ADI DANUDIRJA
</NAMA>
<KELAS>
X - 1
</KELAS>
<ALAMAT>
Jl. Anggrek 37,Kel. ilir, Gunungsitoli, Nias, Sumatera Utara
</ALAMAT>
</SISWA>

Buatlah Form seperti gambar berikut:

LuceneForm.java

Membuat search engine dengan menggunakna Apache Lucene, Netbeans dan data XML

Lucene Form

Untuk nama variabel dan elemen-elemen GUI dapat dilihat di gambar berikut.

Lucene search engine GUI component Netbeans Java

GUI Component

Selanjutnya, isikan code untuk ke-empat button tersebut:

Reset Button

Digunakan untuk mengosongkan Text Field dan Label ketika sedang terisi keyword dan hasil pencarian.

private void btnResetActionPerformed(java.awt.event.ActionEvent evt) {                                         
        txtSearch.setText("");
        Label.setText("");
}

Delete Index Button

Digunakan untuk menghapus direktori index.

private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {                                          
        DeleteDir deleteDir = new DeleteDir();
        deleteDir.deleteDir();
}

Untuk source code DeleteDir.java dapat dilihat di cara menghapus direktori dengan menggunakan Java

Index Button

Digunakan untuk melakukan indexing pertama kali

private void btnIndexActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Index index=new Index();
        index.run();
}

Untuk code di dalam file Index.java  silakan menuju ke tutorial berikut: Mengindex file XML dengan menggunakan Lucene

Search Button

Digunakan untuk melakukan pencarian dari data yang telah di index sebelumnya.

private void btnSearchActionPerformed(java.awt.event.ActionEvent evt) {                                          
        DataSearch(txtSearch.getText());
        run();
}

Method DataSearch()

public void DataSearch(String keywords) {
        this.keywords = keywords;
        if(searcher==null){
            try{
                indexDir = FSDirectory.open(new File("index"));
                searcher = new IndexSearcher(indexDir);
            }catch (IOException ex) {
                Label.setText(ex.getMessage());
            }
        }
    }

Method run() di file LuceneForm.java

public void run() {       
        TopDocs docs = search();
        String result = getResults(docs);
        Label.setText(result);       
}

Method TopDocs search()

private TopDocs search() {
        TopDocs resultDoc = null;
        try {
            MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_31,
                    new String[]{"NIS", "NAMA", "KELAS", "ALAMAT"},
                    new StandardAnalyzer(Version.LUCENE_31));
            Query query = parser.parse(keywords);
            resultDoc = searcher.search(query, 10);
        } catch (Exception ex) {
            Label.setText(ex.getMessage());
        } return resultDoc;
    }

Method getResult (TopDocs docs)

private String getResults(TopDocs docs) {
        StringBuilder htmlFormat = new StringBuilder();
        htmlFormat.append("<html><body>");
        htmlFormat.append("Ditemukan <b>" + docs.totalHits +"</b> dokumen <br>");
        for (ScoreDoc sd : docs.scoreDocs) {
            int docId = sd.doc;
            try {
                Document doc = searcher.doc(docId);
                htmlFormat.append("<hr>" + "score: " + sd.score
                    + "<br><b>Siswa</b>: " + doc.get("NAMA") +
                    "<br>");
                htmlFormat.append("<b>NIS</b>: " +
                    doc.get("NIS") + "<br>");
                htmlFormat.append("<b>Nama</b>: " +
                    doc.get("NAMA") + "<br>");
                htmlFormat.append("<b>Kelas</b>: " +
                    doc.get("KELAS") + "<br>");
                htmlFormat.append("<b>Alamat</b>: " +
                   doc.get("ALAMAT") + "<br>");
            } catch (IOException ex) {
                Label.setText(ex.getMessage());
            }
        }
        htmlFormat.append("</body></html>");
        return htmlFormat.toString();
}

Selamat mencoba.

Leave a Reply

Your email address will not be published. Required fields are marked *