PDA

View Full Version : سرچ پیشرفته شبیه سرچ گوگل(یکبار برای همیشه)



code_project
سه شنبه 12 شهریور 1392, 11:04 صبح
سلام دوستان عزیز
من توی برنامه ام یه بانک اطلاعاتی دارم که حدود 100 هزارتا شرح کالا داره و کاربر بایستی از بین این آیتم ها شرح مورد نظرش را پیدا کنه. از من یه سرچ شبیه گوگل خواستن. فرض کنید آیتم های زیر موجوده و یک text box دارم که کاربر عبارت جستجو را وارد میکنه و تو رویداد textchange اون نتایج را نشون میده.

1-کابل 8 متری مسی
2-کابل 16 متری مسی روکش دار آبی رنگ
3-کابل 16 متری بدون روکش

حالا میخوام اگه کاربر سرچ کرد "کابل آبی"، سطر دوم توی نتایج جستجو به نمایش در بیاد. چکار باید بکنم؟؟؟

nunegandom
سه شنبه 12 شهریور 1392, 11:13 صبح
سلام
با استفاده از entity


NamdaryDBEntities n = new NamdaryDBEntities();
tblMain t = new tblMain();
var query = n.tblMains.SqlQuery(@"select * from tblMain WHERE "+FieldName+" LIKE '%"+textBox1.Text+"%'");

code_project
سه شنبه 12 شهریور 1392, 12:17 عصر
بعید میدونم منظورما درست متوجه شده باشید. علی ایحال اینا بگم که سرچ من از لایک استفاده میکنه اما تک کلمه ایه. مثلا اگه کلمه "کابل" را سرچ کنم هرجا کابل داشته باشه را میاره(چه اول، چه وسط و چه آخر). اما من سرچ چند کلمه ای میخوام با این تفاوت که اگه کلمات پشت سر هم نباشن، جستجو نتیجه بده.
اینم بگم من اصلا از entity استفاده نمیکنم.

aliagamon
سه شنبه 12 شهریور 1392, 12:22 عصر
والا این روشی که میگم کلا تنیکشه وارد مباحث دیتابیسو اینا نمیشم.....ببین شما هر کلمه رو جدا کن (کاری که گوگل میکنه دیدی که ادرسو مثلا این میشه "کابل+ابی" )خوب حالا کلمه اول رو سرچ کن با like هرچی پیدا شد رو نگه دار حالا اون هایی که توشون کلمه لایک بوده رو دوباره با همین روش جستو جو کن (فیلتر کن) نتیجه نهایی میشه اونی که شما میخواین...حالا یه شرط هم باید بزاری(اگه خواستی ) که اگه هیچی پیدا نشد اینطوری هم اونایی رو نشو بده که کابل دارن هم اونایی که ابی دارن(میشه مورد یک و دو) اینم مثل گوگل.....:لبخند:

code_project
سه شنبه 12 شهریور 1392, 12:27 عصر
من هیچی نفهمیدم. خجالت هم میکشم نمونه کد بخوام!
:خجالت:

aliagamon
سه شنبه 12 شهریور 1392, 12:37 عصر
شاید یکمی بد توضیح دادم....
شما یه جمله میدی که اینه :"کابل ابی" ... خوب اول اینه بشکون بکن دو کلمه ی "کابل"و"ابی"....حالا با لایک از تو دیتابیس همه اونایی که کلمه ی "کابل" دارن رو بگیر.....جالا بین اینا که کلمه کابل دارن بگرد دنبال اونایی که کلمه ی "ابی " دارن .... نتیجه میمونه مورد دوم.....
اینو شما اجرا کنین بقیه چیزایی که گفتم احمیت نداره برای کاربردی تر شدن سرچ بود...

mamadcity
سه شنبه 12 شهریور 1392, 12:54 عصر
SELECT * FROM Pempdata WHERE skillset LIKE '%[textBox1.Text]%'

Mahmoud Zaad
سه شنبه 12 شهریور 1392, 14:53 عصر
سلام
شما اگه به جای گفتن "تو را خدا!!!!!!!!!!!!!!!!!!!" از دوستانی که جواب دادند تشکر کنید، اونوقت رغبت می کنند بهتر به شما جواب بدهند.

bazikadeh
سه شنبه 12 شهریور 1392, 15:05 عصر
SELECT * FROM Pempdata WHERE skillset LIKE '%[textBox1.Text]%'

این خوبه ولی کامل شده و همچنین به صورت سی شارپ اینطوریه ؟


var qu = from p in tblkala
where p.name.contain("Ebarate Shoma")
select p;

davidrobert
سه شنبه 12 شهریور 1392, 16:24 عصر
سلام دوستان عزیز
من توی برنامه ام یه بانک اطلاعاتی دارم که حدود 100 هزارتا شرح کالا داره و کاربر بایستی از بین این آیتم ها شرح مورد نظرش را پیدا کنه. از من یه سرچ شبیه گوگل خواستن. فرض کنید آیتم های زیر موجوده و یک text box دارم که کاربر عبارت جستجو را وارد میکنه و تو رویداد textchange اون نتایج را نشون میده.

1-کابل 8 متری مسی
2-کابل 16 متری مسی روکش دار آبی رنگ
3-کابل 16 متری بدون روکش

حالا میخوام اگه کاربر سرچ کرد "کابل آبی"، سطر دوم توی نتایج جستجو به نمایش در بیاد. چکار باید بکنم؟؟؟
بفرمایید شما همین چیزی میخواهید.http://barnamenevis.org/showthread.php?413307-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-%D8%AF%D8%B1-%D8%AA%DA%A9%D8%B3-%D8%A8%D8%A7%DA%A9%D8%B3

مهرداد صفا
سه شنبه 12 شهریور 1392, 16:45 عصر
با سلام.
برای مرحله اول تمام رکوردهایی که در فیلد note آنها دو کلمه مثلا "کابل" و "آبی" به کار رفته انتخاب می شوند:


"select * from table where note like '%"+ textBox1.Text.Replace(" ","%")+"%'"

البته در این متود مواردی شبیه به "...کابل ... آبی ..." یافت خواهند شد و نه "...آبی....کابل...". در هر صورت فعلا این مورد را پیاده کنید تا اگر نیاز بود برای کارایی بیشتر موارد دیگر هم به جستجو اضافه کنیم.

code_project
چهارشنبه 13 شهریور 1392, 07:20 صبح
ممنوووون استاد صفای عزیز. اما من سرچ کامل میخوام. دقیقا همون آبی کابل که فرمودین!!! ممنون میشم کمکم کنید. از بقیه دوستان هم خیلی خیلی ممنونم

مهرداد صفا
چهارشنبه 13 شهریور 1392, 11:52 صبح
ممنوووون استاد صفای عزیز. اما من سرچ کامل میخوام. دقیقا همون آبی کابل که فرمودین!!! ممنون میشم کمکم کنید. از بقیه دوستان هم خیلی خیلی ممنونم

خواهش می کنم.
در این مرحله برای به دست آوردن رکوردهایی که کلمه "کابل" و "آبی" در ستون مثلا Field آنها وجود دارد بدون محدودیت نسبت به مکان و ترتیب کلمات، می توانید متن اصلی را با استفاده از متود Split به کلمات تجزیه کنید و در query قید کنید که تک تک کلمات باید در فیلد مورد نظر وجود داشته باشند. برای این کار می توانید از یک حلقه استفاده کنید. تقریبا به این صورت:


string query="select * from table where ";
foreach(string word in text)
query+="field like '%"+word+' and";
query=query.SubString(0,query.Length-3);

و یا:


var result=MyDataTable.Cast<DataRow>().Where(row=>{
foreach(string word in text.Split(" "))
if(!row["field"].ToString().Contains(word))
return false;
return true;}).ToArray();

Mahmoud Zaad
چهارشنبه 13 شهریور 1392, 16:37 عصر
سلام
بفرمایید این هم نمونه (http://www.codeproject.com/Articles/138595/Search-As-You-Type-in-C). البته با کمی دستکاری در کد اولیه آقای صفا هم میشه به همین جواب رسید:

"select * from tb where title like '%" + textBox1.Text.Replace(" ", "%' AND title like '%") + "%'"

در ضمن بنده به تشکر احتیاج ندارم، اینطوری واسه خودتون بهتره! خیلی قشنگ نیست آدم از کسی تشکر نکنه!