جستجو در مطالب سایت با استفاده از 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
هوشمند سازی پنل ورود و خروج سایت با PHP و MySQL
تعویض کد امنیتی Captcha با Ajax و MySQL
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
ایجاد لینک دانلود مدت دار با PHP و MySQL


ببخشید من روشی رو میخواستم که متنی که جستجو می کنم بعد از اینکه دکمه جستجو رو میزنم بازم باقی بمونه که من بفهمم چی رو جستجو کردم
ممنون میشم در این مورد کمکم کنید
<input name="search" id="search" type="text" maxlength="255" value="<?php echo $search ?>" />
من کد دستور جستجو رو می خوام البته زبان php رو می خوام. برای یه سایت کتابفروشی می خوام یه جستجو بزارم ولی موفق نمی شوم اگه میشه کدها رو برام بزارین ممنونتون میشم.
با تشکر از اموزش های خوبتون من همیشه استفاده می کنم
ممنون
<?php
$str = 'تستي';
$str = str_replace('ي', 'ی', $str);
echo $str;
?>
نکته: بهتر است دیتابیس و کدهایتان را طوری طراحی کنید که کاراکترها به صورت فارسی (نه به صورت ناخوانا) ذخیره و بازیابی شوند، برای این منظور در درجه اول باید Server connection collation دیتابیس راutf8_persian_ci
انتخاب کنید، سپس برای اینکه کاراکترها به صورت فارسی در دیتابیس ذخیره شوند مراحل زیر را انجام دهید:- از متاتگ زیر در تمام صفحات استفاده کنید:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- علاوه بر دیتابیس، جداول و ستون ها را نیز با یونیکدutf8_persian_ci
بسازید.- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
mysqli_query($conn, "SET NAMES 'utf8'");
با تشکر از شما
$user = "' OR 1'";
در پرس و جو می توان آن را به صورت زیر وارد کرد:SELECT * FROM tbl WHERE user = '' OR 1''
که در این حالت تمام نتایج فراخوانی می شوند، حالت های بدتر می تواند شامل اجرای دستورات حذف جداول و... باشد.در قسمت جستجوی سایت من زمانی که عبارت ,,;',,, این چنینی جستجو می شود خطای زیر داده می شود دلیل چیست ؟؟ و برای رفع آن باید چه کاری انجام داد ممنون میشم جواب بدین
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',','','words','word')' at line 1
ممنون میشم اگه جواب بدید
where `name` like "%hello%" or `name` like "%test%"
لطفا برای کسب اطلاعات بیشتر به آموزش های مقدماتی MySQL مراجعه کنید.
من میخوام واسه پروژه ام یه قسمت search بزارم که اگه اسم یا کد مخصوص یه فیلد رو وارد کنم تمام مشخصات اون رو نمایش بده؟
اگه زحمتش رو بکشین زود جواب بدین ممنونتون میشم آخه وقت زیادی ندارم باید تحویلش بدم
- باید برنامه نویسی با PHP را تا حدودی بلد باشید.
- در ساده ترین حالت، از LIKE در پرس و جوهای MySQL استفاده کنید.
من که نفهمیدم مشکلش از کجاست ...
$r=mysqli_query($conn, "select url from post where match(url) against('$url' with query expansion)");
echo mysqli_num_rows($r); // output ==> 203178
$r1=mysqli_query($conn, "select url from post where url like '$url'");
echo mysqli_num_rows($r1); // output ==> 2
حتی وقتی fetch میکنم تا ببینم مقدارش چیه با هم فرق می کنند ...کوئری که با like نوشته شده درست است.
SELECT t1.col_1, t2.col_1
FROM `tbl_1` t1
INNER JOIN `tbl_2` t2 ON (t1.id = t2.id)
WHERE t1.id != ''
LIMIT 0 , 30
اگه بخواهیم چند تا جمله یا کلمه رو در دیتابیس سرچ کنیم و هر ردیف که یکی از اون جمله های رو داشت به نتایج برگشتی اضافه کنه چطور باید با MATCH AGAINST نوشت ؟
مثلا این کلمات رو داریم :
hello , test
با like اینطوری میشه :
where `name` like "%hello%" or `name` like "%test%"
یه روش ساده تر هم هستwhere `name` IN('test','hello')
حالا با MATCH AGAINST چطوری میشه نوشت ؟SELECT * FROM `tbl` WHERE MATCH(`col_1`) AGAINST('word_1') OR MATCH(`col_2`) AGAINST('word_2');
خسته نباشید
اگر برای ساخت موتور جستجوی سایت از کد زیر استفاده کنیم ایرادی ندارد؟ چون من قبلاً با کلمه REGEXP برخورد نکرده بودم.
$check = mysqli_query($conn, "SELECT id FROM tbl WHERE tit REGEXP '$item2|$item1|$item3'") or die(mysqli_error($conn));
اخه میدونید توی دستورات mysql یه دستور like داریم اما نمی دونم این دستور یهو از کجا پیداش شد. جالب اینجاست که خیلی هم دستور جمع و جوریه!چون این دستور نتیجه میده صد در صد هم وجود داره اما می خواستم بدونم جزو توابع mysql حساب میشه یا ساختار اصلیه!
با تشکر و سپاس از شما
http://dev.mysql.com/doc/refman/5.1/en/regexp.html
که با آن امکان استفاده از عبارات با قاعده در پرس و جوهای دیتابیس مهیا می شود، باید توجه داشته باشید که در کل LIKE روش سریع تر و بهینه تری نسبت به REGEXP است (هر چند REGEXP در مواردی کاربردهای خاص خود را دارد)، به همین دلیل استفاده از REGEXP در زمانی که می توانید از LIKE استفاده کنید، توصیه نمی شود.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.