Calm Hill My Random Thoughts

Indexing & Searching with PyLucene

Static Website ပြောင်းပြီးတဲ့နောက် အားလုံး အဆင်ပြေပေမယ့် Search လုပ်ဖို့အတွက် အလွယ်တကူ လုပ်လို့မရတာတော့ အခက်အခဲရှိတယ် Google Custom Search သုံးရင်ရပေမယ့် ကိုယ်တိုင် လုပ်ထားရင် Information Retrieval စမ်းစရာရှိတာတွေ စမ်းဖို့အတွက်နေရာ ရလာမှာ ဖြစ်တဲ့အတွက် ကိုယ်တိုင်ပဲ Static Pages တွေကို Index လုပ်ပြီးတော့ Search လုပ်တဲ့ Server တခု Setup လုပ်လိုက်တယ်။

Search and Index

Image From: http://www.stockvault.net/photo/127786/book-amp-glasses

စကားလုံးတွေကို Tokenize ကနေ Index Storage အထိ ကိုယ်တိုင်လုပ်မယ်လို့ စဉ်းစားပေမယ့် မလိုအပ်တာရယ် အချိန်လည်းမရှိတာရယ်နဲ့ လူသုံးများတာနဲ့ ကိုယ်တိုင် Customize လုပ်လို့လည်း အဆင်ပြေမယ့် Lucene ကိုပဲ Index & Search အတွက် သုံးလိုက်တယ်။

Index & Search အတွက် Lucene သုံးလို့ရပေမယ့် Lucene က Engine အနေနဲ့ပဲရှိတော့ ကိုယ့်ရဲ့ Website မှာသုံးလို့ရဖို့နဲ့ Page တွေအားလုံးကို Index လုပ်ဖို့အတွက်ကတော့ ကိုယ်တိုင်တော့ နည်းနည်းရေးရပါတယ်။ Lucene က Java နဲ့ရေးထားတာဖြစ်ပေမယ့် Java Server ကို Setup မလုပ်ချင်တာနဲ့ Python နဲ့ရေးလို့ရအောင် PyLucene ကိုသုံးတယ်။

PyLucene ကို Install လုပ်ဖို့က Ubuntu မှာပါတဲ့ PyLucene က Version အတော်လေး နောက်ကျနေတဲ့ အတွက် ကိုယ်တိုင်ပဲ Latest version ကို Build လုပ်လိုက်တယ်။ Ubuntu ပေါ်မှာ PyLucene ကို Build လုပ်တာက သိပ်အခက်အခဲ မရှိပါဘူး လိုအပ်တဲ့ Dependencies တွေကို Install လုပ်ထားရင် အလွယ်တကူ လုပ်လို့ရပါလိမ့်မယ်။

Install Dependencies

sudo apt-get install openjdk-7-jdk ant g++ python-dev

sudo pip install setuptools --upgrade

Build & Install PyLucene

pushd jcc

python setup.py build

sudo python setup.py install

popd

make

sudo make install

Static Site တွေကို Index လုပ်မယ်ဆိုရင် တကယ်ကတော့ Site ကို Crawl လုပ်ရမှာဖြစ်ပေမယ့် Pelican မှာ RSS & Atom Feeds တွေမှာ Contents တွေက အားလုံးပါတဲ့အတွက် Crawl မလုပ်တော့ပဲနဲ့ Feeds ကနေတဆင့် Contents List တွေကိုယူပြီးတော့ Index လုပ်လို့ ရတဲ့အတွက် Crawler ရေးဖို့ အလုပ်ရှုပ် သက်သာတယ်။

FeedsIndexer

https://github.com/yelinkyaw/FeedsIndexer

Index လုပ်ဖို့အတွက်က RSS or Atom ဖြစ်ရင်ရတယ် Url ကနေတိုက်ရိုက် Index လုပ်လို့ရပါတယ်။ Default အနေနဲ့ကတော့ Index တွေဟာ Script File ရှိတဲ့ Directory ထဲမှာ Index လုပ်လိမ့်မယ် တခြားနေရာမှာ ထားချင်ရင်တော့ Sourcecode ထဲက Constant မှာ လွယ်လွယ်ကူကူ ပြင်လို့ရပါတယ်။

python IndexFeeds.py http://domain/feeds/atom.xml

Index လုပ်ပြီးပြီဆိုရင် Search လုပ်ဖို့အတွက်က Web Server ကနေ ရှာချင်တာ ဖြစ်တဲ့အတွက် Web Interface တခုတော့ ထုတ်ပေးဖို့လိုတယ်။ Query တခုဝင်လာရင် Result တွေကို JSON Format နဲ့ထုတ်ပေးတဲ့ Server တခု ရေးလိုက်တယ် ခက်ခက်ခဲခဲလည်း မဟုတ်ပါဘူး။ စမ်းကြည့်ချင်ရင်တော့ Command Line မှာ Web Server ကို Start လုပ်ပြီး စမ်းကြည့်လို့ရတယ်။

python search.py

တကယ်သုံးမယ့် Production အနေနဲ့ကတော့ Python Built-in Server မသုံးပါဘူး Gunicorn ကိုသုံးပြီးတော့ Server ပေါ်မှာ Local Service တခု Run ထားလိုက်ပြီး ကိုယ့် Website ရဲ့ Directory တခုကိုလာရင် Nginx ကနေ Redirect လုပ်ထားလိုက်တယ်။ Website ပေါ်မှာ Search အတွက်ကတော့ Form လေးတခုနဲ့ Query လာရင် Search API ကိုလှမ်းခေါ်ပြီး ပြန်လာမယ့် Results တွေကို Static Page လေးထဲမှာ ပြပေးရင်ရပြီ JavaScript ဆိုရင် လုံလောက်ပါပြီ။

အခုတော့ ပထမအဆင့်အနေနဲ့ Search လုပ်လို့ရပါပြီ Server သေးပေမယ့် Performance အနေနဲ့ရယ် Memory Usage အနေနဲ့ရယ် လက်ခံနိုင်စရာရှိပါတယ်။ Result တွေကတော့ ကိုယ်တိုင်ကတော့ စိတ်တိုင်းကျတယ် မဟုတ်သေးပါဘူး User အနေနဲ့ကတော့ သုံးလို့ အဆင်ပြေမှာပါ Sidebar မှာ Search အတွက် Link ရှိပါတယ်။ လုပ်ပြီးမှ သတိရတာက Search လုပ်တာက Contents ထဲမှာပဲ ရှာလိုက်မိတယ် Title တွေကို မရှာလိုက်မိဘူး အဲဒါတော့ ပြင်ရဦးမယ်။ Search Result တွေ အတွက်က အားတဲ့အချိန်မှ လုပ်ရတော့မှာပဲ Tokenize & Index တွေကို စမ်းသပ်ပြင်လို့ရပြီ ကစားစရာ အသစ်တခုရပြီ။