تبلیغات
Fact World - جستجو در مطالب سایت با استفاده از MySQL Full-Text و PHP

آموزش برنامه نویسی و مهارتهای وب

article 

جستجو در مطالب سایت با استفاده از MySQL Full-Text و PHP

mysql-fulltextیکی از قابلیت های خوب MySql که از نسخه 3.23 به بعد به آن اضافه شده، توابع Full-Text است که می تواند جهت کسب نتایج جستجوی سریع و دقیق مورد استفاده قرار گیرد، هرچند برخی از قابلیت های Full-Text یا تمام متن، مربوط به کلمات انگلیسی است ولی توانایی آن برای کلمات فارسی آنقدر هست که بتوانیم بدون مشکل از آن استفاده کنیم و یا لااقل یکی از متدهای جستجو را بر مبنای آن قرار دهیم و در متدهای دیگر به فرض از like استفاده نمائیم؛ در ادامه به توضیح اینکه چرا و چگونه از این قابلیت در کدهای php استفاده کنیم، خواهیم پرداخت.

چرا باید از قابلیت Full-Text به جای like یا در کنار آن استفاده کنیم؟


واقعیت مطلب این است که هر کدام از قابلیت های گفته شده دارای معایب و محاسنی هستند، به عنوان مثال استفاده از like نتایج بیشتری را برمی گرداند ولی در عوض ممکن است نتایجی نامربوط یا تکراری داشته باشد، از طرفی جستجو با متد like در پایگاه داده مخصوصا در جداولی که محتوای زیادی دارند در مقایسه با Full-Text بیشتر زمان می برد؛ از اینها گذشته برخی قابلیت های تمام متن با like بدست نمی آیند.
قابلیت FULLTEXT بر روی ستون هایی از نوع CHAR ,VARCHAR و TEXT و موتور MyISAM ENGINE قابل اعمال است و قبل از ایجاد جدول یا بعد از آن نیز می توانیم به ستون مورد نظر آن را اضافه کنیم:
<?php
mysql_query("CREATE TABLE post(
title VARCHAR(255),
FULLTEXT KEY title(title)) ENGINE=MyISAM ")
?>
برای افزودن این قابلیت بعد از ساختن جدول و ستون، مقادیر sql زیر را پس از تغییرات دلخواه با توجه به تنظیمات ستون مورد نظر اجرا کنید:
ALTER TABLE post ADD FULLTEXT(title);
شیوه جستجو در FULLTEXT بر اساس MATCH() ... AGAINST صورت می گیرد:
SELECT title FROM post
WHERE MATCH (title) AGAINST ('$searchword');
برای جستجو از چند ستون در مقادیر MATCH می توانید از کاما استفاده کنید؛ همچنین می توان از قابلیت امتیاز دهی (score) این تابع نیز جهت چینش نتایج استفاده کنید:
SELECT *, MATCH (title) AGAINST ('$searchword') AS score FROM post
WHERE MATCH (title) AGAINST ('$searchword') ORDER BY score ASC
باید توجه کرد که FULLTEXT برای ایندکس کلمات محدودیتهایی اعمال می کند، از جمله اینکه اگر کلمه ای کمتر از 4 کاراکتر باشد ایندکس نمی شود، اگر کلمه ای در بیش از 50% ردیف ها تکرار شود ایندکس نمی شود، اگر کلمه ای در لیست stopword ها باشد ایندکس نمی شود (البته فعلا فقط مخصوص حروف انگلیسی است) و نهایتا اینکه برای شروع ایندکس کلمات تمام متن، ممکن است نیاز به حداقلی از محتویات باشد.
قابلیتهای دیگر این تابع جستجوی IN BOOLEAN MODE است که امکانات بیشتری در اختیارمان قرار می دهد (اضافه شده به Mysql از Version 4.0.1)، با استفاده از این قابلیت می توانید شمول ابتدا و انتهای یک کلمه را در جستجو تعیین کنید:
SELECT * FROM post WHERE MATCH (title) AGAINST ('+phpcode -htmlcode' IN BOOLEAN MODE);
در مثال بالا اگر کاربر عبارت code را جستجو کند، تیتر های حاوی عبارت phpcode در جستجو خواهند آمد اما تیتر های حاوی عبارت htmlcode در لیست نتایج ظاهر نمی شوند؛ از ویژگی های جستجوی BOOLEAN MODE نادیده گرفتن قانون 50% است.
اما قابلیت تمام متن با امکانی دیگر کامل می شود که Query Expansion نام دارد، همانطور که از معنی Expansion (توسعه) بر می آید نتایج جستجوی معمولی با FullText به دلیل اعمال محدودیت ها و سخت گیری در ایندکس کلمات و یا استفاده از stopword ها، ممکن است بعضا دبرگیرنده همه نتایج نباشد، با افزودن Query Expansion می توانیم موارد معمولی تر را نیز در لیست جستجو نشان دهیم:
SELECT title FROM post
WHERE MATCH (title)
AGAINST ('$searchword' WITH QUERY EXPANSION);

section دسته بندی: آموزش کاربردی - آموزش کاربردی MySQL -


یکشنبه 13 مهر 1393

نظرات ()


شنبه 14 مرداد 1396 02:14 ب.ظ
Thanks for every other excellent article. The
place else could anyone get that kind of info in such an ideal method of writing?

I've a presentation subsequent week, and I'm at the search for such info.

نظر خود را ثبت کنید:

 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر



آگهی
آموزش طراحی سایت
webgoo.ir

آموزش برنامه نویسی و مهارتهای وب
امکانات جانبی


IP شما: ( )