Mysql Full Text Search for faster word search

         
အ၇င္က Full Text Search အေၾကာင္းကို မသိခဲ႔ပါဘူး။word ေတြကို ရွာခ်င္ရင္ like နဲ႔ပဲ အျမဲ ရွာျဖစ္ခဲ႔တယ္။ တကယ္တန္းလည္း  full text search ကို နာမည္ၾကီး CMS ေတြ framework ေတြ မွာလည္း ေဖာ္ျပထားျခင္းမရွိေတာ႔ သာမန္အားျဖင့္ like ကိုပဲ အသံုးမ်ားခဲ႔တယ္။
          ကြ်န္ေတာ္႔ မိတ္ေဆြတစ္ေယာက္ ကေျပာျပလို႔ လိုက္ဖတ္ၾကည့္မိခဲ႔တယ္။ Full Text feature ဟာ တကယ္ေတာ႔ search လုပ္ဖို႔ ပိုျမန္ေအာင္လုပ္ေပးထားတာပါ။ like နဲ႔ ရွာတာထက္ပိုျမန္ပါတယ္။ ဒါေပမယ့္ သာမန္အားျဖင့္ text data row အနည္းငယ္ထဲမွာရွာမယ္ဆိုရင္ေတာ႔ ကြာျခားခ်က္သိသိသာ သာ မရွိႏိုင္ဘူး။ text data row ေတြ million နဲ႔ခ်ီျပီး ရွိတဲ႔ table ထဲမွာရွာရျပီဆိုရင္ေတာ႔ သိသာလာပါတယ္။
Full Text feature သံုးျပီး ရွာရင္ second ပိုင္းေလာက္နဲ႔ ျပီးႏိုင္တ႔ဲ အလုပ္တစ္ခုကို LIKE နဲ႔ ရွာမယ္ဆိုရင္ မိနစ္ပိုင္းအထိၾကာသြားႏိုင္ပါတယ္။
            Full Text Search ဆိုတာကေတာ႔ data ကို insert နဲ႔ update အေျခအေနေတြမွာ word ေတြကို indexing လုပ္ျပီး search query လုပ္တဲ႔အခါမွာေတာ႔ အဲဒီ index data ကေနတဆင့္ ျပန္ရွာေပး လိုက္တဲ႔အတြက္ ပိုျမန္သြားပါတယ္။
           ပိုသာတဲ႔အခ်က္ကေတာ႔ ပိုျမန္လာတယ္ေပါ႔။ data ေတြအမ်ားၾကီးကို ျမန္ျမန္ပိုရွာလာႏိုင္တယ္။ ရႈပ္ေထြးစြာေရးရမယ့္ LIKE သံုးထားတဲ႔ query ကို လြယ္ကူရွင္းလင္းစြာ ေရးႏိုင္တယ္။ျပီေတာ႔ data result ကို order စီတဲ႔ေနရာမွာလည္း ရွာခိုင္းတဲ႔ word အမ်ားဆံုးပါတဲ႔ row က အေပၚဆံုးျဖစ္ေအာင္ စီေပးထားပါတယ္။ဒါေၾကာင့္ word search လုပ္ရာမွာ အစဥ္အလိုက္ျဖစ္မေနတဲ႔ word ေတြကိုလည္းရွာႏိုင္လာတယ္။
ဥပမာ။ရွာတဲ႔ word က "Thorium Training School"
ရွာလို႔ထြက္လာႏိုင္တဲ႔ result ေတြက
1. The best Training School in myanmar , Thorium.
2. Training Courses of Thorium School.
3. Thorium School teach computer programming courses.

တကယ္လို႔ LIKE "%Thorium Training School%" သံုးျပီး ရွာရင္ေတာ႔ စကားလံုး အတိအက်နဲ႔ word order ပါမွန္မွထြက္လာမွာျဖစ္ပါတယ္။ဒါေပမယ့္ LIKE ကို သံုးျပီး အထက္က result ထြက္ေအာင္ေရးလို႔ရေပမယ့္ ပိုမိုရႈပ္ေထြးသြားပါတယ္။
           အားနည္းခ်က္ကိုေျပာရမယ္ဆိုရင္ Full Text Search က insert , update နဲ႔ delete လုပ္တဲ႔အခ်ိန္ေတြမွာ ပိုၾကာသြားျပန္တယ္။ဘာလို႔လဲဆိုေတာ႔ word indexing ကို ျပန္ျပင္ေနရလို႔ျဖစ္ပါတယ္။ပိုဆိုးတာက Full Text Search နဲ႔ insert (သို႔) update လုပ္ေနတဲ႔အခ်ိန္မွာ Full Table Lock လုပ္ထားပါတယ္။ ဆိုလိုတာက အဲဒီအခ်ိန္မွာ တျခား ဘာquery မွ အဲဒီ table အတြက္အလုပ္မလုပ္ႏိုင္ပါဘူး။ဒါဟာ performance ကို အလြန္ထိခုိက္ေစပါတယ္။ေနာက္တစ္ခုက Full Text Search သံုးလိုက္လို႔ ျပဳလုပ္ရတဲ႔ word indexing ေၾကာင့္ index data size ဟာ data မ်ားလာတာနဲ႔အမွ် size ဟာ ၾကီးမားလာပါတယ္။
            ဒါေၾကာင့္ traditional LIKE ထက္ လည္း ပို ျမန္ေအာင္  Full Text Search ရဲ႕ အားနည္းခ်က္ကိုလည္း ေက်ာ္လႊားႏိုင္ေအာင္ elastic search technology ကို သံုးႏိုင္တယ္လို႔ မွတ္သားရပါတယ္။ elastic search အေၾကာင္းကေတာ႔ ေသခ်ာမသိေသးလို႔ ထည့္မေရးေတာ႔ပါဘူး။ ဖတ္ခ်င္ရင္ေတာ႔
https://www.elastic.co/ မွာဖတ္ၾကည့္ႏိုင္ပါတယ္။

Mysql မွာ Full Text Search feature သံုးခ်င္တဲ႔ column အတြက္ Full Text feature ကို enable  အရင္လုပ္ေပးထားရပါမယ္။

CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT,
      FULLTEXT (body)
    ) ENGINE=InnoDB;

အထက္က table create လုပ္တဲ႔ sql statement မွာဆိုရင္id column ရယ္ title column နဲ႔ body column ဆိုျပီး သံုးခုပါပါတယ္။ အဲဒီအထဲမွာမွ body column ကို full text feature enable လုပ္ထားပါတယ္။
ALTER TABLE  articles ADD FULLTEXT(body);
ေဆာက္ထားျပီးသား table ရဲ႕ column တစ္ခုကို full text feature enable လုပ္တာျဖစ္ပါတယ္။

full text search မွာ Mode သံုးမ်ိဳးရွိပါတယ္။
1.natural language search
default mode ျဖစ္ပါတယ္။ သာမန္လူသားတစ္ေယာက္လို ရွာေဖြေပးႏိုင္တဲ႔ mode လို႔ဆိုရမွာျဖစ္ပါတယ္။

2.boolean search
boolean mode မွာေတာ႔ text ကို ရွာတဲ႔ေနရာမွာ သာမန္ပါရံုကိုရွာခ်င္တာမ်ိဳးမဟုတ္ေတာ႔ပဲ ။ word တစ္ခုပါတဲ႔ row ကိုရွာျခင္း။ word တစ္ခု မပါတဲ႔ row ကိုရွာျခင္း ။ phrase တစ္ခုလံုးပါမပါ ရွာေဖြျခင္းေတြပါလုပ္လို႔ရပါတယ္။

3.query expansion search
query expension search ကေတာ႔ natural language search နဲ႔ ဆင္တူပါတယ္။ သူက search ကို ႏွစ္ဆင့္ ျပဳလုပ္ပါတယ္။ ပထမအၾကိမ္မွာေတာပ natural language search အတိုင္းျပဳလုပ္ျပီးေတာ႔ အဲဒီကထြက္လာတဲ႔ result text phrase အတိုင္း ဒုတိယအၾကိမ္ ထပ္ျပီး search လုပ္ေပးျပန္ပါတယ္။

One Example of Full Text Search
SELECT COUNT(*) FROM articles
WHERE MATCH (title,body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);

database စကားလံုးကို title နဲ႔ body ထဲမွာလိုက္ရွာခုိင္းတာျဖစ္ပါတယ္။

ဒီေလာက္ဆို Full Text Search အေၾကာင္း အနည္းငယ္သေဘာေပါက္မယ္ထင္ပါတယ္။ သံုးသင့္တယ္ မသံုးသင့္ဘူး ဆိုတာေတာ႔ ကိုယ္႔ဖာသာကိုယ္ ဆံုးျဖတ္ပါ။


Previous
Next Post »

Thorium School

Thorium School
Be professional with us