دوشنبه ۲۵ اسفند ۱۴۰۴

Monday, March 16, 2026 GMT +3:30

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

mysql-fulltext

جستجو در اطلاعات پایگاه داده را می توان جزء اولین و مهمترین نیازهای برنامه های تحت وب برشمرد که تقریبا هر برنامه نویسی در طی تجربه کاری خود با آن مواجه خواهد شد، در MySQL این جستجو از دو طریق میسر است، استفاده از دستور ساده LIKE و توابع Full-Text، دستور LIKE را در آموزش های مقدماتی به صورت جداگانه و مفصل توضیح داده ایم اما یکی از قابلیت های خوب MySQL که از نسخه 3.23 به بعد به آن اضافه شده، توابع Full-Text است که می تواند جهت کسب نتایج جستجوی سریع و تقریبا دقیق مورد استفاده قرار گیرد، هرچند برخی از قابلیت های Full-Text مربوط به کلمات انگلیسی است ولی توانایی آن برای کلمات فارسی آنقدر هست که بتوانیم بدون مشکل از آن استفاده کنیم و یا لااقل یکی از متدهای جستجو را بر مبنای آن قرار دهیم و در متدهای دیگر به فرض از LIKE استفاده نمائیم، در ادامه به توضیح اینکه چرا و چگونه از این قابلیت در کدهای PHP استفاده کنیم خواهیم پرداخت.

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


واقعیت این است هر کدام از روش های بالا دارای معایب و محاسنی هستند، به عنوان مثال استفاده از دستور LIKE معمولا نتایج بیشتری را برمی گرداند، شیوه نگارش و استفاده از LIKE ساده تر و به اصطلاح دم دستی تر است اما در عوض ممکن است نتایجی نامربوط یا تکراری داشته باشیم، از طرفی جستجو با متد LIKE در پایگاه داده MySQL مخصوصا در مورد جداولی که محتوای زیادی دارند در مقایسه با Full-Text زمانبرتر است و پردازش کار در این حالت به طور معمول فشار بیشتری به سرور وارد می کند که این موضوع برای سرورهای با توان سخت افزاری پائین می تواند یک مشکل اساسی باشد، علاوه بر موارد گفته شده برخی قابلیت های Full-Text با دستور LIKE بدست نمی آیند که این به ماهیت متفاوت این دو روش برمی گردد.

ایجاد قابلیت Full-Text در جداول MySQL


قابلیت جستجوی Full-Text بر روی ستون هایی از نوع CHAR ,VARCHAR و TEXT و موتور MyISAM قابل اعمال است و هم زمان با ایجاد جدول یا بعد از آن نیز می توانیم به ستون مورد نظر آن را اضافه کنیم، به طور مثال در پرس و جوی نمونه زیر هم زمان با ساخت جدول، قابلیت جستجوی Full-Text را برای ستون فرضی title در نظر گرفته ایم:
CREATE TABLE post(
title VARCHAR(255),
FULLTEXT KEY title(title)) ENGINE=MyISAM
همان طور که اشاره شد می توانیم بعد از ساخت جدول و ستونها نیز جستجوی Full-Text را اضافه کنیم، برای افزودن این قابلیت بعد از ساختن جدول و ستونها، مقادیر SQL زیر را اجرا می کنیم:
ALTER TABLE post ADD FULLTEXT(title);
به این صورت این قابلیت به جدول و ستون موجود اضافه می شود.

شیوه جستجو در Full-Text


شیوه جستجو در Full-Text بر اساس 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
باید توجه کرد که Full-Text برای ایندکس کلمات محدودیت هایی اعمال می کند، از جمله اینکه اگر کلمه ای کمتر از 4 کاراکتر باشد ایندکس نمی شود، اگر کلمه ای در بیش از 50% ردیف ها تکرار شود ایندکس نمی شود، اگر کلمه ای در لیست Stopword ها باشد ایندکس نمی شود (البته این ویژگی مخصوص حروف انگلیسی است) و نهایتا اینکه برای شروع ایندکس کلمات برای جستجوی  Full-Text نیاز به وجود حداقلی از اطلاعات در ردیف ها است.

قابلیت های جستجو در Full-Text


قابلیت های دیگر این تابع جستجوی IN BOOLEAN MODE است که امکانات بیشتری در اختیارمان قرار می دهد (اضافه شده به MySQL از نسخه 4.0.1)، با استفاده از این قابلیت می توانید شمول ابتدا و انتهای یک کلمه را در جستجو تعیین کنید:
SELECT * FROM post WHERE MATCH (title) AGAINST ('+phpcode -htmlcode' IN BOOLEAN MODE);
در مثال بالا اگر کاربر عبارت code را جستجو کند، تیترهای حاوی عبارت phpcode در جستجو خواهند آمد اما تیتر های حاوی عبارت htmlcode در لیست نتایج ظاهر نمی شوند، از ویژگی های جستجو در حالت BOOLEAN MODE نادیده گرفتن قانون 50% است.
اما قابلیت Full-Text با امکان دیگری کامل می شود که Query Expansion نام دارد، همانطور که از معنی Expansion (توسعه) برمی آید نتایج جستجوی معمولی با Full-Text به دلیل اعمال محدودیت ها و سخت گیری در ایندکس کلمات و یا استفاده از Stopword ها، ممکن است بعضا دربرگیرنده همه نتایج نباشد، با افزودن Query Expansion حداقل به لحاظ تئوری می توانیم موارد معمولی تر را نیز در لیست جستجو نشان دهیم:
SELECT title FROM post
WHERE MATCH (title)
AGAINST ('$searchword' WITH QUERY EXPANSION);
دسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
آموزش ساخت فرم عضویت در سایت با PHP و MySQL
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
صفحه بندی مطالب و محتوا با PHP و MySQL
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
ایجاد لینک دانلود مدت دار با PHP و MySQL
دیدگاه
more ۷۳ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
parisa
۲۳:۰۴ ۱۳۹۵/۰۹/۱۰
شاید سوالم خیلی مسخره باشه اما من نمیدونم این کدا رو کجا بنویسم. یه توضیح کوچیک میدین.
با mysql کار کردم اما الان گیج شدم :(
این کدها باید توسط دستورات PHP به کار برده شوند، در واقع باید با PHP و MySQL آشنا باشید، در غیر اینصورت لطفا به آموزش های مقدماتی مراجعه کنید.
پریسا
۲۱:۳۰ ۱۳۹۵/۰۹/۱۰
خدایییییییییی سایت آموزشی به این محشری ندیدم.....
اونقدری که اینجا مشکلاتم حل شده تو کل گوگل نشده. تازه اونم به بهتریییییییییین روش ممکن و بدون سردرگمی. انشالله هرچی میخواین از خدا بهتون بده. دمتون گرررررررررم
۱۲:۴۳ ۱۳۹۵/۰۴/۱۲
سلام و عرض خسته نباشید خدمت دوستان عزیز.
به دلیل منقضی شدن mysql_query و از این دست دستورات از ورژن 5 به بعد در php لطفا آموزش استفاده از کلاس PDO رو بذارید.
با تشکر :)
متاسفانه در کوتاه مدت امکانپذیر نیست!
رز
۰۰:۱۱ ۱۳۹۵/۰۳/۱۸
چجوری ادرس رو ذخیره کنم خب اگه تصویر ذخیره نکنیم خب الان من میخوام محصولات رو تو صفحات سایت نشون بدم
بنظرتون چجوری وصل شم به پایگاه داده و نشون بدم تصویر و قیمت و نام محصول رو
توضیح بدین لطفا
اگر تصاویرتان آپلود می شوند، لطفا عبارت "نحوه آپلود فایل با PHP - وبگو" را در وب جستجو کنید، در هنگام آپلود فایل می توانید اطلاعات جامعی از آنها داشته باشید و به نحو دلخواه با نوشتن پرس و جو اطلاعات را در دیتابیس به صورت متنی ساده ذخیره کنید، اما اگر تصاویر از قبل در سرور موجود باشد، می توانید از نمونه کدهای زیر استفاده کنید:
http://stackoverflow.com/questions/2059891/php-get-list-of-all-filenames-contained-within-my-images-directory

http://stackoverflow.com/questions/8414746/get-filenames-of-images-in-a-directory
متاسفانه توضیح این مطالب خود نیاز به آموزش های جداگانه دارد و در قالب یک پاسخ نمی توان تمام نکات را توضیح داد، در واقع شما باید تا حدودی با برنامه نویسی وب آشنا باشید!
رز
۲۱:۳۵ ۱۳۹۵/۰۳/۱۷
با سلام
ببخشید من یه عکس تو دیتابیس ما اس کیو ال ذخیره کردم
چجوری اونو تو صفحه وب نشونش بدم
اگه اطلاعاتی دارید کمک کنین
مرسی
ذخیره تصاویر در دیتابیس در وب چندان توصیه نمی شود، چون برای نمایش آن (در برخی مرورگرها) ممکن است با مشکلاتی روبرو شوید و از طرفی حجم کلی پایگاه داده به میزان زیادی افزایش می یابد، بهتر است تصاویر را به صورت معمول در هارددیسک سرور ذخیره و تنها آدرس یا نام آنها را در دیتابیس ثبت کنید.
اما جهت اطلاعات بیشتر، نوع داده برای ذخیره تصاویر در MySQL نوع BLOB به معنی Binary Large OBject است که برای نمایش تصویر باید یک دستور header تنظیم کنید:
header("Content-type: image/jpeg");
echo $row['image_column'];
توجه کنید که قبل از این دستورات هیچ خروجی نباید به مرورگر ارسال شود (شامل کاراکترهای نامرئی BOM نیز می شود)، روش دیگر نمایش، استفاده از data:image و base64_encode است:
<?php echo '<img src="data:image/jpeg;base64,' . base64_encode($row['image_column']) . '">'; ?>
رز
۱۲:۰۳ ۱۳۹۵/۰۳/۱۱
با سلام
من چجوری محتوای صفحه وب سایت رو با php درست کنم
لطفا توضیح بدین
PHP یکی از زبان های برنامه نویسی وب است و نیاز به فراگیری از مقدمات دارد، لذا نمی توان در قالب یک پاسخ گفت چگونه می توانید از آن استفاده کنید!
زهرا
۱۴:۳۳ ۱۳۹۵/۰۳/۰۴
سلام
یه مشکل دیگه هم دارم
قالب سایت رو طراحی کردم و تک تک قسمت هاشو مثل هدر و محتوا رو هم در مسیر سرور قرار دادم
ولی وقتی میرم قسمت لوکال هاست (local host) صفحه سایتم اجرا میشه ولی وقتی روی گزینه مثلا درباره ما کلیک میکنم خروجیش در صفحه دیگه ای نشون داده میشه
چیکار کنم خروجی در همون صفحه دیده بشه و نره یه صفحه دیگه
بی زحمت مفصل بگین
در صورتی که لینک های شما به صورت
target="_blank"
نباشند، در حالت معمول باید در همان صفحه جاری نمایش داده شوند، لذا این پارامتر را از تگ a حذف کنید! به طور مثال لینک از این حالت:
<a href="webgoo.ir" target="_blank">
باید به صورت زیر باشد:
<a href="webgoo.ir">
زهرا
۲۲:۳۱ ۱۳۹۵/۰۳/۰۳
لطف کنین بگین چجوی صفحه جستجو بسازیم با php برا سایت
مرسی از سایت خوبتون
می توانید از نمونه آموزش زیر استفاده کنید:
http://www.webreference.com/programming/php/search/index.html
زهرا
۲۰:۲۲ ۱۳۹۵/۰۳/۰۳
سلام
این کدها رو کجا بنویسیم اجرا بشه؟؟؟؟؟؟؟؟؟
کدهای PHP برخلاف کدهای ساده HTML برای اجرا نیازمند یک سرور هستند، در این صورت شما در هر قسمت از فایل با پسوند php کدها را درج کنید، با فراخوانی آن فایل، مفسر کدها را پردازش کرده و نتیجه را چاپ می کند، البته به نظر آشنایی مقدماتی شما در این خصوص پائین است که باید سعی کنید اطلاعاتتان را در خصوص PHP افزایش دهید (PHP یک زبان برنامه نویسی تحت وب است و کار با آن بدون طی آموزش های مقدماتی عملا ممکن نیست!).
زهرا
۱۹:۱۴ ۱۳۹۵/۰۲/۲۵
سلام
من نقشه سایت رو روی کاغذ کشیدم و کشیدم که سایت از کدوم بخشها تشکیل شده و چی میخوام بعدش چیکار کنم
با کدوم زبان برنامه نویسی و برنامه ای دیتابیسش رو بنویسم
تو رو خدا کمک کنید.
نوشتن یک برنامه کاربردی نیاز به مهارت بالا و کسب دانش لازم از مقدمات دارد که باید در جای خود فراگرفته شود، نباید انتظار داشته باشید که تمام مباحث در این قسمت از ابتدا توضیح داده شوند، صرفا جهت راهنمایی بیشتر باید مجموعه زبان های مربوط به وب از HTML و CSS تا PHP و دیتابیس MySQL را بلد باشید! لطفا سوالات خارج از موضوع این مطلب را صرفا از طریق ایمیل سایت (موجود در بخش تماس) مطرح نمائید.
زهرا
۲۲:۳۲ ۱۳۹۵/۰۲/۲۴
سلام
تو طراحی فروشگاه انلاین اول میان پایگاه داده رو ایجاد میکنند
یا قالب سایت و لینک ها و منو ها رو
و بعد وصلش میکنن به پایگاه داده
بی زحمت بگین
تفاوت خاصی وجود ندارد مهم برنامه نهایی است، معمولا ساختار دیتابیس با توجه به امکانات مورد نیاز در بخش کاربری و مدیریت تعریف می شود، به عبارتی ابتدا باید بدانید برنامه شما چه بخش ها و امکاناتی در قسمت مدیریت و کاربری دارد سپس متناسب با آن ساختار پایگاه داده را تعریف کنید، برای راحتی کار بهتر است موارد را روی یک کاغذ یادداشت و چارت بندی کنید، همچنین باید از نظر کدنویسی مسلط و از قبل تمرین داشته باشید چون نوشتن چنین پروژه ای به شکل مطلوب، ساده نخواهد بود!
زهرا
۲۱:۰۴ ۱۳۹۵/۰۲/۲۴
سلام
یه سوال دیگه داشتم
تورو خدا کامل توضیح بدین
چجوری میتونم پایگاده داده فروشگاه انلاین رو نوشت
با کدومش راحت تره
لطفا مراحلشو کامل توضیح بدین
تور خدا واسه پروژه لازم دارم خیلی ضروریه
سوالتان خیلی کلی است و اصولا به این سبک سوالات پاسخ کلی داده می شود! در مورد اینکه با کدام زبان باید این پروژه را بنویسید قاعدتا بستگی به میزان تسلط و آشنایی شما با آن زبان و همچنین ملزومات نرم افزاری و سخت افزاری در دسترس دارد، معمولا PHP زبان در دسترس تری نسبت به ASP.NET است، اما با هر دو زبان می توانید به نتیجه یکسان دست پیدا کنید، نحوه طراحی ساختار پایگاه داده خود یک مهارت حرفه ای محسوب می شود و نمی توان در قالب توضیح مختصر آن را خلاصه کرد، شاید در کنار فراگیری آموزش های مقدماتی مربوطه و تمرین قبلی، بررسی ساختار دیتابیس چند پروژه آماده به شما کمک کند.
زهرا
۲۰:۵۸ ۱۳۹۵/۰۲/۲۲
با سلام
یه سوال داشتم
من یه پایگاه داده asp دانلود کردم میشه بگین با کدوم برنامه بازش کنم و کد هاشو ببینم
مرسی
لطفا به سایت های مرتبط با زبان های مایکروسافت و ASP.NET مراجعه کنید!
امین
۱۹:۵۸ ۱۳۹۴/۱۰/۲۷
سلام استاد.
من یه فیلد دارم که tag ها رو میزارم داخلش.
منظور همون کلمات برجسته هر پست هست. حالا میخوام بر اساس این فیلد ها پست های مرتبط به هم رو پیدا کنم.
مثلن tag هام شامل "ایران-آلمان-آمریکا" باشه.
با فول تکست میشه پیدا کرد اما میخوام اولویت بدم بطوریکه مثلا پست هایی که هر سه کلمه ایران آمریگا و آلمان توشه اول بیاد بعد اون پست هایی که دو تا کلمه توشونن بعد تکی ها..
این کار اصلا آیا شدنی هست؟
قاعدتا شدنی است، اما نه به ساده گی! برای این کار باید الگوریتم آن را بنویسید، به طور مثال آنچه که در نگاه اول و در ساده ترین حالت به ذهن می رسد اینکه ابتدا یک پرس و جو داشته باشید که با WHERE، AND و LIKE یا دستورات REGEX در MySQL صرفا ردیف هایی را انتخاب کنید که همه تگ ها (سه تگ) را داشته باشد، سپس یک پرس و جو با دو تگ و در نهایت پرس و جو با یک تگ، در نهایت خروجی را با حذف موارد تکراری چاپ کنید، البته این صرفا در تئوری و در یک نگاه بود، برای به عمل درآوردن آن قاعدتا باید تجربه کدنویسی پیشرفته PHP را داشته باشید!
M
۱۱:۵۴ ۱۳۹۴/۰۳/۱۰
سلام.
من با html ظاهر یک جستجو را در صفحه سایتم ساختم که شامل لیبل و دکمه جستجو هست. اینم کدش:
<input type="submit" name="submit" value="جستجو" />
بعد برنامه های بالا رو که آموزش دادید توی فایل search.php ریختم و با دستور
<form action="search.php" method="POST">
در صفحه html فراخوانی کردم.
وقتی روی دکمه جستجو می زنم یک صفحه جدید باز می شود که خودش شامل لیبل و دکمه search هست که وقتی کلمه ای را می نویسم و روی دکمه سرچ می زنم به صفحه Object not found! منتقل می شود.
یک سوال کلی: آیا کدهای بالا را باید در فایل php ذخیره کنیم و بعد در صفحه اصلی html فراخوانی کنیم؟؟؟
می خواهم برای دکمه جستجو که خودم ساختم این کدها اعمال شود چه جوری ؟؟؟؟
متشکرم..
- مطلب حاضر، آموزش سطح بالا است و تنها برای کسانی که آشنایی لازم با PHP و MySQL را داشته باشند مناسب است!
- برای ایجاد امکان جستجو باید در یک قسمت فرم HTML داشته باشید که اطلاعات را به سرور (فایل PHP) ارسال کند، در فایل PHP اطلاعات ارسالی کاربر دریافت، پردازش و متناسب با هدف و نیاز، خروجی در مرورگر چاپ می شود (برای نمونه فرم جستجوی سایت را بررسی کنید!)، البته تعریف صحیح این فرآیند تنها با گذارندن مراحل مقدماتی تر و آشنایی با مواردی مانند LIKE در MySQL امکانپذیر است و پاسخ کوتاهی ندارد!
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
3 × 5
20 × 20
=