جستجو با استفاده از Full-Text برای جستجو در متن های طولانی تعریف شده است و ممکن است در جدول های کوچک و با متن های کوتاه نتیجه ای برنگرداند. مثلا اگر متن فیلد های مورد جستجو طول کمی داشته باشند یا در تمام رکورد ها کلمه مورد نظر تکرار شده باشد نتیجه کوئری خالی خواهد بود.
فهرست
1. نمونه اولیه
پیدا کردن کلمه database در دو فیلد title و body از جدول articles و دریافت ردیف های جستجو شده
mysql> SELECT * FROM articles
WHERE MATCH (title, body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);
2. نمایش امتیاز با توجه به رخداد کلمه در جستجو
محاسبه میزان رابطه کلمه Tutorial در دو فیلد title و body از جدول articles
mysql> SELECT id, MATCH (title, body)
id
title
body
-> AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score
score
-> FROM articles;
articles
زمانی که از double-quotation در عبارت پس از AGAINST استفاده می شود، عبارت وارد شده به صورت کامل در فیلد ها جستجو می شود.
برای مثال در کوئری زیر هر دو کلمه PHP و Tutorial جدا شده و در متن جستجو می شوند.
AGAINST ('PHP Tutorial' IN NATURAL LANGUAGE MODE)
اما در کوئری زیر فقط جستجوی عبارت PHP Tutorial انجام می شود.
AGAINST ('”PHP Tutorial”' IN NATURAL LANGUAGE MODE)
جدا کردن کلمات می تواند با استفاده از فاصله، کاما و نقطه انجام شود.
AGAINST ('PHP Tutorial' IN NATURAL LANGUAGE MODE) AGAINST ('PHP,Tutorial' IN NATURAL LANGUAGE MODE) AGAINST ('PHP.Tutorial' IN NATURAL LANGUAGE MODE)
کلمات خیلی کوتاه از لیست جستجو حذف می شوند. حداقل طول مجاز برای جستجو در تنظیمات پیش فرض MySQL چهار حرف می باشد. کلمات stopwords مانند the و some نیز از لیست جستجو حذف می شوند.
این تنظیمات در Fine-Tuning بانک اطلاعاتی قابل تغییر هستند.
همچنین برای بیش از دو رکورد در جدول ها مورد استفاده قرار می گیرد. نتایج برای کمتر از دو رکورد و آستانه نتیجه 50% خالی خواهد بود.
در این روش پیش از هر کلمه مورد جستجو عملگر مشخصی قرار می گیرد که نحوه جستجو یا پردازش آن کلمه را در نظر می گیرد.
برای مثال در کوئری زیر با اضافه کردن عملگر + (مثبت) به دنبال جستجو رکوردهایی هستیم که MySQL در آن ها وجود داشته و با عملگر – (منفی) مشخص می کنیم که در همان رکوردها YourSQL وجود نداشته باشد.
mysql> SELECT * FROM articles WHERE MATCH (title, body)
-> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
عملگر
توضیح
+
حتما باید وجود داشته باشد.
-
نباید وجود داشته باشد.
بدون عملگر
می تواند در متن باشد یا نباشد.
<
افزایش اهمیت وجود کلمه در متن
>
کاهش اهمیت وجود کلمه در متن
( )
گروه بندی دو یا چند کلمه در اولویت بالاتر
~
برای معرفی کلمات نویز استفاده می شود و رکورد هایی که شامل این کلمه باشند پایین تر از سایرین نمایش داده می شوند(اما حذف نمی شوند).
*
برای جلوگیری از حذف شدن کلمات کوتاه با توجه به تنظیمات.
مثلا جستجوی +the* باعث می شود که این کلمه با اینکه کمتر از چهار حرف دارد اما در جستجو وارد شود.
"
وقتی در اطراف کلمات قرار گیرد عبارت به صورت کامل جستجو می شود.
جستجوی رکوردهایی که یکی از دو کلمه را داشته باشند.
'apple banana'
رکوردهایی که حتما دو کلمه را داشته باشند.
'+apple +juice'
رکوردهایی که apple در آن ها وجود داشته باشد اما از رکورهایی که macintosh هم در آن ها وجود دارد اولویت بالاتری دارند.
'+apple macintosh'
رکوردهایی که دو کلمه در آن ها وجود ندارند.
'+apple -macintosh'
رکوردهایی که apple در آن ها وجود دارد. اما اگر macintosh در آن ها هم وجود داشت پایین تر از رکوردهای بدون macintosh نمایش داده شوند.
'+apple ~macintosh'
رکوردهایی که هر سه کلمه در آن ها وجود دارند اما امتیاز apple turnover از apple strudel بالاتر باشد.
'+apple +(>turnover <strudel)'
برای جستجوی کلماتی مانند apple، apples، applet و ...
'apple*'
جستجوی کامل عبارت some words در متن
'"some words"'
ویژگی این نوع جستجو این است که کلمات مرتبط به جستجوی انجام شده را در عملیات وارد می کند. مثلا جستجوی کلمه ای مانند database در متن ها می تواند به MySQL، Oracle و ... داشته باشد و اگر چنین جستجویی انجام شود رکوردهای دارای MySQL و Oracle هم در نتایج نمایش داده خواهد شد.
-> WHERE MATCH (title, body)
-> AGAINST ('database' WITH QUERY EXPANSION);
[mysqld]
ft_min_word_len=3
ft_max_word_len=12
در صورت تغییر چنین تنظیماتی باید ایندکس های ستون ها از نو تنظیم شوند.
12. لیست سفارشی stopwords
برای آدرس دهی لیست فایل کلمات stopwords به صورت سفارشی از تنظیم زیر استفاده می شود.
ft_stopword_file = /path/to/file
لیست پیش فرض MySQL فقط شامل کلمات انگلیسی می باشد.
13. تغییر آستانه
برای تغییر آستانه 50 درصدی باید ویرایش عبارت
#define GWS_IN_USE GWS_PROB
به
#define GWS_IN_USE GWS_FREQ
در فایل storage/myisam/ftdefs.h انجام شود. سپس MySQL مجددا کامپایل شود. نیازی به تنظیم مجدد ستون ها به ایندکس full-text وجود ندارد.
به جای تنظیم مجدد همه ایندکس های full-text پس از انجام تغییر در تنظیمات می توان یک تعمیر سریع روی جدول انجام داد.
mysql> REPAIR TABLE tbl_name QUICK;