[Yii Framework] Membuat Search Engine Dengan Zend Search Lucene

Anda ingin membuat fitur pencarian cepat pada website anda? Ada banyak cara anda bisa menggunakan Apache Solr seperti yang sudah pernah saya posting sebelumnya, menggunakan Sphinx, atau menggunakan Apache Lucene.. Untuk tutorial kali ini saya akan post membuat pencarian cepat menggunakan Apache Lucene, tetapi lucene yang dibuat oleh Zend Framework agar kita lebih mudah integrate nya pada PHP. Hal ini sendiri sebenarnya sudah ada pada wiki Yii Framework disini, tapi ga ada salahnya kan saya kemas ulang dan tambahkan sedikit hal disana..

Pertama-tama yang perlu anda lakukan adalah mendownload zend framework disini. Dan sebelum memulai, saya asumsikan anda sudah memahami masalah zend search lucene. Setelah anda mendownload zend lucene, extract file donlotan. Buat folder baru pada direktori “namaAplikasi/protected/”  misal saya beri nama “ZF”. Kemudian pindahkan hasil extractan tadi ke dalam direktori “namaAplikasi/protected/ZF”. Untuk memanggil dan menggunakan fungsi-fungsi yang ada pada zend search lucene, masukkan code berikut pada bagian atas controller yang ingin menggunakan Zend search lucene :

Yii::import('application.ZF.*');
require_once('Zend/Search/Lucene.php');

Code di atas digunakan untuk mendefinisikan file Zend  Framework agar dapat kita gunakan dalam aplikasi kita. Lalu bagaimana melakukan index data yang ada pada database kita? Saya asumsikan kita akan mengindex semua data pada suatu tabel yang kita miliki. Buatlah sebuah action seperti berikut :

public function actionAll()
 {
     $index = new Zend_Search_Lucene(Yii::getPathOfAlias('application.tempatSimpan'), true);

     $posts = NamaModel::model()->findAll();
     foreach($posts as $post)
     {
         $doc = new Zend_Search_Lucene_Document();

         $doc->addField(Zend_Search_Lucene_Field::Keyword('pk',CHtml::encode($post->namaAttribute1), 'utf-8')); 
         $doc->addField(Zend_Search_Lucene_Field::Text('isi',Chtml::encode($post->namaAttribute2), 'utf-8')); 
         $index->addDocument($doc);
     }
     $index->commit();
 }

Pada code di atas kita menyimpan data hasil index kita pada direktori “namaAplikasi/protected/tempatSimpan”, itu dapat dilihat dari definisi pertama fungsi zend search lucene. Kita memasukkan semua data yang ada pada tabel “Namamodel” ke dalam index lucene. Dari code tersebut yang saya index adalah field “namaAttribute1” dengan nama “pk” dan field “namaAttribute2” dengan nama “isi”.

Code di atas kita mengindex semua data dimana semua index akan di kosongkan terlebih dahulu, kemudian baru diisi kembali. Kenapa saya katakan dikosongkan? karena kita mendefinisikan ulang, tidak mengupdate. Bagaimana jika kita hanya ingin menambah satu buah data saja pada index kita? dengan kata lain kita melakukan update pada index data yang sudah ada dan menambahkan satu buah file index? Seperti berikut :

public function actionUpdateField()
 {
     $index = new Zend_Search_Lucene::open(Yii::getPathOfAlias('application.tempatSimpan'), true);

     $doc = new Zend_Search_Lucene_Document();

     $doc->addField(Zend_Search_Lucene_Field::Keyword('pk',CHtml::encode('3'), 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::Text('isi',Chtml::encode('hahahahahah'), 'utf-8')); 
     $index->addDocument($doc);
    $index->commit();
 }

Pada code di atas, saya mendefinisikan Zend Search Lucene dengan kata “Open” yang artinya index yang lama tidak akan dikosongkan melainkan di update. Setelah itu saya menambahkan sebuah document pada index tersebut yang memiliki “pk” =3 dan “isi”=’hahahahahah’. Okeh itu adalah proses update..

Contoh di atas kita melakukan penambahan satu buah document ke dalam index data kita. Lalu bagaimana jika kita ingin melakukan update suatu document yang sudah ada?? Zend Search Lucene sendiri tidak memiliki support untuk melakukan update data(hingga saat ini). Untuk itu, untuk melakukan proses update anda harus menghapus terlebih dahulu document tersebut, lalu menginputnya kembali.. Untuk lebih lengkap, dapat dilihat pada dokumentasinya.

Setelah kita telah melakukan index data, sekarang saatnya kita membuat fitur pencarian pada Zend Search Lucene.. Okeh buatlah action pencarian seperti berikut :

public function actionSearch()
 {
     $term=$_GET['keyword'];
     $index = new Zend_Search_Lucene(Yii::getPathOfAlias('application.tempatsimpan'));
     $results = $index->find($term);
     $query = Zend_Search_Lucene_Search_QueryParser::parse($term); 
     $pages=5;
     $page = new CPagination(count($results));
     $page->pageSize = $pages;

     $dataProvider=new CArrayDataProvider($results,array(
       'keyField' => 'id',
       'totalItemCount'=>count($results),
       'pagination'=>array(
          'pageSize'=>$pages,
         ),
       )
     );

     $this->render('search', compact('dataProvider','results', 'term', 'query','page'));
 }

Penjelasan : pada code di atas, kita melakukan pencarian berdasarkan keyword yang sudah diinput oleh user dari index data pada direktori “namaAplikasi/protected/tempatSimpan”. Setelah itu kita mendapatkan hasil pencariannya. Agar memperindah tampilan, kita membuat pagination pada hasil pencariannya, bisa jadi kan hasilnya sampe 10000 data maka dari itu amat diperlukan fitur pagination. Pagination sendiri kita buat dengan memanfaatkan fitur Carraydataprovider agar mudah diintergrasikan dengan componen yang ada pada Yii.

Lalu pada view, buatlah sebuah file “search.php” lalu isi seperti berikut :

<?php
  $this->pageTitle=Yii::app()->name . ' - Search';
  $this->breadcrumbs=array(
    'Search',
  );
?>
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
   'id'=>'login-form',
   'enableClientValidation'=>true,
   'method'=>'GET',
)); ?>
<?php echo 'Kata Kunci : '; ?>
<?php echo Chtml::textField('keyword','',array('placeholder'=>'Masukan Kata kunci anda...','style'=>'width:340px;')); ?>
<?php echo CHtml::submitButton('Search'); ?>
<?php $this->endWidget(); ?>
</div>
<h3>Hasil Pencarian untuk "<?php echo CHtml::encode($term); ?>"</h3>
<?php 
   if (!empty($results))
   {
      foreach($dataProvider->data as $result)
      { 
 ?> 
     <p><?php echo Chtml::link($query->highlightMatches(CHtml::encode($result->pk)),array('namaModel/view','id'=>$result->pk));?></p>
     <p><?php echo $query->highlightMatches(CHtml::encode($result->isi)); ?></p>
     <hr/>
<?php }
   $this->widget('CLinkPager', array('pages'=>$page,));
  }
  else
  { 
?>
   <p class="error">Tidak ada hasil yang cocok untuk pencarian tersebut.</p>
<?php 
  }
?>

Apabila telah selesai dan anda tidak melakukan kesalahan, maka anda akan mendapati tampilan kurang lebih seperti berikut saat melakukan pencarian :

Anda tertarik membuatnya pada website anda??

Selamat mencoba… Semoga membantu…😀

20 Responses to [Yii Framework] Membuat Search Engine Dengan Zend Search Lucene

  1. Hans says:

    mas itu Yii::getPathOfAlias(‘application.luc’) dapet dari mana ya?kok saya eror disana,,

  2. oh iya, salah mas.. harusnya itu “application.tempatsimpan”.. saya lupa ngrubah yang itu..

  3. santo says:

    Mau tanya bang sabit….
    Apakah bisa jika kita mau mencari dengan keyword berdasarkan huruf saja
    Misalkan saya mau cari “Rumah Sakit” maka saya cukup ketikkan “ru” atau “mah” saja tanpa harus mengetikkan kata “Rumah”

  4. saya belum tahu pasti alogritma di dalamnya jalan seperti apa mas.. tapi sejauh ini saya coba itu ga bisa mas.. harus bener2 sebuah kata yang di cari nya..
    mungkin karena takut misal di ketik huruf “a” malah memunculkan semua field kalo bisa seperti itu mas..

  5. santo says:

    thank’s bang atas masukkan nya

  6. jun says:

    mas, kok undefined index ‘keyword’ ya? kira2 salahnya dimana ya?

  7. itu berrati agan belum definisiin varibel keyword nya.. atau ga ketangkep variabel keyword nya..

  8. vjrhcr says:

    mas beda pencarian pake lucene ini sama filter di CGridView apa?kalo di filter grid, kita masukkan keyword ga lengkap dia masih bisa mengeluarkan hasil,,beda sama lucene ini dia gamau nampilin hasil sama sekali kalo cuma potongan”.

  9. lucene itu pencarian sperti google, misal kalima “saya ingin makan nasi goreng” terus kamu searching keyword “ingin goreng” dia akan keluar hasilnya. Tapi tidak dengan SQL. Kalo ingin lebih ngerti emang harus dengan coba langsung sih..

  10. rensi says:

    pas donlod zendnya kok gak ada searchnnya yaa? jadi Zend/Search/Lucene.php gak ada. mohon link benernya untuk donlod, makasi.

  11. wah, kyak nya salah donlod mas.. mungkin aja itu versi lama mas..

  12. dedi says:

    mas source code untuk php tanpa framework gimana caranya,,maklum newbie

  13. asep says:

    mas mau tanya kalau untuk zend search lucene apakah bisa digunakan untuk php prosedural,

  14. @dedi : wah saya ga pernah buat juga mas..
    @asep : pasti bisa kok mas..

  15. asep says:

    mas mau tanya lagi kalau zend search luncene itu bisa membaca isi file sperti pdf,doc,xls dan ppt gak,,,kalau bisa mohon link reverensinya,,dan untuk koneksi ke php prosedural gimana caranya apa tinggal include saja di phpnya atau gimana,,,

  16. bisa mas.. tapi mas harus pake tools tambahan.. ada yang namanya library xpdf, jadi ntar library itu bisa ngambil text yang ada dari suatu PDF, stelah itu mas bisa langsung masukin isi nya ke dalam index lucene tadi..

  17. repeat says:

    selamat sore mas mau nanya kenapa errornya di mkdir(): Permission denied, apa karena saya udah di upload di FTP? terus yang saya masih bngung untuk tempatsimpan ini maksud apa y? apa membuat file baru atau tempat simpat zend y? terima kasih mas.

  18. Mohon Pencerahannya,…

    Setelah coba script diatas, muncul error berikut.

    Zend_Search_Lucene_Exception

    Index doesn’t exists in the specified directory.

    Thanks,

    Salam

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: