Written by Jefri Pakpahan / PHP, Programming

Posted with : Lucene, Search Engine, Zend


Setelah sekian lama tidak mengisi blog, akhirnya baru ada niat ngisi blog lagi. kali ini saya akan mengangkat topik yang berbeda dengan sebelumnya belajar mybatis 3 yaitu Membuat Search Engine dengan Zend Search Lucene. Saya membuat tutorial di karena kan karena ada tugas Temu Kembali Informasi (TKI), ya lagi-lagi tugas kuliah (namanya juga anak kuliahan).

Zend_Search_Lucene adalah full-text search engine framework porting dari Apache Lucene dan bagian dari Zend Framework , Anda dapat mendownload di web tersebut . Zend_Search_Lucene menjanjikan cara sederhana untuk menambahkan fungsi pencarian ke aplikasi tanpa membutuhkan tambahan ekstensi php atau bahkan database.

Langsung saja kita praktikan

1. Membuat Index
Sebelum kita mencari data terlebih dahulu Anda harus membuat Indexing yang akan mengumpulkan, mem-parsing, dan menyimpan data untuk memudahkan pencarian informasi yang cepat dan akurat

Disini kita akan mencoba mengindex file xml

File data.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="iso-8859-1"?>
<documents>
<document>
<id>1</id>
<title>first title on document</title>
<content>Ilkomers content </content>
<published>1012325463</published>
</document>
<document>
<id>3</id>
<title>Search Lucene by Jefri Rahmat Yusuf </title>
<content>tki search lucene from xml data</content>
<published>1012356463</published>
</document>
<document>
<id>4</id>
<title>Temu Kembali Informasi</title>
<content>Temu kembali informasi (tki) with lucene by Jefri Rahmat Yusuf another document</content>
<published>1012445463</published>
</document>
<document>
<id>6</id>
<title>another Title in Lucene</title>
<content>This is another document for lucene</content>
<published>1013325467</published>
</document>
</documents>

File indexing.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
require_once 'Zend/Search/Lucene.php';

function sanitize($input) {
return htmlentities(strip_tags( $input ));
}

$xml = 'data.xml';
//cek file xml
if (file_exists($xml)){
$xml = simplexml_load_file($xml);
} else {
exit('Error.');
}

//directory data temporary untuk indexing
$xml_index = 'index/xml_index';

$index = new Zend_Search_Lucene($xml_index,true);
// index setiap item
foreach ($xml as $item) {
if ($item->title && $item->content) {
$doc = new Zend_Search_Lucene_Document();

$doc->addField(Zend_Search_Lucene_Field::Keyword('title',sanitize($item->title)));
$doc->addField(Zend_Search_Lucene_Field::Text('content',sanitize($item->content)));
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('published',sanitize($item->published)));

echo "\tMengindex: <b>".$item->title."</b><br/>";
$index->addDocument($doc);
}
}
$index->commit();
echo '<br/>'.$index->count()." Dokumen terindex.\n";
?>

Pertama yang dilakukan adalah cek file xml

1
2
3
4
5
6
7
$xml = 'data.xml';
//cek file xml
if (file_exists($xml)){
$xml = simplexml_load_file($xml);
} else {
exit('Error.');
}

Lalu tentukan directori untuk menampung data indexing

1
2
//directory data temporary untuk indexing
$xml_index = 'index/xml_index';

Lalu indexing data xml

1
2
3
4
5
6
7
8
9
$index = new Zend_Search_Lucene($xml_index,true);
// index setiap item
foreach ($xml as $item) {
if ($item->title && $item->content) {
//buat dan index dokumen
}
}
$index->commit();
echo '<br/>'.$index->count()." Dokumen terindex.\n";

Untuk membuat dokumen ke index, kita harus membuat document object dan field konten yang spesifik yang akan kita index, dalam hal ini kita akan mengindex title, content dan published.

1
2
3
4
5
6
$doc->addField(Zend_Search_Lucene_Field::Keyword('title',sanitize($item->title)));
$doc->addField(Zend_Search_Lucene_Field::Text('content',sanitize($item->content)));
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('published',sanitize($item->published)));

echo "\tMengindex: <b>".$item->title."</b><br/>";
$index->addDocument($doc);

Item-item yang akan di index terlebih dahulu di sanitasi (sanitize). Berikut adalah keterangan dari masing-masing Zend_Search_Lucene_Field

Zend_Search_Lucene_Field::Keyword // Field is not tokenized, but is indexed and stored within the index.

Zend_Search_Lucene_Field::UnIndexed // Field is not tokenized nor indexed, but is stored in the index.

Zend_Search_Lucene_Field::Binary // Binary String valued Field that is not tokenized nor indexed, but is stored in the index.

Zend_Search_Lucene_Field::Text
// Field is tokenized and indexed, and is stored in the index.

Zend_Search_Lucene_Field::UnStored
// Field is tokenized and indexed, but is not stored in the index.

2. Pencarian Index

Sebelumnya kita sudah membuat Zend_Search_Lucene index pada data, mari kita implementasikan pencarian.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
require_once 'Zend/Search/Lucene.php';

//buka file index
$index = new Zend_Search_Lucene('index/xml_index');

$query = 'jefri';

if(strlen($query)<4)
{
die('Kata-kata harus lebih dari 3 huruf');
}

$hits = $index->find($query);
echo "Index Mempunyai ".$index->count()." dokumen.<br/>";
echo "Pencarian untuk query '".$query."' menghasilkan " .count($hits). " hits<br/>";

foreach ($hits as $hit) {
echo "<pre>";
echo $hit->title."<br/>";
echo $hit->content."<br/>";
echo "\tScore: ".sprintf('%.2f', $hit->score)."<br/>";
}
?>

Kita include library , dan buka file index dan cari term lalu looping hasil, kita dapat melakukan pencarian query dengan multiple query terms.

Zend_Search_Lucene sangat Powerfull dan simpel, untuk dokumentasi lengkap dapat dilihat di file document yang ada di Zend Framework atau http://framework.zend.com/manual/en/zend.search.lucene.html.

Sekian.

sumber bacaan : http://devzone.zend.com/397/roll-your-own-search-engine-with-zend_search_lucene/



blog comments powered by Disqus