Sphinx Search Engine in PyThon, PHP, and Matlab


Saat data besar, database relasional saja tidak cukup untuk memenuhi kebutuhan informasi (storage, retrieval dan-atau analitik). Setidaknya untuk kebutuhan pencarian yang cepat dan handal dibutuhkan sebuah search engine (dan-atau NoSQL). Pada post kali ini saya akan bahas setup sederhana Sphinx Search Engine dan bagaimana mengaksesnya melalui PHP, PyThon dan Matlab. Mengapa PyThon dan Matlab juga dibahas ? Sejujurnya karena saya pernah membutuhkan tutorial ini, tapi setelah bertanya berkali-kali ke 'Mbah Google' tidak menemukan apa yang saya cari. Semoga tutorial ini kelak bermanfaat bagi siapa saja yang membutuhkan. Alasan saya menulis post ini juga karena Sphinx memang search engine yang cukup mumpuni, open source, dan MySQL friendly. Popularitas Sphinx sedikit-banyak terdongkrak karena kemudahannya dalam mengindex data dari database relasional yang paling populer saat ini (i.e. MySQL). Catatan: ketika database MySQL besar, pencarian (query) FullText akan sangat lambat dan hasil query-nya kurang relevant.
Saya awali sedikit dengan pendahuluan SphixSearch (http://sphinxsearch.com/). Sphinx adalah search engine yang cukup mumpuni dan well-known (saat post ini ditulis, Sphinx termasuk Top 5). Sphinx memiliki beberapa kelebihan dibandingkan pesaingnya. Diantaranya saja, kemudahan indexing data dari MySQL, geoSpatial search, custom ranking scheme,  dan performa yang mumpuni (baik search maupun indexing). Performa Sphinx didapatkan karena ia C++ based, kebanyakan search engine lain Java based (i.e. Lucene, Elastic, Solr, dll). Tidak ada yang sempurna, Sphinx juga tak luput dari beberapa kekurangan: seperti scalability yang lebih sulit di atur ketimbang pesaingnya, support driver, dsb. Tentu saja kalau kita bicara teknologi Big Data tidak ada "Obat Dewa" yang bisa digunakan untuk semua kasus. Bergantung dari aplikasinya, teknologi tertentu lebih cocok ketimbang yang lain (bahasan ini diluar scope post ini). Cukup dengan pendahuluan, mari kita mulai 'aksi'. Sebelumnya, mari kita siapkan beberapa requirement dasar:
  1. Unduh Sphinx Search Engine: Link
  2. Saya asumsikan Matlab, PHP, dan-atau PyThon telah terinstal dan berfungsi dengan baik.
  3. Untuk Matlab instal dan unduh MySQL JDBC driver: LINK 
  4. Untuk PyThon instal pyMsql dengan perintah dari terminal (command prompt) "conda install pymysql" ATAU "pip install pymysql"
  5. MySQL  telah terinstall dan berjalan dengan baik.
  6. Untuk keseragaman/kemudahan tutorial ini, mari kita gunakan sample database MySQL berikut: LINK. Import atau CoPas dan run saja SQLnya (db-nya tidak besar).
Mari kita awali dengan setting, installing dan indexing Sphinx dengan sumber data dari database MySQL diatas.
  1. Extract sphinx yang telah di unduh (Langkah 1), misal C:\sphinx [Lihat gambar di bawah]
  2. Buat 2 folder di dalamnya: C:\sphinx\data dan C:\sphinx\log [Lihat gambar di bawah]
  3. Buka NotePad atau text editor lainnya dan save Sphinx Config berikut ke folder sphinx (i.e. C:\sphinx\sphinx.conf) :
  4. 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # Name of The Data Source "data1", you can have multiple of data source
    source data1
    {
    type = mysql
    sql_host = localhost
    sql_user = sphinxmysql # Change to Your MySQL Database Username
    sql_pass = 1234 # Change to Your MySQL Password
    sql_db = contoh_spx # The Database name
    sql_port = 3306
    sql_query = SELECT id,teks FROM cthtbl #ANY Query will do, but 1st field must be ID (Unique/primary)
    sql_ranged_throttle = 0
    }
    # Name of The index "idx1", you can have multiple indices
    index idx1
    {
    source = data1
    path = C:\sphinx\data\plain1
    docinfo = extern
    mlock = 0 #There are many options to usein this section, will be explained on latter posts
    morphology = stem_en
    min_stemming_len= 5
    min_word_len = 2
    html_strip = 0
    #You can add your own StopWords here in this section
    }
    searchd
    {
    listen = 9301:mysql41
    mysql_version_string = 5.0.37
    thread_stack = 256K
    binlog_path = C:\Sphinx\log
    read_timeout = 33
    client_timeout = 1000
    max_children = 0
    pid_file = C:\Sphinx\log\searchd.pid
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old = 1
    mva_updates_pool = 1M
    max_packet_size = 1M
    max_filters = 256
    max_filter_values = 4096
    max_batch_queries = 1024
    }
    
    
    
  5. Buka command prompt dan jalankan tiga perintah berikut di Administrator Command Prompt untuk mulai meng-index data, install service, & menjalankannya:
  6. Index & Install service Sphinx
    Shell
    1
    2
    3
    C:\sphinx\bin\indexer.exe --config C:\sphinx\sphinx.conf --all
    C:\sphinx\bin\searchd.exe --install --config C:\sphinx\sphinx.conf --servicename sphinx
    net start sphinx
  7. Catatan: Langkah 4 dapat diketikkan ke file text dan disimpan dengan extensi ".bat" lalu dieksekusi.
  8. Selamat, anda baru saja berhasil menginstall dan index Sphinx search engine. Untuk memverifikasi Sphinx telah berjalan dengan baik silahkan ketikkan perintah berikut di command prompt:
    C:\sphinx\bin\search.exe --config C:\sphinx\sphinx.conf "new music"
 
 
Catatan/tips:
[1]. Jika akan dilakukan indexing ulang dan instalasi service sphinx baru, ada baiknya perintah-perintah berikut dijalankan terlebih dahulu di shell (Administrator command prompt):



Shell
1
2
3
4
sc stop sphinx
sc delete sphinx
del /F/Q C:\sphinx\data\*.*
del /F/Q C:\sphinx\log\*.*
[2]. Sphinx sendiri sebenarnya tidak membutuhkan MySQL. Di contoh ini MySQL digunakan hanya sebagai sumber data. Namun sumber data juga bisa bersumber dari file (e.g. HTML, XML, CSV, JSon,dsb) atau biasa dikenal dengan istilah pipeline.
[3]. Sphinx dapat dijalankan menggunakan SphinxAPI maupun SphinxQL, namun SphinxAPI lebih lambat dan mulai dihilangkan secara bertahap oleh developernya.
Sekarang mari kita bahas bagaimana menjalankan Query Sphinx (SphinxQL) dari PHP, PyThon, dan-atau Matlab.
  • Untuk PHP developers ==> LINK
  • Untuk PyThon users ==> LINK
  • dan Matlab fanatics ==> LINK
Beberapa hal-hal penting yang belum dibahas di post ini & insya Allah akan dibahas di lain waktu:
  1. Penggunaan StopWords
  2. High Performance Sphinx : Distributed/MultiThread index.
  3. RealTime Index & Updating Index.
  4. Batch Query.
  5. Pipelining.
  6. Custom Ranking,
  7. Sphinx Security, dsb.

PHP

Code PHP berikut adalah contoh bagaimana menjalankan query SphinxQL di PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
echo '<b>Experimenting on SphinxSearch ~ PHP</b><br>';
$sphinx = mysqli_connect('127.0.0.1','','','',9301) or die("Error Connection " . mysqli_error($sphinx));
$query="SELECT id,weight() FROM idx1 WHERE MATCH('\"metaphorge dolls\"/1') LIMIT 10 OPTION ranker=SPH04";
echo '<b>Query =</b>"',$query,'"<br>';
echo '<b>Query Results=</b><br>';
$q3=mysqli_query($sphinx,$query) or die("Error 96" . mysqli_error($sphinx));
while ($i = mysqli_fetch_array($q3)) {echo 'id=',$i[0],', Ranking Score=',$i[1],'<br>';}
echo '<b>finished!</b><br>';
mysqli_close($sphinx);
?>




Catatan/Tips:
  1. Ranker di query di atas= Ranking Schemes dan dapat diubah menjadi BM25, BM25 dengan proximity, dll. Selengkapnya dapat dilihat di Link berikut: LINK.
  2. Sphinx adalah search engine, jadi saya menyarankan Sphinx hanya mengeluarkan output ID saja. Data selengkapnya dapat di query dari database asal. Field weight() sebenarnya tidak dibutuhkan, saya keluarkan sekedar untuk menunjukkan nilai ranking score yang dihasilkan Sphinx. Terkadang berguna bagi mereka yang melakukan riset di IR/SI/bidang lain yang terkait seperti Text Mining, dsb.
  3. Query di atas basically dapat diganti dengan sembarang Query sebagaimana query di MySQL.

PyThon

Berikut adalah contoh code sederhana bagaimana melakukan Query Sphinx melalui PyThon:
1
2
3
4
5
6
7
import pymysql
db = pymysql.connect(host='127.0.0.1',port=9301,user='',passwd='',charset='utf8',db='')
cur = db.cursor()
qry='SELECT id,weight() FROM idx1 WHERE MATCH(\'"metaphorge dolls"/1\') LIMIT 10 OPTION ranker=SPH04'
cur.execute(qry);row = cur.fetchall()
print(row)
cur.close();db.close()



Catatan: Module yang digunakan tidak harus PyMysql, sembarang module yang dapat menghubungkan dengan MySQL seharusnya bisa digunakan dengan cara yang serupa.

Matlab

Walau tidak umum, finally mari kita bahas bagaimana mengakses Sphinx melalui Matlab. Berikut contoh codenya:
1
2
3
4
5
6
7
8
con=database('','','','com.mysql.jdbc.Driver','jdbc:mysql://127.0.0.1:9301?characterEncoding=utf8&maxAllowedPacket=1024000');
if ~isconnection(con)
    disp(['Error Connecting to Sphinx : ',con.Message]);
else
    query='SELECT id,weight() FROM idx1 WHERE MATCH(''"metaphorge dolls"/1'') LIMIT 10 OPTION ranker=SPH04';
    results=exec(con,query);results=fetch(results);results=results.data;
    results
end

Catatan:
  1. Untuk dapat menjalankan code ini di Matlab dengan sukses, jangan driver JDBC dan toolbox database harus terinstal dan berfungsi dengan baik. Silahkan baca POST INI untuk keterangan instalasi JDBC di Matlab.
  2. Perhatikan parameter koneksi Sphinx~Matlab diatas sedikit berbeda dengan MySQL~Matlab.
  3. Sebagaimana PyThon hasil query dari Sphinx di matlab adalah Object, silahkan explore lebih jauh properties lainnya selain ".data" dan ".message"
(adsbygoogle = window.adsbygoogle || []).push({});

Tidak ada komentar:

Posting Komentar

Relevant & Respectful Comments Only.