فرض کنید توی برنامه میخواین یه جستجو روی لیست مشتریان بنویسین. دو تا مشکل هست؛ اول اینکه بعضی از حروف فارسی در دیتابیس ها کدهای متفاوتی دارن. به طور مشخص حروف «ک» و «ی» ممکنه به شکل های عربی شون ذخیره شده باشن و کیبورد کاربر فارسی باشه یا برعکس. مشکل دوم اینه که بعضی از کلمه ها توی فارسی ممکنه به شکل های مختلفی نوشته بشن! مثلاً فامیلی های «کربلایی» و «مشکات» و «آرام»، ممکنه اینجوری نوشته شده باشن: «کربلائی» و «مشکاة» و «ارام». در این حالت ها جستجوی شما اونجوری که انتظار دارین کار نمیکنه.
حالا راهش اینه که بیایم این حروف رو با حروف معادلشون جایگزین کنیم. هم توی مقدار ورودی کاربر و هم توی دیتایی که از جدول میگیریم. به همین سادگی!
تابع هایی که خودم دارم رو اینجا میذارم میتونین خودتون کامل ترش کنین. فقط اینکه این جایگزینی باید فقط توی سرچ باشه و نمایش باید به همون شکل اصلی باشه.
public static string FaSearchHelper(this string x) { if (string.IsNullOrEmpty(x)) { return x; } x = x.Trim(); var exDic = new Dictionary<char, char>(21) { { '۱', '1' }, { '۲', '2' }, { '۳', '3' }, { '۴', '4' }, { '۵', '5' }, { '۶', '6' }, { '۷', '7' }, { '۸', '8' }, { '۹', '9' }, { '۰', '0' }, { 'ؠ', 'ی' },//1568 'ؠ' { 'ء', 'ی' },//1569 'ء' { 'ئ', 'ی' },//1574 'ئ' { 'ى', 'ی' },//1609 'ى' { 'ي', 'ی' },//1610 'ي' { 'آ', 'ا' },//1570 'آ' { 'أ', 'ا' },//1571 'أ' { 'إ', 'ا' },//1573 'إ' { 'ؤ', 'و' },//1572 'ؤ' { 'ة', 'ت' },//1577 'ة' { 'ك', 'ک' },//1603 'ك' }; char exChar; var res = new StringBuilder(x.Length); for (var i = 0; i < x.Length; i++) { res.Append(exDic.TryGetValue(x[i], out exChar) ? exChar : x[i]); } return res.ToString(); }
var FaSearchHelper = function (x) { if (!x || x == null) { return x; } x = x.toString().trim(); var exDic = { '۱': '1', '۲': '2', '۳': '3', '۴': '4', '۵': '5', '۶': '6', '۷': '7', '۸': '8', '۹': '9', '۰': '0', 'ؠ': 'ی', 'ء': 'ی', 'ئ': 'ی', 'ى': 'ی', 'ي': 'ی', 'آ': 'ا', 'أ': 'ا', 'إ': 'ا', 'ؤ': 'و', 'ة': 'ت', 'ك': 'ک', }; var res = []; for (var i = 0; i < x.length; i++) { res.push(exDic[x[i]] || x[i]); } return res.toString(); }
Trim(Translate({s}, 'ؠ ء آ أ ؤ إ ئ ة ك ى ي ', 'ی ی ا ا و ا ی ت ک ی ی '))
من توی #C و Javascript اعداد فارسی رو هم تبدیل به معادل های انگلیسی شون میکنم. چون پیش میاد گاهی کاربر یه عددی رو از جایی که فارسی نشونش میده کپی کرده باشه. نکته ی بعدی اینه که از Dictionary استفاده کردم که به مراتب سریعتر از List هستش و اینکه برای جایگزینی هم از تابع Replace استفاده نکردم و به جاش یه for نوشتم که کل قضیه با هزینه O(n) انجام میشه، در حالیکه اگه replace مینوشتم به ازای هر کدومش یه O(n) داشتیم که خوب نبود.
برای دیتابیس اوراکل هم از تابع Translate استفاده کردم که خیلی باحاله. اینجوریه که سه تا رشته میگیره و روی رشته اول کاراکتر به کاراکتر حرکت میکنه و اگه اون کاراکتر توی رشته دوم باشه با کاراکتر معادلش از رشته سوم جایگزین میکنه. یعنی مثلاً این:
Translate('OMID ARAM', 'MOD', 'XYZ') = 'YXIZ ARAX'
امیدوارم مفید باشه.
سرچ مهمه برای کاربر. بهش اهمیت بدین. وقت بذارین براش. به کیفیت سیستم تون کمک میکنه. تا جایی که میشه باید راحت باشه. مثلاً اگه میتونین به جای ده تا باکس سرچ که روی ده تا فیلد هست، یه دونه بذارین و خودتون پشت صحنه هندل کنین. یا مثلاً اگه کاربر فاصله گذاشته توی سرچش، بیاین کلمه ها رو تک تک بگردین توی متن که جابجایی کلمه ها تاثیری رو نتیجه جستجو تون نداشته باشه (البته اگه واقعا ترتیب مهم نیست). همینطور به جای مساوی بهتره بیشتر از «'%...%' like» استفاده کنین برای کلمه ها. یا حتی میتونین از الگوریتم های پیچیده تری استفاده کنین که اشتباهات کاربر رو هم اصلاح کنه و بهش بگه «منظورت اینه؟» خلاصه که هر کاری بلدین بکنین که جستجوی کاربر بی جواب نباشه و سیستم تون مرتبط ترین جواب رو بهش بده.