آموزش MATCH و AGAINST در MySQL full text search
- توسط : علی حسین شهابی
- 0 نظر
سلام دوستان گرامی
در ادامه معرفی MySQL full text search می خواهم توابع MATCH و AGAINST را بیان کنم .
اگر مقاله قبلی (معرفی MySQL Full-Text Search) را نخوانده اید . توصیه می کنم ابتدا آن را مطالعه کنید تا با full text search آشنا شوید .
همانطور که در جلسه قبل هم اشاره کردم , ایندکس full text search فقط برای جداول InnoDB و MyISAM ارائه شده است. و فقط ستون هایی که از نوع CHAR و VARCHAR, وTEXT را می توان ایندکس full text قرار داد .
در full text search , مای اس کیوال دنبال رکوردهایی است که بیشترین ارتباط را با عبارتی که کاربر جستجو کرده, داشته باشد . و در واقع به هر رکورد خروجی که پیدا می کند یک امتیاز می دهد که با استفاده از این امتیاز , می تواند مشخص کند کدام خروجی به عبارت جستجو شده نزدیک تر است . اگر امتیاز ارتباطی برابر با صفر بود , به این معنی است که این رکورد هیچ تشابهی با عبارت جستجو شده ندارد .
MySQL این مقدار امتیاز را با استفاده از فاکتورهای مختلف مانند : تعداد کلمات هر رکورد , تعداد کلمات unique در هر رکورد , تعداد رکورهایی که با عبارت جستجو شده تطابق دارند و …. محسابه می کند .
خب حالا بریم سراغ فانکشن های MATCH() و AGAINST() .
فانکشن MATCH مشخص می کند که در کدام ستون باید به دنبال عبارت جستجو شده بگردد و فانکشن AGAINST که عبارت جستجو شده چگونه باید سرچ شود .
در ادامه یک مثال را با هم بررسی می کنیم تا بهتر با این دو تابع آشنا شویم :
فرض کنید جدولی داریم به نام products که شامل لیست محصولات می باشد . ابتدا ایندکس FULL TEXT را با استفاده از ALTER TABLE ADD FULLTEXT به ستون productLine اختصاص می دهیم .
ALTER TABLE products
ADD FULLTEXT(productline)
در مرحله دوم به دنبال محصولاتی می گردیم که در خط تولید (productline) آنها کلمه ی Classic باشد .
SELECT productName, productline
FROM products
WHERE MATCH(productline) AGAINST('Classic')
خروجی :
یا مثلا دنبال محصولاتی بگردیم که در فیلد خط تولید آنها کلمات Classic و Vintage باشد :
SELECT productName, productline
FROM products
WHERE MATCH(productline) AGAINST('Classic,Vintage')
خروجی :
آموزش Full-Text Search
فانکشن AGAINST به صورت پیشفرض از مد “IN NATURAL LANGUAGE MODE” برای پیدا کردن رکوردهای مشابه پیدا می کند . ولی اگر شما بخواهید مدهای دیگر را تست نمایید می توانید به عنوان پارامتر دوم فانکشن AGAINST , نام آن را ذکر نمایید :
SELECT productName, productline
FROM products
WHERE MATCH(productline)
AGAINST('Classic,Vintage' IN NATURAL LANGUAGE MODE)
همچنین به صورت پیش فرض عملیات جستجو را به صورت case-insensitive انجام می دهد یعنی حساسیتی به حروف کوچک و بزرگ ندارد که می توان تعیین کرد جستجو case-sensitive باشد , یعنی به حروف کوچک و بزرگ حساس باشد .
مرتب کردن نتایج خروجی در FULL TEXT
یکی از مهم ترین موارد در full-text search این است که نتایج خروجی به چه ترتیبی نمایش داده می شوند . زمانی که از فانکشن MATCH() در جلوی WHERE استفاده می کنید , MySQL رکوردهایی که تطابق بیشتری با عبارت سرچ شده را دارند , در بالا تر نشان می دهد .
این مسئله را با یک مثال بررسی کنیم :
فرض کنید در همان جدول products فیلدی به نام productName داریم و می خواهیم به این فیلد , ایندکس FULLTEXT اختصاص دهیم :
ALTER TABLE products
ADD FULLTEXT(productName)
حالا به دنبال محصولاتی هستیم که نام آنها دارای Ford یا 1932 و یا ترکیبی از آنها باشد .
SELECT productName, productline
FROM products
WHERE MATCH(productName) AGAINST('1932,Ford')
خروجی :
همانطور که مشاهده می کنید محصولاتی که نام آنها شامل هر دو کلمه ی 1932 و Ford است در ابتدای لیست نمایش داده شده است .
- کوچیکترین کلمه ای که می توانیم در FULLTEXT به دنبال آن بگردیم باید شامل 4 کاراکتر باشد و کلمات کوچک تر از 4 کاراکتر , نتیجه ای را بر نمیگردانند . برای مثال نمی توانیم کلمه CAR را جستجو نماییم .
خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.