PDA

View Full Version : پرسش در مورد ایجاد جستجو با کارایی بهتر



pedram_ns
دوشنبه 16 اسفند 1389, 14:12 عصر
با سلام به همه دوستان و اساتید
من در برنامه ام یک صفحه جستجو دارم و بانک اطلاعاتی من هم دارای رکورد ها و اطلاعات بسیاریه که داره بیشتر هم می شه.
در ابتدا من جستجو رو بر اساس تفکیک کلمات وارد شده انجام می دادم مثلا وقتی کاربر کلمه "صنعت و معدن" رو وارد می کرد از تک حرف ها ("و") صرف نظر می کردم و بر اساس دو کلمه "صنعت" و "معدن" بصورت جدا جستجو می کردم و نتایج رو نشون می دادم.

1. در مورد برخی کلمات مثل کلمه "اب" (چون جستجو غیردقیق هست) موارد یافت شده زیاد و غیر مرتبطه و از طرفی به علت وجود کلمات دو حرفی زیاد مثل کلمه "گل" که در دیتابیس من هم هست نمی شه از دوحرفی ها مثل تک حرفی ها صرف نظر کنم؟ چه کاری می شه کرد؟

2.با زیاد شدن رکورد های دیتابیسم، تفکیک کلمات و جستجو جدای اونها هم نتایج غیر مرتبط زیادی می ده. مثلا فردی که به دنبال سازمان صنایع و معادن می گرده و این عبارت رو تایپ می کنه مواردی مثل صنایع فولاد صنایع دستی و ... رو دریافت می کنه و ممکنه سازمان صنایع و معادن در انتهای لیست پیدا بشه که درست نیست.
از طرفی جستجو بر اساس کلمه تفکیکی به کاربرانی که نمی دونن دقیقا دنبال چی هستن خیلی کمک می کنه.

با توجه به این مشکلات شما چه روشی رو توصیه می کنید که بهترین کارای رو داشته باشه توجه کنید که دیتابیس من پر از اطلاعات کاملا متفاوت با هم هست.

پیشاپیش سپاس گذارم.

mehrdad85
دوشنبه 16 اسفند 1389, 14:33 عصر
سلام
دوست عزیز راه حلی که به فکر من میرسه و خیلی جا ها هم شاید خود شما باهاش برخورد کرده باشید اینه که یه گزینه بذاری که مثلا :
1) جستجوی عین عبارت
2)جستجوی شممل عبارت
و...


ایده خوبیه
در موردش فکر کن:چشمک:

alonemm
دوشنبه 16 اسفند 1389, 16:09 عصر
باسلام:
برای بهینه سازی:
از دو قسمت جستجو و جستجوی پیشرفته استفاده کن.
از صفحه بندی به صورت دستی استفاده کن.
کوئری هارو درون SP ها ران کن.

موفق باشید.

mehrdad85
دوشنبه 16 اسفند 1389, 16:37 عصر
سلام
یه فکر بهتر اینه که به قول دوستمون جستجوی ساده و پیشرفته را از هم تفکیک کن و در جستجوی پیشرفته قابلیت های این چنینی بذار مثلا
علاوه بر مطالبی که قبلا بهت گفتم این موارد هم میتونی اضافه کنی
جستجو در مورد
عین عبارت
شامل عبارت
شروع شونده با عبارت
و مهمتر از همه اینکه به کاربر این امکان را بدی که چندین و چند جستجو را هم زمان با هم انجام بده
بذار یه مثال بزنم تا مسئله یکم واضحتر بشه
فرض کن یه کاربر بخواد واژه "سازمان صنایع و معادن " را جستجو کنه
بر حسب اینکه چه داده هایی داخل database داری میتونی از طریق یک کنترل این امکان را بهش بدی که تعیین بکنه کل database را بگرده یا فقط بین سازمان ها یا مراکز دولتی یا مراکز خصوصی یا شرکت ها یا ... جستجو انجام بده (کاربرد مورد جستجو)
یا این امکان را بهش بدی که تعیین کنه کل مواردی را نمایش بده که با واژه "سازمان" شروع میشن یا اینکه مواردی که شامل واژه "سازمان" هستن " یا اینکه عین واژه "سازمان صنایع و معادن " را جستجو کنه
موارد دیگه که میتونه جستجو را محدود کنه(چون طبق فرمایش شما نتایج جستجو زیاده) میتونه زمان باشه
مثلا رکورد هایی را برگردون که بعد از تاریخ فلان بوجود اومدن
اینا دیگه بستگی به database خودت داره
من این نمونه ها رو زدم تا مطلب جا بیافته
با این حال اگه کمک بیشتری نیاز داری در مورد اطلاعات database توضیح بده تا اگه میتونم کمکت کنم

موفق و موید باشید

pedram_ns
سه شنبه 17 اسفند 1389, 10:08 صبح
ممنون از نظرتون.
سایت من در مورد شهر اصفهانه و اطلاعات شهری این شهر رو در خودش داره که شامل موراد زیادی هست.
در مورد اینکه اجازه بدم کاربر تعیین کنه چه جستجویی رو می خواد انجام بده مشکلی ندارم ولی بیشتر می خوام یک کوری بنویسم که خودش به خودی خود بهترین نتایج رو بده.
برای همین کلمات رو تفکیک کردم و با دستور or می گم که هر کدوم از کلمات رو که وجود داشت نمایش بده حالا اگرکاربر کلمه "راه" رو وارد کنه چون جستجوغیر دقیق در کل عبارت هست، عبارات راه آهن، تلفن همراه، راه سازی و ... پیدا می شه و خیلی غیر مرتبطه.
اگر جستجو دقیق بذارم که حرفش رو هم نزن، هیچی.
اگر جستجو غیردقیق با شروع عبارت بذارم با کلمه "راه" موارد مرتبط تری پیدا می شه ولی اگر در دیتابیس عبارت "اداره راه آهن" باشه با کلمه "راه" چیزی پیدا نمی شه چون عبارت با "اداره" شروع شده نه "راه".
اگر کلمات رو تفکیک کنم و با and بگم باید هر دو کلمه در عبارت باشه بازهم نتایج بهتره ولی اگر کاربر هوس کنه و بنویسه "پل های تاریخی اصفهان" باید پلهای اصفهان رو نشون بدم ولی چیزی نشون نمیده چون در عبارت هم باید "پل" هم "های" هم "تاریخی" و هم "اصفهان" باشه که نیست.(مثلا در مورد سی و سه پل کلمه پل هست ولی تاریخی و اصفهان نیست) در این جستجو تفکیک و استفاده از or بهتر جواب میده.
اگر از کاربر بخوام که یکی از روش های شامل یا برابر عبارت رو انتخاب کنه به نظرتون کاربر کدوم رو انتخاب می کنه خوب اون می خواد که دقیقا پل های اصفهان بیاد نه "ابنیه تاریخی" پس عبارت برابر کاراتره در حالی که با این گزینه چیزی گیرش نمیاد.
در کل می خواستم کوری من کاریی بالای داشته باشه تا بدون مشکلی بهترین اطلاعات رو بده.

mehrdad85
سه شنبه 17 اسفند 1389, 10:47 صبح
سلام

دوست عزیز من آخر نفهمیدم این پستی که فرستادی تحلیل مورد و پروژه خودت بود و اینکه چرا از این راه حل ها استفاده نمیکنی یا اینکه کل بررسی مشکلات و معضلات کلی جستجو؟

دوست خوبم دیگه همینه اوضاع
مشکلاتیه که باید باهاش کنر اومد
شما نمیتونی کوئری هوشمند بنویسی که بفهمه منظور کاربر چیه و کاربر هوس کرده در مورد چی جستجو کنه!!!!
تنها راه اینه که یا فیلتر های مختلف بر حسب شرایط موجود قرار بدی و یا اینکه اطلاعات کلی تر در اختیار کاربر قرار بدی
البته یه راهی که همین الان که پستتو خوندم به ذهنم رسید اینه که میتونی بر حسب جستجو هایی که کاربران قبلی انجام دادن تصمیم گیری کنی
مثلا چون 90% کاربرای قبلی که مثلا " پل های تاریخی اصفهان" را جستجو کردند بیشتر دنبال پل بودن یا تاریخی یا اصفهان
بر حسب این میتونی حدس بزنی که اگه کاربر بعدی اصفهان را وارد کرد منظورش پل های تاریخی اونه و در یک نوع پیشرفته تر میتونی اینو به کاربر پیشنهاد بدی که آیا منظور شما این است؟
آیا در پی جستجوی چنین واژه ای هستید؟
و یک کلکی هم که میتونی بزنی این که خودت به عنوان یک کاربر چندید و چند بار این کارو انجام بدی تا برنامت حداقل یه چیزی ، موردی واسه پیشنهاد به کاربر بعدی داشته باشه


اینا چیزایی بود که به فکر من رسید

امیدوارم مفید بوده باشه


موفق باشید

pedram_ns
سه شنبه 17 اسفند 1389, 14:14 عصر
خیلی ممنون که وقت می ذارید کسی در مورد این مسئله جوابی داره:
متوجه شدم که اگر جستجو غیر دقیق و بر اساس شروع عبارت باشه نتایج مناسبتری بدست میاد.
همونطور که گفتم با کلمه "راه" کاربر احتمالا دنبال "راه سازی" یا "راه آهن" می گرده نه "تلفن همراه" ولی اگر عبارت من "اداره راه آهن" باشه چون در ابتدای عبارت کلمه "اداره" هست در نتایج نمیاد.
ایا راهی هست که بشه تک تک کلمات موجود در عبارت "اداره راه اهن" رو تشخیص بده و "راه" رو در اون پیدا کنه و نمایش بده ولی کلمه "همراه" رو به حساب نیاره.

mehrdad85
سه شنبه 17 اسفند 1389, 14:36 عصر
سلام
خواهش میکنم کار خاصی نمیکنم
عرض کنم که میتونی داخل query ها بگردی به دنبال search word+space یا space+search word یعنی به جای اینکه به دنبال واژه "راه" بگردی میتونی به دنبال "فاصله راه" یا "راه فاصله" بگردی
لازم به ذکره منظور از فاصله یا spave همون دکمه space صفحه کلید هستش

موفق و موید باشید

pedram_ns
سه شنبه 17 اسفند 1389, 15:41 عصر
نگرفتم! :متفکر:
یعنی به جای کلمه "راه" کلمه " راه" (دارای فاصله هست) رو سرچ کنم اگر منظورتون اینه که مشکل من حل نخواهد شد چون عبارت "اداره راه اهن" رو باز پیدا نمی کنه.

stabesh
سه شنبه 17 اسفند 1389, 16:38 عصر
خوب چرا از %راه% استفاده نميكنيد

Reza_Yarahmadi
سه شنبه 17 اسفند 1389, 16:50 عصر
در صورتی که میخواید یک جستجو هوشمند(در واقع بهینه) داشته باشید یک راه (راهی که اکثر موتورهای جستجو بکار میبرند) اینه یک جدول دیگه به دیتابیس اضافه کنید و تمامی کلمات و به ازا هر کلمه شماره رکوردهایی از جدول اصلی که کلمه مورد نظر توی اون وجود داره. زمان جسجتو هم ابتدا این جدول جستجو میشه و شماره رکوردهای مورد نظر استخراج میشه سپس بر اساس این شماره رکوردها ، داده های اصلی استخراج میشه. در این روش مشکل اصلی اینه که داده های این جدول باید به درستی ذخیره بشن و همه زحمت کار به گردن خودتونه ، البته چون اطلاعات قبل از ارائه برنامه ذخیره میشه و کاربر فقط استفاده کننده است قابل انجامه.
ولی اگر نمیتونید از این روش استفاده کنید یک راه اینه که متن وارد شده کاربر رو بر اساس Space تفکیک کنید ، کلمات اضافی رو حذف کنید ، بعد دنبال کلماتی مثل " راه " باشید.
در ضمن بهتر اینه که کلماتی مثل "از" ، "با" ، "برای" و ... رو توی یک جدول به عنوان کلمات اضافی ذخیره کنید این کلمات رو در جستجو شرکت ندید (مگر حالت جستجوی عین عبارت)

pedram_ns
سه شنبه 17 اسفند 1389, 17:27 عصر
در مورد روشی که گفتید(روش موتورهای جستجو) بنظرم کمی پیچیده می شه.
اگر تاپیک رو از اول مطالعه بفرمایید می بینید که من کلمات وارد شده رو تفکیک می کنم و بر اساس هر کلمه بصورت غیر دقیق و بصورت کد زیر جستجو می کنم


search like %راه%

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

اگر کدم رو بصورت زیر بنویسم

search like راه%

که از ابتدای عبارت چک کنه، در این صورت اگر عبارت درون دیتابیس "اداره راه آهن" باشه با کلمه "راه" این عبارت پیدا نمی شه

یک راهی می خوام که عبارت وارد شده رو از ابتدای هر کلمه درون دیتابیس چک کنه نه از اول کل عبارت.