Mudah Mengimplementasikan Fasilitas Pencarian dengan Python Whoosh

Beberapa waktu lalu saya sempat membutuhkan mekanisme pencarian terhadap kumpulan dokumen teks. Beberapa alternatif yang populer diantaranya Apache Lucene (Solr) dan Sphinx search. Lucene berlisensi Apache License, Sphinx GPL. Keduanya ditulis dalam bahasa JAVA (OK, BIG NO). Setelah kesana-kemari mencari akhirnya ketemu alternatif yang cukup menarik yaitu Whoosh. library ini ditulis dalam pure python, berlisensi BSD, cepat, dan mudah digunakan.

Whoosh is a fast, featureful full-text indexing and searching library
implemented in pure Python. Programmers can use it to easily add search
functionality to their applications and websites. Every part of how Whoosh
works can be extended or replaced to meet your needs exactly.

Whoosh bisa diunduh di situs pypi atau di repositori di bitbucket (Mercurial). Setelah dipasang, whoosh bisa digunakan dengan kode pendek berikut

from whoosh.index import create_in, open_dir
from whoosh.fields import *

Hal pertama yang perlu dilakukan sebelum mengindeks dokumen adalah membuat schema. Schema digunakan untuk mendefinisikan struktur indeks yang akan disimpan oleh Whoosh. Skema sederhana berikut bisa dijadikan contoh. Pilihan stored menyatakan bahwa elemen ini akan dikembalikan dalam hasil pencarian.

schema = Schema(title=TEXT(stored=True), path=TEXT(stored=True), content=TEXT)

Setelah skema indeks didefinisikan langkah selanjutnya adalah membuat indeks. Whoosh menggunakan indeks yang disimpan pada filesystem (Whoosh tidak menggunakan database umum). Fungsi create_in disediakan sebagai jalan pintas dari membuat objek file indeks.

_ix = create_in('indexdir', schema)
w = _ix.writer()

#telusuri direktori untuk mencari file teks
for root, dirnames, filenames in os.walk('data'):
    for filename in fnmatch.filter(filenames, '*.txt'):
        doc = os.path.join(root, filename)
        f = open(doc)
        text = f.read()
        w.add_document(title=unicode(filename[:-4]), content=unicode(text), path=unicode(doc))
        f.close()

    w.commit()

Pada kasus di atas, saya memberi nama file sesuai dengan judulnya. Proses di atas terdiri dari 3 langkah yaitu :

  1. memanggil objek IndexWriter
  2. menambahkan item/dokumen
  3. melakukan commit

Jika ada dokumen baru yang ingin ditambahkan maka pola di atas juga dapat langsung digunakan tapi tidak perlu lagi melakukan pembuatan indeks melalui create_in. Jika direktori indeks sudah dibuat maka objek Index dapat dipanggil dengan fungsi open_dir.

_ix = open_dir('indexdir')

Untuk melakukan Pencarian dari indeks, dapat menggunakan objek IndexSearcher yang dipanggil dari objek indeks menggunakan

    s = _ix.searcher()
    q = QueryParser('content', _ix.schema).parse(unicode(qs))
    r = s.search(q)
    for rr in r:
        print rr
    s.close()

Nah! cukup begitu saja untuk menambahkan hasil pencarian. Pembuatan indeks pun dilakukan dengan cepat.

One comment

  1. Aji · Februari 19, 2012

    bener2 baru tau tentang Whoosh.. thanks!

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s