PDA

View Full Version : سوال: پیدا کردن همنوع ها با like ؟؟



mosi2007
دوشنبه 11 اردیبهشت 1391, 00:33 صبح
سلام دوستان
من با استفاده از کویری زیر میخوام که متونی که مثل هم است یعنی شبیه هم استخراج کنم


$get2=mysql_query("SELECT * FROM images WHERE keyword LIKE '%$key%' ")or die(mysql_error());


خوب این کد که هیج ارروری نمیده و مشکلی به نظر من نداره
من تو تیبل 2 تا مقدار دارم مثلا یکی به نام
i am mostafa
و دیگری
am
وقتی که مقدار $key مساوی باشد با am چون از علامت % استفاده کردم تو خروجی i am mostafa را هم برمیگرداند
تا اینجا که هیچی
من میخوام وقتی که مقدار $key مساوی باشد با i am mostafa مقدار am را هم برگردند ولی اینکارو نمیکند
دوستان اگر امکان دارد یه کمکی کنید
برای اینکه راه حلی هم برای اینکار پیدا کنم

رضا قربانی
دوشنبه 11 اردیبهشت 1391, 00:52 صبح
WHERE keyword LIKE '%$key%' or keyword=$key

خودت داری می گی مساوی :لبخند:

mosi2007
دوشنبه 11 اردیبهشت 1391, 01:07 صبح
WHERE keyword LIKE '%$key%' or keyword=$key

خودت داری می گی مساوی :لبخند:

اینکه نمیشه دوست عزیز
چون i am mostafa که مساوی با am نیست
نمیدونم تونستم سوالمو درست برسونم یا نه ؟؟
ببنید وقتی که


$key=am => i am mostafa

این که از این درسته در چون وفتیکه کلمه ای که تو رشته کوچکتر است تو رشته بزرگتر هم باشه بخاطر علامت % رشته بزرگتر رو هم بر میگردونه
ولی وقتی

$key=i am mostafa != am
چیزی بر نمیگردونه
باید یه راه حل ساده ای برای اینکار تو کویری باشه
که وقتیکه رشته بزرگتری انتخاب شد اگه یه کلمه از این رشته بزرگتر توی رشته کوچکتر باشه رشته و کوچکتر رو هم برگردونه

yones_safari
دوشنبه 11 اردیبهشت 1391, 01:14 صبح
درود
داشم باید کلمه ها رو جدا کنی و با LIKE بینشون OR بزنی.مثال:

SELECT * FROM `TBL` WHERE title LIKE '%i%' or title LIKE '%am%' or title LIKE '%mostafa%';
موفق باشی

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 01:20 صبح
دوست عزیز باید از FULL TEXT استفاده کنی

WHERE MATCH (title) AGAINST ('$key');

mosi2007
دوشنبه 11 اردیبهشت 1391, 01:25 صبح
درود
داشم باید کلمه ها رو جدا کنی و با LIKE بینشون OR بزنی.مثال:

SELECT * FROM `TBL` WHERE title LIKE '%i%' or title LIKE '%am%' or title LIKE '%mostafa%';
موفق باشی

درود
داشم باید کلمه ها رو جدا کنی و با LIKE بینشون OR بزنی.مثال:

SELECT * FROM `TBL` WHERE title LIKE '%i%' or title LIKE '%am%' or title LIKE '%mostafa%';
موفق باشی
عزیز اینی که من گفتم مثاله برای اینکه بهتر منظورمه برسونم من یه چیز کلی گفتم شاید تو تیبل اصلا i am mostafa نباشه تو تیبلی که کاربران توش دخیل هستند را دارم میگم یعنی چیزه ثابتی نیست داده های کاربران
باید یه قاعده کلی باشه که در صورتی که رشته بزرگتر انتخاب شد اگر رشته کوچکتری دارایه جزیی از رشته بزرگتر بود رو برگردونه



دوست عزیز باید از FULL TEXT استفاده کنی

WHERE MATCH (title) AGAINST ('$key');

اینی که شما گفتید به این صورت نوشتم

$get2=mysql_query("SELECT * FROM images WHERE MATCH (keyword) AGAINST ('$key'); ")or die(mysql_error());

ارورش اینه
The used table type doesn't support FULLTEXT indexes

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 01:32 صبح
خوب باید FULL Text رو فعال کنی
برای اینکار باید روی فیلدی که میخوای جستجو کنی title یه ایندکس از نوع Full Text بسازی

کد MySQL
FULLTEXT INDEX `titleIndex` (`title`)

توجه داشته باش که نوع جدولت باید MyISAM باشه

yones_safari
دوشنبه 11 اردیبهشت 1391, 01:38 صبح
عزیز اینی که من گفتم مثاله برای اینکه بهتر منظورمه برسونم من یه چیز کلی گفتم شاید تو تیبل اصلا i am mostafa نباشه تو تیبلی که کاربران توش دخیل هستند را دارم میگم یعنی چیزه ثابتی نیست داده های کاربران
باید یه قاعده کلی باشه که در صورتی که رشته بزرگتر انتخاب شد اگر رشته کوچکتری دارایه جزیی از رشته بزرگتر بود رو برگردونه

خوب چه ربطی داره؟!!!!
این روش پرفرمنسش پایینه ولی جواب میده.
شما هر جمله ای وارد بشه بر اساس فاصله ها جدا میکنی و قاعده بالا رو روش سوار میکنی.
موفق باشی.

mosi2007
دوشنبه 11 اردیبهشت 1391, 01:39 صبح
خوب باید FULL Text رو فعال کنی
برای اینکار باید روی فیلدی که میخوای جستجو کنی title یه ایندکس از نوع Full Text بسازی

کد MySQL
FULLTEXT INDEX `titleIndex` (`title`)

توجه داشته باش که نوع جدولت باید MyISAM باشه
خوب اینو که گرفتم ولی نمیدونم که کجا استفادده کنم باید قبل از کویری اینو بزارم ؟؟
بعد اینو رو فیلدی به نام keyword میخوام اجرا کنم ولی نمیدونم که کلمه keyword رو کجا بزارم
این کویریمه


$get2=mysql_query("SELECT * FROM images WHERE keyword LIKE '%$key%' ")or die(mysql_error());


خودت درستش کن دیگه بی زحمت

رضا قربانی
دوشنبه 11 اردیبهشت 1391, 01:40 صبح
خب

می تونی یک آرایه تعریف کنی و جمله ات رو بعد هر یک اسپیس بندازی داخل آرایه و بعد موقع جستجو از آرایه جستجو کنه.

mosi2007
دوشنبه 11 اردیبهشت 1391, 01:41 صبح
خوب چه ربطی داره؟!!!!
این روش پرفرمنسش پایینه ولی جواب میده.
شما هر جمله ای وارد بشه بر اساس فاصله ها جدا میکنی و قاعده بالا رو روش سوار میکنی.
موفق باشی.

خب خیلی ربط داره اینه که شما گفتین که من نمیتونم همه کلمه های انگلیسی رو بنویسیم باید یه قاعده ای باشه

mosi2007
دوشنبه 11 اردیبهشت 1391, 01:44 صبح
خب

می تونی یک آرایه تعریف کنی و جمله ات رو بعد هر یک اسپیس بندازی داخل آرایه و بعد موقع جستجو از آرایه جستجو کنه.

شما هم که حرف دوستمونو میزنید اقا یونس هم همینو میگفت

yones_safari
دوشنبه 11 اردیبهشت 1391, 01:48 صبح
خب خیلی ربط داره اینه که شما گفتین که من نمیتونم همه کلمه های انگلیسی رو بنویسیم باید یه قاعده ای باشه


$sql = "SELECT name FROM `table` WHERE name LIKE '%" . implode("%' OR name LIKE '%", $vals) . "%';";
نمیدونم چرا این حرفو میزنی؟!!!!!!!!!!!!!!!!!

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 01:49 صبح
این کد ایجاد جدول در mysql

CREATE TABLE `images` (
`title` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
FULLTEXT KEY `titleIndex` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

کد where رو هم که قبلا نوشتم

رضا قربانی
دوشنبه 11 اردیبهشت 1391, 01:53 صبح
شما هم که حرف دوستمونو میزنید اقا یونس هم همینو میگفت

خب می تونید هر کاری انجام می دید . ما راه حل گذاشتیم جولوی شما. حرف من کلا فرق داشت . آرایه !!!!! آسمون و زمین فرق داره . حتی توی آرایه هم می تونی جستجو کنی. ولی با کارای Hamid.RDN موافقم. ببین کدوم بهتره همونو عمل کن. موفق باشید

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 01:56 صبح
در مورد کارایی هم بگم که وقتی داده های متنی به صورت عمومی قراره مورد جستجو قرار بگیرن این روش بازده بسیار بالایی نسبت به like داره
با اینحال استفاده از fulltext در جایی که اطلاعات متنی، زیاد درج و ویرایش می شن، میتونه کارایی درج رو تحت تاثیر بزاره اما در جستجو تاثیر مثبت داره.

yones_safari
دوشنبه 11 اردیبهشت 1391, 01:56 صبح
من هم روش داش حمید رو پیشنهاد میکنم
چون خواناییش بیشتره و سربار کمتری داره چون or سنگین میکنه به همین دلیل.

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 02:00 صبح
راستی این رو هم گوگل کنید:

fulltext vs like

https://www.google.com/search?q=fulltext+vs+like

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 02:04 صبح
یه چیز دیگه هم یادم اومد و اونم محدودیت حجم دستورات SQL هست. یعنی شما نمیتونید Query هایی با حجم زیاد (پیش فرض ۱ مگابایت) داشته باشید.

mosi2007
دوشنبه 11 اردیبهشت 1391, 02:08 صبح
$sql = "SELECT name FROM `table` WHERE name LIKE '%" . implode("%' OR name LIKE '%", $vals) . "%';";
نمیدونم چرا این حرفو میزنی؟!!!!!!!!!!!!!!!!!

نتیجه ای که میخواستم بگیرم گرفتم ولی این ارور هم همرهشه

Warning: implode() [function.implode (http://localhost/css/e/function.implode)]: Invalid arguments passed in C:\wamp\www\css\e\show.php on line 140

کویری اینطوری شده


$get2 = "SELECT * FROM images WHERE keyword LIKE '%" . implode("%' OR keyword LIKE '%", $key) . "%';";

$get2 = mysql_query($get2);

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 02:12 صبح
بخاطر اینه که key$ آرایه نیست و باید آرایه باشه

mosi2007
دوشنبه 11 اردیبهشت 1391, 02:18 صبح
بخاطر اینه که key$ آرایه نیست و باید آرایه باشه
دسته سه تاییتون درد نکنه تبدیلش کردم به ارایه و درست شد
روش شما رو هم امتحان میکنم اگه اون شد چون مثله اینکه فرمودین برای داده های سنگین اون جواب میده اونو میزارم

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 02:30 صبح
بهرحال این نکته رو هم فراموش نکن که بهینه سازی مرحله پایانی هست و باید بهترین دستورات رو در بهترین جا استفاده کنی.
جستجو هم که یکی از مهمترین گلوگاههای برنامه نویسی هست
روی دیتابیست هردو روش رو امتحان و Benchmark کن تا به بهترین راه حل برسی

mosi2007
دوشنبه 11 اردیبهشت 1391, 02:30 صبح
حقیقتش من یه سایتی دارم برای اپلود ویدیو که ویدیوها یه keyword دارند مثلا کاربرانیکه ویدیو اپ میکنند keword هم براش میزارن
خب اینجا شاید دو تا کاربر از keyword های شبیه هم استفاده کرد و ویدیو هر دوتاشون تو یه مایه باشه مثلا یکی راجع به شکار شیر و یه کاربر دیگه هم keyword رو این بزاره شکار ببر
خب الان 2 تا ویدیو داریم با تقریبا keyword های مشابه =>شکار شیر و شکار ببر لغت مشتر ک =>شکار
خب میخام حالا وقتی کاربری که میره و ویدیویه شکار شیر رو تماشا میکنه مثله یوتیوب ویدیوهای مشابه را هم یه پیش نمایشی تو بغل صفحه بزارم و شکار ببر رو هم که تقریبا از یه کلمات کلیدی استفاده شده رو نشون بدم
به نظر شما یوتیوب هم از همین روش استفاده میکنه (ویدیوهای مشابه رو از روی keyword ها نشون میده) ؟
و این روش خوبه یا نه ؟

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 02:36 صبح
بله تمام وب سایت ها از این روش استفاده می کنن چرا که FULL TEXT به نتایج جستجوی شما یک رنک هم میده که مشخص کننده درصد تطابق متن جستجو شده با متن پیدا شده است.

یعنی اگه به دنبال "شکار با تفنگ" بگردید

"شکار ببر با تفنگ" ارزش بالاتری نسبت به "تفنگ شکاری" داره

mosi2007
سه شنبه 12 اردیبهشت 1391, 21:44 عصر
سلام
من اون فیلدو به fulltext تبدیل کردم و از این کویری استفاده کردم ولی هیچی بر نمی گردونه نه خطا نه اطلاعات داخل دیتابیس


$get2=mysql_query("SELECT * FROM images WHERE MATCH (keyword) AGAINST ('$key') ")or die(mysql_error());

این هم از تیبلم


CREATE TABLE `images` (
`image_id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL,
`album_id` int(11) NOT NULL,
`timestamp` int(11) NOT NULL,
`ext` varchar(4) collate utf8_persian_ci NOT NULL,
`keyword` varchar(500) collate utf8_persian_ci default NULL,
`image_title` varchar(20) collate utf8_persian_ci default NULL,
`user_name` varchar(255) collate utf8_persian_ci NOT NULL,
`category` varchar(50) collate utf8_persian_ci NOT NULL,
`image_likes` int(11) NOT NULL,
PRIMARY KEY (`image_id`),
FULLTEXT KEY `titleIndex` (`keyword`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=155 ;


اون وقتی که نتیجه گرفتم و به روش اقا یونس عمل کردم کویریم اینطوری شده بود


$get2 = mysql_query("SELECT * FROM images WHERE keyword LIKE '%" . implode("%' OR keyword LIKE '%", $key) . "%'; AND");

ولی وقتی همه چیرو تغییر دادم که از روش شما استفاده کنم هیچی چاپ نمیشه ممنون میشم کمک کنید
راستی تو اینترنت هم گشتم ولی چیزه درست حسابی پیدا نکردم

Hamid.RDN
سه شنبه 12 اردیبهشت 1391, 23:55 عصر
خوب باید اطلاعات بیشتری به جدولتون اضافه کنید چون MySQL کلماتی که بیش از ۵۰٪ تکرار توی جدول داشته باشن رو ایندکس نمیکنه. پس کافیه فیلدهای بیشتری با اطلاعات زیادتر وارد کنید

mosi2007
چهارشنبه 13 اردیبهشت 1391, 00:06 صبح
خوب باید اطلاعات بیشتری به جدولتون اضافه کنید چون MySQL کلماتی که بیش از ۵۰٪ تکرار توی جدول داشته باشن رو ایندکس نمیکنه. پس کافیه فیلدهای بیشتری با اطلاعات زیادتر وارد کنید
من دیگه به فیلد نیاز ندارم همین قدر فیلد بسه دیگه اطلاعات دیگه ای لازم ندار م که بره تو تیبل
الان هم 10 تا فیلد است مثلا باید چند تا باشه؟؟؟

Hamid.RDN
چهارشنبه 13 اردیبهشت 1391, 10:32 صبح
منظورم اطلاعات بود نه فیلد. فقط اطلاعات ذخیره شده رو افزایش بدید
مثلا ۳ تا رکورد اطلاعات دارید بکنیدش ۱۰ تا