Sebelumnya saya pernah menulis artikel tentang SOLR. Di artikel itu saya menulis sekilas tentang solr dan cara instalasinya. Nah, kali ini saya akan membuat suatu program yang bisa digunakan untuk melakukan pengindeksan kedalam solr. Sesuai judulnya, program ini ditulis/dikodekan menggunakan bahasa pemrograman PHP.
Program yang akan dibuat memanfaatkan library SolrPHPClient, bisa diunduh disini. Pada program kali ini skenarionya adalah membaca dari database SQL Server, lalu diindeks ke solr. Asumsinya, kita punya tabel di Microsoft SQL Server dengan script dibawah ini:
1CREATE TABLE document_index (
2    doc_id int NOT NULL,
3    doc_title varchar(255) NOT NULL,
4    doc_body text NULL,
5    doc_author varchar(255) NULL,
6 CONSTRAINT pk_document_index PRIMARY KEY (doc_id)
7);

Menambahkan indeks
Untuk menambahkan indeks ke solr, maka script PHP-nya sebagai berikut:
01<?php   
02//Include file Service.php dari SolrPHPClient
03include "Service.php"
04$dbhost "HOSTNAME";   // host name   
05$dbuser "userdb";    
06$dbname "databasename";  
07$dbpass "password";
08     
09//Koneksi ke database Microsoft SQL Server 
10mssql_connect($dbhost$dbuser$dbpass);  
11mssql_select_db($dbname);      
12
13//Koneksi ke SOLR di IP: 127.0.0.1, Port: 8080, ContextPath: /apache-solr-1.4.1    
14$solr new Apache_Solr_Service('localhost', 8080, '/apache-solr-1.4.1');  
15if ($solr->ping()) {
16        try {
17            $sql "SELECT ".
18                        "d.doc_id, ".
19                        "d.doc_title, ".
20                        "d.doc_body, ".
21                        "d.doc_author ".
22                    "FROM document_index d ".
23                    "ORDER BY d.doc_title ASC";
24
25            $res= mssql_query($sql);
26            while($row = mssql_fetch_row($res)) {
27                echo "dcid  : "$row[0] ."\n";
28                echo "title : "$row[1];
29                echo "<hr />\n";
30
31                $doc new Apache_Solr_Document();
32                $doc->id = uniqid();
33                $doc->title = $row[1];
34                $doc->description = $row[2];
35                $doc->author = $row[3];
36                $solr->addDocument($doc);     //Menambahkan dokumen
37                $solr->commit(); //commit untuk melihat perubahan
38                $solr->optimize(); //menggabungkan beberapa segmen menjadi satu sehingga efektif.               
39            }
40            echo "FINISH INDEXING...";
41        }
42        catch ( Exception $e ) {
43            echo $e->getMessage();
44        }
45     else {
46        echo "Connecting to solr failed....";
47     }
48?>
Jalankan file php diatas, maka program tersebut akan mengindeks isi dari table document_index ke dalam solr.

Problem Connection Error
Pada saat menjalankan program diatas, beberapa kali saya menemukan eksepsi. Yaitu “0″ Status: Communication Error. Setelah mencari cari, ternyata sebabnya adalah error yang terjadi pada saat php akan berkomunikasi dengan solr. Untuk mengatasinya, bisa dengan mengubah sedikit kode yang ada di file Service.php didalam fungsi _sendRawGet. Cari baris kode yang mirip baris berikut: *pada saat saya mengunduh library ini, tepatnya ada di baris 382.*
381<?php   
382// Baris kode sebelumnya...
383$solrResponse = new Apache_Solr_Response($httpResponse, $this->_createDocuments, $this->_collapseSingleValueArrays);
384// Baris kode sesudahnya...
385?>

Diubah menjadi:

381// Baris kode sebelumnya...
382while(true){
383    $str file_get_contents($url, false, $this->_postContext);
384    if(empty($str) == false){
385        break;
386    }
387}
388
389$response new Apache_Solr_Response($str$http_response_header,
390          $this->_createDocuments, $this->_collapseSingleValueArrays);
391// Baris kode sesudahnya...
Perubahan kode diatas, maksudnya adalah melakukan kembali komunikasi ke solr jika terjadi kegagalan komunikasi. Nah efek sampingnya adalah, jika alamat solr yang dituju ternyata down atau off maka akan terjadi perulangan terus menerus. Untuk itu pastikan server solr yang dimaksud sedang berjalan dengan baik. Atau bisa juga ditambahkan kode untuk batas pengulangan.

Menghapus indeks
Untuk menghapus indeks di solr, bisa menggunakan perintah method deleteByQuery. Berikut ini adalah contoh untuk menghapus indeks:
01<?php
02    include "Service.php";
03    $solr new Apache_Solr_Service('localhost', 8080, '/apache-solr-1.4.1');
04    if ($solr->ping()) {    
05        try {
06            //Menghapus seluruh dokumen. Hati hati..
07            $solr->deleteByQuery('*:*');
08             
09            //Menghapus seluruh dokumen dengan author = roni
10            $solr->deleteByQuery('author: roni');
11             
12            //Setelah dihapus jangan lupa jalankan 2 method ini..
13            $solr->commit();
14            $solr->optimize();
15        } catch ( Exception $e ) {
16            echo $e->getMessage();
17        
18     else {
19        echo "Connecting to solr failed....<br>";
20     }
21?>

Selamat mencoba, semoga bermanfaat

0 komentar:

Posting Komentar