علارغم اینکه علت اجرای موفقیت آمیز دستور رو تنها در سمت sql رو متوجه نشدم اما مشکل رو با تحقیق و شکست و خطای بسیار زیاد تونستم حل کنم و برا دوستانی که خواهان دانش هستن به اشتراک میزارم!
دوستان باید به چند تا نکته توجه کنن که در ابتدا چنانچه خواهان استفاده از full-text index باشن در همون ابتدای کار قابلیت رو راه اندازی کنن و قبل از ورود هر چیزی زیر ساخت رو پیاده کنن. همچنین باید مد نظر داشته باشید که با rebuild کردن full text catalogue (که در واقع نقش یه container و ظرف برای ایندکسها هست) اتفاق خاصی نمی افته و همون نتایج قبلی رو بر میگردونه . لازمه بدونید من حدود 20 رکورد تستی داشتم که حتی پس از rebuild کردن هیچ اتفاقی نیفتاد و این تکنولوژی تنها رکوردهایی رو میشناخت که پس از ایجاد و فعال کردن قابلیت درج کرده بودم.(نفهمیدم چرا) پس با بازنویسی رکوردهام (تو محیط design یا گرافیکی به صورت دستی) نتیجه مورد نظرم رو گرفتم.
نکته بعدی از جمله نکات مهمی هست که باید هنگام درج دیتا تو جدول و واکشی از جدول رعایت کنید:
برای مثال مسترکارت با مستر کارت متفاوته پس اگه مسترکارت سیو شده باشه و انتظار واکشی مستر کارت رو داشته باشین با خطا مواجه میشید چون دوعبارت جدا از هم هستن و مسترکارت به تنهایی یه عبارته و مستر یه عبارت و کارت یه عبارت دیگه هست پس نیاز به جدا سازی با NEAR یا AND رو داره (مستر NEAR کارت) و اگه مستر کارت رو تنها جستجو کنید با خطا مواجه میشید.
به عبارتی مسترکارت باید فقط 8 طول داشته باشه .
عباراتی که پس از حروف ر،و،ا،ز،د،ذ نوشته میشن باید بدون فاصله در کنار هم قرار بگیرن مثل مسترکارت
اما عباراتی که غیر از کلمات فوق باشن باید با یک فاصله (space) در کنار هم قرار بگیرن مانند وب مانی
این نکات باید در هنگام درج عبارت تو جدول و حتی عبارتی که در کادر جستجو وارد میشه پشت پرده چک و تنظیم کنید
شاید بپرسید که چطور میشه کاربر رو مطلع کرد ؟ در پاسخ باید بگم تا حد بسیار زیادی رو میشه با کد کنترل کرد من دستورات لازم رو نوشتم و بارها مورد آزمون و خطا قرارش دادم (در صورت رعایت این نکته تا حد چشم گیری خطا کاهش پیدا میکنه)!
با فرض اینکه متد قراره یه لیست نام رو بر حسب جستجو از جدولی واکشی کنه:
public static IEnumerable<string> get(string name)
{
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
name = regex.Replace(name.Trim(), " ");
char[] ch = new char[] { 'ا', 'و', 'د', 'ر', 'ز' };
for (int j = 0; j < name.Length; j++)
{
for (int i = 0; i < ch.Length; i++)
{
try
{
char c = Char.Parse(name.Substring(name.IndexOf(" ") - 1, 1));
if (c.Equals(ch[i]))
{
name = name.Replace(" ", "");
}
}
catch { }
}
}
name = name.Replace(" ", " NEAR ");
SqlParameter sq = new SqlParameter()
{
SqlDbType = System.Data.SqlDbType.NVarChar,
SqlValue = name,
ParameterName = "N"
};
return
model.Database.SqlQuery<string>
("select Name from tbExpressions where CONTAINS(Name,@N)",sq).ToList();
}