Senin, 08 Juni 2015

Search Engine

Membuat Search Engine Menggunakan PHP Swish 0.5.0 pada Ubuntu 12.04 / 12.10 / 13.04

SWISH-E adalah singkatan dari Simple Web Indexing System for Humans - Enhanced. Swish-e sendiri di bawah lisensi GPL, tetapi menggunakan klausul yang memungkinkan aplikasi untuk menghubungkan terhadap library jika setiap salinan dari dokumen disertai dengan URL ke Swish-e code.
PHP PNGSwish-e transparent big PNG
PHP Swish menggunakan dua alat pengindeksan, Sphinx dan menggunakan Zend Framework Lucene. PHP Swish menggunakan fungsi yang disediankan oleh Swish-e untuk memanggil index yang telah dibangun sebelumnya. Check out daftar lengkap fiturnya disini.

1. Installasi PHP Swish versi 0.5.0

Installasi PHP Swish dilakukan dengan mendownload terlebih dahulu versi PHP-Swish disini atau langsung mengetikkan perintah di terminal dengan versi Swish 0.5.0. Untuk menginstal PHP Swish, dibutuhkan instalasi Swish-e terlebih dahulu seperti yang telah dibahas sebelumnya pada Instalasi Swish-E 2.4.7. Apabila Swish-e telah terinstal, maka dapat dilakukan tahapan berikut ini:
  1. ryan@Venom :~ wget http://pecl.php.net/get/swish-0.5.0.tgz
Setelah selesai didownload, kemudian masuk pada directory tempat file swish-0.5.0.tgz disimpan dan ektrak file tersebut menggunakan perintah
  1. ryan@Venom :~ gzip -dc swish-0.5.0.tgz | tar xof -
Setelah berhasil di ekstrak kemudian masuk pada directory swish (directory ini tergantung pada versi Swish )
  1. ryan@Venom :~ cd swish-0.5.0
untuk melakukan konfirgurasi pada config.m4.
  1. ryan@Venom :~ phpize
Apabila error dapat dilakukan step berikut ini. Tetapi Apabila berhasil, maka file configure akan di ekstrak. Kemudian lakukan konfirgurasi file php swish
  1. ryan@Venom :~ ./configure
Dan lakukan testing pada swish configuration menggunakan perintah
  1. ryan@Venom :~ make && make test
Kemudian akses ke root untuk melakukan proses instalasi
  1. ryan@Venom :~ sudo su
Setelah berada sebagai root kemudian lakukan penginstalan php swish dengan menggunakan perintah
  1. root@Venom :~ make install
Cari file php.ini, biasanya pada lokasi:
  1. root@Venom :~ vim /etc/php5/apache2/php.ini
Kemudian tambahkan directory file swish.so pada akhir baris sesuai dengan lokasi dari directory file tersebut. Misalnya:
  1. extension=/usr/lib/php5/20100525+lfs/swish.so
  2. extension=/usr/lib/php5/20121212/swish.so
Kemudian simpan dan restart kembali apache dengan perintah
  1. root@Venom :~ /etc/init.d/apache2 restart
Lihat pada php info apakah swish untuk PHP dapat dijalankan di localhost, misalnya : http://localhost/phpinfo.php. Apabila belum ada, tambahkan file phpinfo.php pada directory /var/www/
  1. root@Venom :~ vim /var/www/phpinfo.php
Tambahkan kode pada file tersebut
  1. <?php
  2. // Show all information, defaults to INFO_ALL
  3. phpinfo();
  4. ?>
Kemudian simpan dan jalankan kembali http://localhost/phpinfo.php kemudian cari kata Swish, apabila proses instalasi extension berhasil maka akan tampil seperti pada gambar berikut:

2. Rebuild PHP Swish Terhadap Error "phpize" Konfirgurasi

Apabila terdapat masalah ketika akan melakukan konfirgurasi PHP-Swish saat menjalankan konfirgurasi "phpize: command not found", kemungkinan PHP Dev belum terinstall dengan cara
  1. root@Venom :~ apt-get install php5-dev
kemudian kembali pada directory PHP Swish tersebut dan ulangi tahapan "phpize". Apabila masih belum bisa terinstal, kemungkinan terdapat kesalahan pada proses instalasi dari paket Swish-E. Hal ini dapat di antisipasi dengan mengkonfirgurasi ulang paket Swish-E seperti langkah-langkah sebelumnya yang telah dibahas pada tahapan dariInstalasi Swish-E 2.4.7.
Pastikan tidak terdapat error saat melakukan "make test", kemudian masuk kembali pada directory PHP Swish tersebut dan ulangi tahapan "phpize" hingga selesai.

3. Membuat Front-End Search Engine

Setelah semua tahapan penginstalan PHP-Swish telah selesai, maka tahapan selanjutnya membuat front-end menggunakan bahasa pemrogramman PHP dengan menggunakan extension swish. Proses ini untuk membaca isi dari file yang telah diindex sebelumnya menjadi informasi yang dapat dilakukan untuk pengolahan.
Dari gambar diatas, dapat dilihat dari proses inverted index hingga hasil yang ditampilkan dari proses front-end, dimana seluruh pencarian dilakukan menggunakan PHP-Swish melalui back-end.
Untuk melihat seluruh properties yang dimiliki dari file index.swish-e yang telah dibangun sebelumnya dapat dilihat informasinya dengan menggunakan code PHP berikut ini:
  1. <?php
  2. try
  3. {
  4. $swish = new Swish("index.swish-e");
  5. $properties = $swish->getPropertyList("index.swish-e");
  6. echo "Swish Properties : <br/>";
  7. foreach ($properties as $prop)
  8. {
  9. echo "<li>".$prop["Name"]."</li>";
  10. }
  11. }
  12. catch (SwishException $e)
  13. {
  14. echo $e->getMessage(), "\n";
  15. }
  16. ?>
Dari kode tersebut, dapat ditampilkan informasi properties yang dimiliki file index.swish-e adalah sebagai berikut:
Secara default, properties yang diindex hanya memiliki properties : swishreccount, swishrank, swishfilenum, swishdbfile, swishdocpath, swishtitle, swishdocsize, swishlastmodified dan swishdescription. Fungsi dari swishdocpath merupakan alamat dari file, swishrank merupakan nilai frekuensi yang paling relevan dari file, swishreccount urutan dari file berdasarkan rangking, swishlastmodified merupakan waktu modifikasi terakhir file dan juga swishtitle untuk menampilkan judul dari file. Sedangkan swishdescription hanya ikut diindex dalam file tersebut apabila dari proses melakukan konfirgurasi index menambahkan StoreDescription yang berfungsi untuk menampilkan deskripsi dari isi file.
Setelah semua properties dari file index sudah diketahui, maka tahap selanjutnya membuat front-end yang dapat membaca informasi dari file index.swish-e dengan menampilkan judul, alamat URL dan juga deskripsi seperti yang terdapat pada mesin pencarian yang ada saat ini. Buatlah sebuah file dalam directory /var/www/ dan buat sebuah directory misalkan "Search" kemudian buat sebuah file PHP kemudian tambahkan code PHP berikut:
  1. <html>
  2. <head>
  3. <title>Search Engine</title>
  4. <link rel="stylesheet" type="text/css" href="style.css">
  5. </head>
  6. <body>
  7. <?php
  8. if (!isset($_POST['q']))
  9. {
  10. ?>
  11. <h2>Search</h2>
  12. <form method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">
  13. <input type="text" name="q" size="30" />
  14. </form>
  15. <?php
  16. }
  17. else
  18. {
  19. ?>
  20. <h2>Search Results</h2>
  21. <?php
  22. try
  23. {
  24. $swish = new Swish('index.swish-e');
  25. $queryStr = htmlentities($_POST['q']);
  26. $start = microtime(true);
  27. $result = $swish->query($queryStr);
  28. $end = microtime(true);
  29. $fnum = $result->hits;
  30. $time = (round(($end-$start)*100,5)/100);
  31. if ($fnum==0)
  32. {
  33. echo "
  34. Sorry, there are no matching result for <b>$queryStr</b>.</br></br>
  35. 1. Try more general words.</br>
  36. 2. Try different words with similar meaning</br>
  37. 3. Please check your spelling
  38. ";
  39. }
  40. else
  41. {
  42. echo "<font color='grey'>$fnum Results Found ! ($time seconds)</font><br />";
  43. while($r = $result->nextResult())
  44. {
  45. $start = 0; //berfungsi untuk halaman
  46. $limit = 20; // maksimal yang ditampilkan
  47. $data = $r->swishreccount;
  48. $replace = ' ';
  49. if ($data >=$start && $data <=$limit) //limit halaman
  50. {
  51. $date = date("l, j F Y @ G:i:s", ($r->swishlastmodified)+60*60*7);
  52. $words = split("[ ]+", strtolower($queryStr));
  53. $text = substr($r->swishdescription,0,500);
  54. $url = $r->swishdocpath;
  55. $rank = $r->swishrank;
  56. $desc = $text;
  57. if ( !is_null($r->swishtitle) )
  58. {
  59. $title = $r->swishtitle;
  60. }
  61. else
  62. {
  63. $newtitle = explode('/', $r->swishdocpath);
  64. $order = array("-", "+" , "_",".pdf",".html",".php",".tar",".gz",
  65. ".rar",".zip",".ps",".txt",".tar.gz",".ps.gz",".txt.gz");
  66. $l = 0;
  67. while ($l < count($newtitle))
  68. {
  69. $loc = $l++;
  70. }
  71. if( strtolower($newtitle[$loc]) != "index.html" && !is_null($newtitle[$loc]))
  72. {
  73. $title = ucwords(str_replace($order," ",$newtitle[$loc]));
  74. if ($title == "")
  75. {
  76. $title = ucwords(str_replace($order," ",$newtitle[$loc-1]));
  77. }
  78. }
  79. else if ( strtolower($newtitle[$loc]) == "index.html")
  80. {
  81. $title = ucwords(str_replace($order," ",$newtitle[$loc-1]));
  82. }
  83. }
  84. echo "
  85. <div class='width: 400px;'>
  86. <div class='title'><a href='$url' target='_blank'><b>$title</b></a>
  87. <font size='-1'> (Ranking : $rank)</font></div>
  88. <div class='url'>$url</div>
  89. <div class='time'>$date</div>
  90. <div class='desc'>$desc</div>
  91. </div>
  92. <br />
  93. ";
  94. }
  95. }
  96. }
  97. }
  98. catch (Exception $e)
  99. {
  100. die('ERROR: ' . $e->getMessage());
  101. }
  102. }
  103. ?>
  104. </body>
  105. </html>
Dari code tersebut dapat diketahui index.swish-e dibaca oleh function swish, kemudian dieksekusi dengan menggunakan query yang diinputkan kemudian ditampung oleh variabel $queryStr. Sedangkan fungsi dari microtime();dari start dan end diantara proses eksekusi yaitu melakukan perbandingan waktu sebelum dan setelah eksekusi, kemudian dilakukan pengambilan nilai sebanyak 5 digit dibelakang koma dan ditampung oleh variabel $time sehingga dapat diketahui waktu yang dibutuhkan dalam proses eksekusi query. Dari variabel penampung $fnum yang menggambil nilai $result->hits; dari jumlah file yang terdapat saat dilakukan pencarian query.
Agar tampilan dari pencarian lebih menarik, tambahkan sebuah file CSS dengan naman "style.css" kemudian tambahkan script berikut:
  1. body {
  2. font-family: Arial;
  3. font-size: 14px;
  4. padding-top: 20px
  5. padding-right: 50px;
  6. padding-left: 50px;
  7. }
  8. .url {
  9. color: green;
  10. font-size:14px;
  11. }
  12. .title {
  13. font-size:16px;
  14. }
  15. .time {
  16. font-size:12px;
  17. color: grey;
  18. }
  19. .desc {
  20. font-size:14px;
  21. margin-right: 500px;
  22. }
Setelah selesai membuat program PHP tersebut, maka informasi dari pencarian kata yang ditampilkan dari index.swish-e seperti gambar berikut:
Untuk Lebih lanjutnya lihat demo yang telah dibuat dengan variasi dari tampilan untuk Kivine Search Engine:
Demo
Selamat mencoba, semoga berhasil dan bermanfaat.

Tidak ada komentar:

Posting Komentar