PDA

View Full Version : آموزش: یک راه حل ساده برای جستجوی فارسی



ozzy_mra
دوشنبه 05 دی 1390, 13:12 عصر
سلام
شاید برای شما اتفاق افتاده باشه که با دیتا بیسی که از n تا سیستم کانورت شده باشه روبرو شده باشید
همونطور که میدونید تا قبل از sqlServer2008 از collation فارسی پشتیبانی نمی شد و برای همین از کاراکتر های عربی برای ثبت استفاده میشد همین امر باعث می شد که در جستجوی کلماتی که با ک ی و ... شروع میشه مشکل بوجود بیاد روش های زیادی و البته بهینه تر برای حل این مشکل ارائه شده.
ولی در این روشی که من می خوام معرفی کنم برای زمانی که اطلاعات از سیستم های تحت داس مثل فاکس پرو به sqlServer اومده باشه خیلی بدرد بخوره . معمولاً تو سیستم های قدیمی کنترل زیادی روی ورود اطلاعات نمیشد و کاربران هم خیلی از اوقات دقت نمی کردند مثلاً من با این مورد خیلی بر خورد داشتم که محمد به صورت م حمد نوشته شده یا علی رضایی به صورت علیرضای نوشته شده . برای حل این مشکل ابتدا تو دیتا بیسمون به ازای هر فیلدی که می خواهیم جستجو روی اون انجام بشه یه فیلد میسازیم مثلاً برای فیلد name فیلد nameConverted رو می سازیم و به ازای هر سطر، رشته name اون سطر رو به تابع پاس می دیم و رشته کانورت شده اون رو تو دیتابیس ذخیره می کنیم و یک بار این کار رو برای تمام اطلاعات انجام میدیم . از این به بعد به جای جستجوی کلمه وارد شده توسط کاربر ، رشته معدلش رو در دیتابیس جستجو می کنیم با استفاده از این روش اگه کاربری به جای علی نوشته باشه الی هم جواب های متناظر بر گردونده میشه
نمونه فیلد نام و تبدیل شده اون رو در عکس زیر می بینید :
79734
این کلاس ایجاد رشته :

class convertForSearch
{
public string convertion(string InputStr)
{
try
{
string current, previos;
previos = "";
current = "";
string outputStr = "";
string thisstr;
for (int i = 0; i < InputStr.Length; i++)
{
thisstr = InputStr.Substring(i, 1);

current = "";
switch (thisstr)
{
case " ":
continue;
case "ع":
case "ء":
case "ا":
case "آ":
current = "A";
break;
case "ب":
current = "B";
break;
case "پ":
current = "P";
break;
case "ت":
case "ط":
current = "T";
break;
case "ش":
current = "C";
break;
case "س":
case "ث":
case "ص":
current = "S";
break;
case "خ":
current = "X";
break;
case "چ":
current = "U";
break;
case "ج":
current = "J";
break;
case "ح":
case "ه":
current = "H";
break;
case "د":
current = "D";
break;
case "ذ":
case "ز":
case "ض":
case "ظ":
current = "Z";
break;
case "ر":
current = "R";
break;
case "غ":
case "ق":
current = "W";
break;
case "ف":
current = "F";
break;
case "گ":
current = "G";
break;
case "ک":
case "ك":
current = "K";
break;
case "ل":
current = "L";
break;
case "م":
current = "M";
break;
case "ن":
current = "N";
break;
case "و":
current = "V";
break;
case "ی":
case "ئ":
case "ي":
current = "Y";
break;
case "ژ":
current = "Q";
break;
}
if (current == previos)
continue;
outputStr += current;
previos = current;
}

return outputStr;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return null;
}

}
}