آموزش MATCH و AGAINST در MySQL full text search

علی حسین شهابی

1395/8/14

نظر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')

خروجی :

آموزش FULLTEXT

آموزش FULLTEXT

یا مثلا دنبال محصولاتی بگردیم که در فیلد خط تولید آنها کلمات Classic و Vintage باشد :

SELECT productName, productline
FROM products
WHERE MATCH(productline) AGAINST('Classic,Vintage')

خروجی :

آموزش Full-Text Searchآموزش 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')

خروجی :

آموزش FULL TEXT

آموزش FULL TEXT

همانطور که مشاهده می کنید محصولاتی که نام آنها شامل هر دو کلمه ی 1932 و Ford است در ابتدای لیست نمایش داده شده است .

  • کوچیکترین کلمه ای که می توانیم در FULLTEXT به دنبال آن بگردیم باید شامل 4 کاراکتر باشد و کلمات کوچک تر از 4 کاراکتر , نتیجه ای را بر نمیگردانند . برای مثال نمی توانیم کلمه CAR را جستجو نماییم .

خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید. 

اینستاگرام علی حسین شهابی لینکدین علی حسین شهابی

3 نظر

( 1395/11/4 )هتل آپارتمان مشهد

ممنونم از سایت خوبتون سپاس

( 1396/1/29 )فروش گارمین

با سلام آموزش خوبی بود. سپاسگزارم.

( 1396/2/7 )علی حسین شهابی

سلام .. خواهش میکنم

ارسال نظر جدید

 
Not signed in

کلیه حقوق مادی و معنوی , متعلق به سایت (Alihossein.ir)می باشد ,انتشار مطالب بدون ذکر منبع از نظر اخلاقی و شرعی صحیح نمی باشد.