Monday, January 22, 2007

Membangun Search Engine dengan Delphi

Sebagai developer, mungkin anda pernah mengalami bagaimana sulitnya untuk mencari data yang sesuai dari sekumpulan text data yang besar. Secara sederhana delphi sebenarnya menyediakan function Pos(Substr: string; S: string): Integer; untuk mencari substring dalam dalam sebuah variabel string, tapi masalahnya bila itu terdiri atas sekian banyak text file maka menggunakan fungsi ini secara iteratif sangat tidak efisien, dan memakan waktu dalam setiap proses pencariannya. Solusinya adalah dengan membangun sebuah search engine. tentu saja ada banyak ragam konsep yang bisa dipelajari.

Contoh yang saya angkat kali ini adalah bagaimana impelentasinya dalam kasus yang lebih sederhana, membuat search engine untuk mencari kata dalam sekumpulan file teks dengan menggunakan Delphi dan bagaimana implementasi pencarian menurut logic AND dan OR. Konsep yang digunakan merupakan penyederhanaan dan adaptasi dari implementasi yang pernah saya lakukan untuk membangun search engine atas database yang jauh lebih besar.

Tahapan yang dibutuhkan adalah membangun word database atas setiap file yang akan dicari, memecah text dari setiap file ke dalam kata per kata dan mebuat relasi atas kata tersebut atas file tersebut. dengan demikian pada proses searching tidak perlu lagi melakukan scanning terhadap setiap file yang dicari.

sebagai contoh jika content file FILE_A.TXT:


dua ratus tiga puluh lima ribu rupiah
dan content file FILE_B.TXT:


seratus lima puluh dua ribu rupiah
maka akan diparsing sebagai:



DUA <-> FILE_A.TXT
LIMA <-> FILE_A.TXT
PULUH <-> FILE_A.TXT
PULUH <-> FILE_B.TXT
RATUS <-> FILE_A.TXT
RIBU <-> FILE_A.TXT
RIBU <-> FILE_B.TXT
RUPIAH <-> FILE_A.TXT
RUPIAH <-> FILE_B.TXT
SERATUS <-> FILE_B.TXT
TIGA <-> FILE_A.TXT

tentu saja karena isi dari word database ini bisa menjadi sangat besar, maka kita bisa menghilangkan kata yang terduplikat dan membuat relasi many-to-many atas kata dan file yang terkait. sehingga:


WORD ID
============
DUA (1)
LIMA (2)
PULUH (3)
RATUS (4)
RIBU (5)
RUPIAH (6)
SERATUS (7)
TIGA (8)

FILE ID
===============
FILE_A.TXT (1)
FILE_B.TXT (2)

WORD-ID FILE-ID
===================
1 1
2 1
3 1
3 2
4 1
4 2
...dst
Berikut ini contoh kode selengkapnya dalam bentuk zip file. Semoga bermanfaat :-)

No comments: