جستجو در مطالب سایت با استفاده از MySQL Full-Text
جستجو در اطلاعات پایگاه داده را می توان جزء اولین و مهمترین نیازهای برنامه های تحت وب برشمرد که تقریبا هر برنامه نویسی در طی تجربه کاری خود با آن مواجه خواهد شد، در 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);آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
تعویض کد امنیتی Captcha با Ajax و MySQL
آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
آموزش ساخت فرم عضویت در سایت با PHP و MySQL
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
من میخوام یک قسمت جست و جو برای مطالب سایتم داشته باشم اما نمیدونم چطوری..... اگه میشه لطفا کمکم کنین ...... مرسی
- کار با تگ form در HTML.
- کار با متدهای GET و POST در PHP.
- کار با LIKE و مشتقات آن در MySQL و سپس در صورت نیاز آشنایی با قابلیت Full-Text یا طراحی سیستم جستجو بر اساس الگوریتم های شخصی.
SELECT title FROM post
WHERE MATCH (title)
AGAINST ('$searchword' WITH QUERY EXPANSION);در این کد بالا که از searchword استفاده کردید از دیتابیس خوانده میشود؟و یک سوال دیگه کاربری کلمه ای رو جستجو کرد آیا لازم اون کلمه داخل دیتابیس ذخیره بشه یا نه؟
چون گیج شدم. اگه امکانش هست راهنماییم کنید اگر هم مثال بزنید بهتر میشود
$dbresult = mysqli_query($dblink, "SELECT * FROM `karbar` ORDER BY id DESC LIMIT 10");باید کار با ORDER BY، چینش با ASC DESC و LIMIT در MySQL را فرا بگیرید، کد بالا به صورت نمونه و صرفا جهت راهنمایی بر اساس ستون فرضی id ویرایش شد (اگر ستون id در جدول شما وجود ندارد از ستونی استفاده کنید که در جدول وجود داشته باشد).
$sql = "SELECT * FROM `karbar` WHERE `sname` LIKE '%".$key ."%';";می خواهم Like نباشد ممنون می شوم کمکم کنید
$sql = "SELECT * FROM `karbar` WHERE `sname` = '".$key ."';";زمانی که کلمه مورد نظر را برای سرچ تایپ میکنم و بعد دکمه سرچ رو میزنم وقتی میخواد سرچ کنه به جای سرچ کد فایل php مو نشون میده
تو رو خدا کمکم کنید........
با تشکر
پست مهمان یک قابلیت کاربردی است که در CMS ها معمولا با یک افزونه پیش فرض قابل ایجاد است و هدف آن انتشار مطالب توسط کاربران بدون عضویت در سایت است، سایت های مشابه را بررسی کنید، اگر چنین قابلیتی واقعا کاربرد داشته و مورد نیاز است، قاعدتا استفاده از آن برای شما نیز کاربردی خواهد بود.
با تشکر اوس
حذف شدمیخوام بدونم چطور میشه توی یه فایل ورد با پی اچ پی جستجو کرد.
من هر کاری که می کنم، نمی تونم با فول تکست یه کلمه ی 3 کاراکتری رو سرچ کنم، توی گوگل که سرچ می کنم، می گه باید از این یه خط کد استفاده کنی :
ft_min_word_len=3ولی خب کجا باید از این استفاده کنم؟ تازه مگه شما نگفتید همچین مواقع باید از WITH QUERY EXPANSION استفاده بشه ؟الان من چی کار کنم ؟؟؟؟؟
ممنون
ft_min_word_len در تنظیمات اصلی سرور قرار دارد و به راحتی قابل ویرایش نیست (آموزش خاص دارد و توصیه نمی شود!).
if($radio=='code_book' && $f=="" && $t=="")
$sql ="SELECT b.titlebook,b.code_book,a.* FROM amanat as a,book as b WHERE b.titlebook LIKE '%$search%' AND state=0 AND b.code_book=a.code_book";
if($radio=='code_cust' && $f=='' && $t=='' )
$sql = "SELECT * FROM amanat WHERE state=0 AND code_cust LIKE '$search' ";
و اینم کل دستور دکمه جستجو if (isset($_GET['btn_search'])){
$search=$_GET['search'];
$radio=$_GET['radio'];
$f=$_GET['from'];
$t=$_GET['to'];
$sql ="SELECT * FROM amanat WHERE state=0 and timeset BETWEEN LIKE'$f' AND LIKE'$t'";
if($radio=='code_book' && $f=="" && $t=="")
$sql ="SELECT b.titlebook,b.code_book,a.* FROM amanat as a,book as b WHERE b.titlebook LIKE '%$search%' AND state=0 AND b.code_book=a.code_book";
if($radio=='code_book')
$sql ="SELECT b.titlebook,b.code_book,a.* FROM amanat as a,book as b WHERE b.titlebook LIKE '%$search%' AND state=0 AND b.code_book=a.code_book and timeset BETWEEN '$f' AND '$t'";
if($radio=='code_cust' && $f=='' && $t=='' )
$sql = "SELECT * FROM amanat WHERE state=0 AND code_cust LIKE '$search' ";
if($radio=='code_cust')
$sql ="SELECT * FROM amanat WHERE code_cust LIKE '$search' AND state=0 AND timeset BETWEEN '$f' AND '$t'";
$res= mysql_query($sql)or die(mysql_error());
$num_rows=mysql_num_rows($res);
if($num_rows){
while($row=mysql_fetch_array($res)){
?>میشه بگین باید چی بگیم تاریخمونم با datapicker هستش و دو تا تکست داریم و بعدم دو تا radio که براساس نام کتاب کد ملی و یه دونه تکس برای جستجوهای این دو تا radio ها داریم حالا میخوایم بگیم وقتی دو تا تکس تاریخ خالی هم بود جستجو Radio ها انجام بشه ممنون میشم کمکم کنید.
نکته: با توجه به قدیمی و منسوخ شدن اکستنشن mysql بهتر است به جای آن از mysqli یا PDO استفاده کنید.
if (isset($_GET['btn_search'])){
$search=$_GET['search'];
$radio=$_GET['radio'];
$f=$_GET['from'];
$t=$_GET['to'];
if($f=='from' && $t=='to'){
$sql = mysql_query("SELECT * FROM amanat WHERE timeget BETWEEN '$f' AND '$t' AND state=1 ",$con);
}elseif($radio=='code_book')
$sql = mysql_query("SELECT b.titlebook,b.code_book,a.* FROM amanat as a,book as b WHERE b.titlebook LIKE '%$search%' AND state=1 AND b.code_book=a.code_book ",$con);
elseif($radio=='code_cust')
$sql = mysql_query("SELECT * FROM amanat WHERE code_cust LIKE '$search' AND state=1",$con);و سوال دیگم اینه که ما یک جستجو داریم که صفحه بندیش کردیم اما وقتی صفحه دوم رو میزنیم دیگه بقیه جستجو که باید در صفحه دوم قرار میگرفت رو نشون نمیده و خالی برای این مشکلمون چی کار باید بکنیم؟SELECT * FROM `table` WHERE CREATE_TIME > "2014-01-01" and CREATE_TIME < "2014-01-30"همچنین نمونه زیر را هم تست کنید:SELECT * FROM `table` WHERE CURDATE() BETWEEN "2014-01-01" AND "2014-01-30"در مورد سوال دوم، بدون بررسی کدها نمی توان پاسخ دقیقی داد، ممکن است مشکل از ست کردن نادرست پارامترهای مورد نیاز در لینک صفحات باشد، به فرض عبارت جستجو شده ارسال نشود یا اینکه صفحه بندی مشکلی داشته باشد و یا اینکه به درستی در پرس و جو جایگزین نشده باشد.و اینم کد من
<input name="search" type="text" id="input1" size="20" maxlength="255" value="<?php echo $_GET['search']; ?>" />و وقتی تو مرورگر اجرا می کنم در ابتدا با این خطا داخل تکس روبرو میشم
<br /><b>Notice</b>: Undefined index: search in <b>C:\xampp\htdocs\proje library\backbook.php</b> on line <b>27</b><br />و این در صورتی که search تو خودش تعریف شدست اما بعد از اینکه من داخل اون متن رو بنویسم و جستجو کنم مقدار درش باقی می مونه اینم دستور دکمه سرچم
if (isset($_GET['btn_search'])){
$search=$_GET['search'];
$re=mysql_query("SELECT * FROM amanat WHERE code_cust LIKE '$search' and state=1")or die(mysql_error());
اینم از فرم که متدش get هستش
<form id="form1" name="form1" method="get" action="">حالا میشه راهنمایی کنید که مشکل از چیه ؟$_GET['search']علامت @ قرار دهید!کد مورد دیگری ندارد.
نکته: با توجه به قدیمی و منسوخ شدن اکستنشن mysql بهتر است از mysqli یا PDO استفاده کنید.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.