تاپیک مورد نظر بسته شده است
سلام خدمت دوستان برنامه نویسم
امروز متوجه یه مشکل اساسی تو برنامم شدم که با بررسی SP سمت دیتابیس متوجه عدم صحت عملکرد تنها در سمت برنامه شدم اونم اینه که من از ماژول fulltext search , دستور contains تو stored procedure استفاده کردم(به جهت پرفورمنس و io کمتر)
وقتی میخوام یه عبارت رو سرچ کنم برای مثال وب مانی باید به این صورت به اس پی پاسش بدم: وب NEAR مانی
اما این تو سمت برنامه اصلا جوابگو نیس ، علارغم اینکه من BREAK POINT میزنم و پارامتر رو چک میکنم میبینم که همینه اما جوابی نمیگیریم اما اگه همینو مستقیم تو محیط کوئری امتحان کنم جواب میده.
من برای ارتباط با دیتابیس فیلد هام رو به صورت SQLParameter در آوردم و پارامترها رو به اس پی پاس میدم
ممنون از اینکه منو راهنمایی میکنید
علارغم اینکه علت اجرای موفقیت آمیز دستور رو تنها در سمت 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(); }
ممنون بابت اشتراک گذاری ، برای من خیلی جالب بود
هیچ کاربری تا کنون از این پست تشکر نکرده است
تاپیک مورد نظر بسته شده و امکان درج پاسخ وجود ندارد
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)