Membuat Search Engine Sederhana Menggunakan Sphinx Search


Hallo teman-teman pembaca setia blog saya (#narsis). Kali ini saya akan mencoba bikin tutorial dengan judul "Membuat Search Engine Sederhana Menggunakan Sphinx Search". Sebenarnya ini merupakan salah satu tugas dari mata kuliah Temu Kembali Informasi atau kalau bahasa kampung saya "Information Retrieval" Jadi gini, intinya kita akan mencoba membuat Search Engine sederhana layaknya Google, Yahoo, Bing dan lain sebagainya dengan menggunakan Framework Sphinx Search.

Oke langsung saja ke tahap pembuatannya :
1. Download Sphinx Search dan pilih sesuai OS anda.
2. Setelah itu Ekstrak file hasil download tadi dan rename namanya menjadi "sphinx" (tanpa tanda kutip) dan   saya sarankan supaya menaruh folder "sphinx" tadi ke dalam drive C supaya tutorialnya nanti sama.
3. Kemudian di dalam folder sphinx, cari file bernama sphinx.conf.in (buka dengan notepad++) kemudian edit semua isinya menjadi :


source srcxml
{
 type = xmlpipe
 xmlpipe_command = type C:\sphinx\corpus\corpus.xml
 xmlpipe_field = docno
 xmlpipe_field = title
 xmlpipe_field = content
 xmlpipe_fixup_utf8 = 1
}
index test1
{
 source = srcxml
 path = c:/sphinx/data/test1
 docinfo = extern
 min_word_len = 3
 charset_type = utf-8
 enable_star = 0
 html_strip = 0
}
indexer
{
 mem_limit = 32M
}
searchd
{
 port = 9312
 log = c:/sphinx/log/searchd.log
 query_log = c:/sphinx/log/query.log
 read_timeout = 5
 max_children = 30
 pid_file = c:/sphinx/log/searchd.pid
 max_matches = 2500
 seamless_rotate = 1
 preopen_indexes = 0
 unlink_old = 1
}

4. Kemudian buka folder sphinx dan buat folder baru dengan nama "data""corpus" dan "log". Data adalah folder untuk menyimpan hasil indexing, corpus adalah folder untuk corpus, didalam folder ini nanti kita taruh xml kita agar dapat di index oleh sphinx, dan log adalah folder yang digunakan oleh sphinx service ketika berjalan. 
5. Di dalam folder corpus kita buat file xml dengan nama corpus.xml (karena di configurasi di nomer 3 kita namain dengan corpus.xml jadi nama corpusnya harus disamain). File ini merupakan koleksi dokumen yang nantinya bakalan kita index di search engine sederhana yang kita buat yang isinya seperti dibawah (atau bisa juga dibuat sesuai selera anda).

<?xml version="1.0" encoding="utf-8"?>
<sphinx:docset>
<sphinx:schema>
<sphinx:field name="title" attr="string"/>
<sphinx:field name="content" attr="string"/>
<sphinx:attr name="author_id" type="int" bits="16" default="1"/>
</sphinx:schema>
<sphinx:document id="1">
<title>Hamilton Inginkan Kemenangan di Korea GP</title>
<content>
SEOUL, KOMPAS.com - Pebalap tim McLaren, Lewis Hamilton, menginginkan kemenangan di F1 seri Korea Selatan untuk pertama kalinya.
Sejak digelar pada musim 2010, Hamilton dua kali menjadi runner-up di Korsel, karena kalah dari Fernando Alonso pada 2010 dan dari Sebastian Vettel pada 2011.
"Mobil yang saya gunakan di Jepang sangat bagus, dan kami akan memulai lomba di Korsel dengan sangat baik. Kami memiliki peluang dan momentum untuk merebut kemenangan di Korsel," kata Hamilton, Rabu (10/10/2012) di Tokyo.
Ketua tim McLaren , Martin Whitmarsh, mengatakan, dia yakin timnya masih mampu berjuang untuk merebut gelar juara sampai akhir musim pada kategori konstruktor. Whitmarsh juga berharap, Hamilton dan Jenson Button mampu menjadi juara di Sirkuit Yeongam, sehingga peluang timnya tetap terbuka.
"Hasil di Suzuka, Jepang, memperlihatkan, semuanya masih dapat terjadi di kejuaraan ini. Saya yakin kami mampu berjuang dan memenangi gelar juara di musim 2012. Untuk mewujudkannya, kami harus memperkecil selisih poin dari tim Red Bull," kata Whitmarsh.
Saat ini, tim Red Bull memimpin dengan 324 poin atau unggul 41 poin dari tim McLaren.
</content>
</sphinx:document>
<sphinx:document id="2">
<title>Summarecon Serpong dan Citra Gran Cibubur Sabet 2 Penghargaan</title>
<content>
JAKARTA, KOMPAS.com - Summarecon Serpong dan Citra Gran Cibubur meraih dua penghargaan untuk kategori Green Development dan Customer Satisfaction, dalam ajang Indocement Awards 2012 di Jakarta, Rabu (10/10/2012) ini.
Summarecon Serpong menang untuk skala Autonomous City, sedangkan Citra Gran untuk skala pengembang besar.
Untuk kategori Sustainable Development di skala Autonomous City disabet BSD City. Sementara untuk skala pengembang besar diraih oleh Bogor Nirwana Residence.
Summarecon meraih penghargaan, karena telah mengolah limbah cair dan padat yang diproduksi di kawasannya.
</content>
</sphinx:document>
<sphinx:document id="3">
<title>Galaxy Camera, Kamera Android Berbekal 3G dan WiFi</title>
<content>
JAKARTA, KOMPAS.com - Samsung memamerkan perangkat kamera bersistem operasi Android dengan koneksi 3G dan WiFi di Jakarta, Rabu (10/10/2012). Perangkat tersebut bernama Galaxy Camera, yang rencananya bakal dipasarkan di Indonesia bulan November mendatang.
Vice President Mobile Business Samsung Indonesia Andre Rompis mengatakan, Galaxy Camera menghadirkan fitur dan kemampuan kamera yang tidak ditemukan di smartphone.
Kameranya bersensor 16MP BSI CMOS. Lensanya 23mm sudut lebar dengan kemampuan zoom optik 21x. ISO bisa diatur dari 100 hingga 3200. Untuk kemampuan video, Galaxy Camera bisa merekam video full HD 1920x1080p.
</content>
</sphinx:document>
<sphinx:document id="4">
<title>Isi Baterai Lumia Lewat Bantal dan Speaker</title>
<content>
KOMPAS.com - Smartphone berbasis Windows Phone 8 besutan Nokia, Lumia 820 dan Lumia 920, dibekali teknologi pengisian baterai tanpa perantara kabel (wireless). Untuk mengisi daya baterai Lumia, pengguna tinggal meletakannya di perangkat aksesori khusus.
Beberapa perusahaan siap membuat aksesori pengisi daya baterai smartphone secara nirkabel. Perusahaan teknologi audio JBL akan membuat aksesori dock speaker sekaligus pusat pengisi baterai nirkabel. Begitu pula perusahaan furnitur Fatboy yang membuat aksesori berbentuk bantal.
</content>
</sphinx:document>
</sphinx:docset>

6.  Setelah corpusnya selesai, langkah selanjutnya adalah mengindex corpus yang telah kita buat tadi dengan menggunakan command prompt (CMD). Bagi pengguna Windows jalankan CMD sebagai Administrator, selanjutnya jalankan perintah :

c:\sphinx\bin\indexer.exe --config c:\sphinx\sphinx.conf.in --all
Bagi yang gak bisa menjalankan perintah diatas dan terjadi error, coba tambahkan --rotate di akhir perintah seperti :
c:\sphinx\bin\indexer.exe --config c:\sphinx\sphinx.conf.in --all --rotate
7. Apabila sudah sukses, langkah selanjutnya adalah membuat Service Search di Windows, masih dalam CMD ketikkan perintah :
c:\sphinx\bin\searchd --install --config c:\sphinx\sphinx.conf --servicename MySphinxSearch
Untuk nama service yang berwarna merah sebenarnya bisa diganti sesuai dengan keinginan anda. Jika service sudah sukses dibuat, sebelumnya kita cek dulu apakah service MySphinxSearch sudah berjalan apa belum. Caranya kita buka control panel -> administrative tools -> services lalu cari MySphinxSearch jika statusnya belum jalan maka jalankan.
8. Langkah terakhir copy file "sphinxapi.php" dari folder sphinx -> api kedalam folder baru di htdoc dan beri nama aja sphinx. Kemudian buat file php sederhana sebagai antar muka sistem misal dinamain index.php di dalam folder sphinx tadi. Lalu copy-paste kodingan berikut :

<html><title>Sphinx Search</title>
<body>
<form method="get" action="">
<input type="text" name="q" size="70"/>
<input type="submit" name="op" value="search"/>
</form>
<?php
if(isset($_GET['q'])){
if($_GET['q']){
require ( "sphinxapi.php" );
$cl = new SphinxClient();
$cl->SetArrayResult(TRUE);
$cl->SetMatchMode(SPH_MATCH_EXTENDED);
$cl->SetRankingMode (SPH_RANK_BM25);
$res = $cl->Query($_GET['q']);
if ( $res===false ){
print "Query failed: " . $cl->GetLastError() .".\n";
} else {
echo '<p>'.$cl->GetLastWarning().'</p>';
echo '<p>'.$res['total'].' dokumen untuk <i><b>'.$_GET['q'].'</i></b> ('.$res['time'].' detik)</p><ol style=font-family:arial,sans-serif;color:black;text-align:left>';
if ($res['total'] != 0){
echo "<ol>";
foreach($res['matches'] as $data){
$katasubject = explode(" ", $data['attrs']['title']);
//judul artikel
echo "<li>";
echo "<b><font color='blue'>";
for($z=0;$z < count($katasubject);$z++){
if(strtolower($katasubject[$z])==$_GET['q'] || strtoupper($katasubject[$z])==$_GET['q'] ||$katasubject[$z]==$_GET['q'])
echo "<font style=font-style:bold;> <b>".$katasubject[$z]."</b></font> ";
else
echo $katasubject[$z] . " ";
}
echo "</font>";
echo "</b>";
echo "</li>";
$katacontent = explode(" ",$data['attrs']['content']);
//konten artikel
for($z=0; $z < 50;$z++){
if(strtolower($katacontent[$z])==$_GET['q'] || strtoupper($katacontent[$z])==$_GET['q'] ||$katacontent[$z]==$_GET['q']) echo "<font style=font-style:bold;> <b>".$katacontent[$z]."</b></font> ";
else
echo $katacontent[$z]." ";
}
echo "...<br/><br/>";
}
echo "<ol>";
}
}
}
else
echo 'data tidak ditemukan.';
}
?>
</html>

Nahh selanjutnya jalankan file php tersebut di localhost dan coba masukin query yang ada di corpus tadi. Contoh sederhana hasilnya seperti dibawah. Tapi kalau mau desainnya seperti Google bikin aja kodingannya sendiri ya! Hehe


Sumber : rezapancawan.wordpress.com dengan sedikit modifikasi pada kodingan.