PDA

View Full Version : یافتن یک کلمه یا مشابه آن با Full text Search



مهدی رحیم زاده
جمعه 26 اردیبهشت 1393, 00:21 صبح
با سلام خدمت تمامی دوستان عزیز
بنده دارم با Full text search جستوجو انجام میدم. اما هنوز اون نتیجه ای که مطلوب هست رو بدست نیاوردم . ممنون میشم دوستان هم بنده رو راهنمایی کنن. و اما کاری که من انجام میدم:
من میخوام وقتی کاربر یک جمله رو وارد کرد بر اساس کلماتی که اونجا نوشته جست و جو انجام بشه که الان این کار رو با این کد انجام میدم :
WHERE FREETEXT(PrdctName , @Srchlst)
یعنی داده ها ی مورد نظر رو با یک پارامتر به کوئری ارسال میکنم و نتیجه بر میگرده به عنوان مثال اگر من بنویسم "جستوجو در سایت" در رکورد هایی که کلمات جستوجو ، در ، سایت رو داشته باشن برای من میاره. هر کدوم از کلمه ها که باشه میاردشون
حالا من میخوام اگر من نوشتم "جستو" اون رکورد هایی که توش جستوجو داره رو هم بیاره که الان این کار انجام نمیشه . میخواستم ببینم دوستان تو این ضمینه اطلاعاتی دارن که در اختیار من بزارن؟
و هم چنین میخوام توی جستوجو بتونم اولیت جستوجوی کلمات رو هم تعیین کنم
یعنی مثلا توی همون جمله "جستوجو در سایت" بگم کلمه سایت اهمیت بیشتری داره برام یا اینکه بگم کلمه ای مثل در رو توی جستوجو در نظر نگیره و ...
با تشکر فراوان

مهدی رحیم زاده
جمعه 26 اردیبهشت 1393, 08:52 صبح
با سلام مجدد خدمت تمامی دوستان عزیز
خوب مشکل اول رو به این شکل حل کردم :
WHERE FREETEXT(PrdctName , @Srchlst) or contains(PrdctName , @Srchwrd)
توی این کدFREETEXT(PrdctName , @Srchlst) مقداری که برای پارامتر ارسال میشه ، یک جملست که بر اساس کلمات جستوجو میشه و توی این کد contains(PrdctName , @Srchwrd) کلمات ارسال میشن به این شکل : مثلا میخوام تمام رکورد هایی که توشون خودکار آبی وجود داره رو بدست بیارم : "*خودک*" or "*آب*"
این رو من تست کردم درست بود . حالا سوال بعدی اینه که چطور کلمات اضافه رو میشه توی Fulltextsearch مشخص کرد که در نظر گرفته نشن. کلماتی مثل و ، یا ، در و ...
و همچنین من خوندم که میشه کلمات مترادف رو هم با fulltextsearch بدست آورد. این امکان برای زبان فارسی هم هست؟
ممنون میشم راهنمایی کنید
با تشکر

مهدی رحیم زاده
جمعه 26 اردیبهشت 1393, 09:51 صبح
خوب من جواب این سوالات رو هم تا حدودی پیدا کردم :
در مورد کلمات اضافه باید یک Stoplist تهیه کنید و کلماتی که میخوایین توی جست و جو لحاظ نشن رو اونجا تعریف کنید . برای کلمات مترادف هم فک میکنم باید از این کد استفاده بشه :
contains(PrdctName, 'FORMSOF(INFLECTIONAL, @SrchSynmous)')
در مورد انجام این کارها روی زبان فارسی من msdn رو که بررسی کردم نوشته بود بر اساس زبانی که روی سیستم شما فعاله میتونید کار کنید چون sql تمام collation ها رو ساپورت میکنه.
اگر دوستان در این زمینه هم اطلاعاتی داشت ممنون میشم راهنماییم کنه
با تشکر و آرزوی موفقیت

khorsandreza
جمعه 26 اردیبهشت 1393, 22:59 عصر
سلام
من البته دقیقا منظور شما را متوجه نشدم ولی برای مثال شما من از یک حقه استفاده می کنم به انن صورت بجای فاصله در جمله علامت @ را قرار می دهم و یک تابع کوچک نوشتم اگر کلمه یا و از باشد انها را نادیده می گیرد
مثل:
"دانشجویان از کلاس ریاضی یا فیزیک خارج شوند"
برنامه قبل از جستجو متن را به شکل زیر تغییر می دهد
@دانشجویان@قبل@کلاس@ریاضی@ف زیک@خارج@شوند
سپس پارامتری به شکل زیر می سازد

Where ( FieldName LIKE('%دانشجويان%') OR FieldName LIKE('%قبل%') OR FieldName LIKE('%كلاس%') OR FieldName LIKE('%رياضي%') OR FieldName LIKE('%فيزيك%') OR FieldName LIKE('%خارج%') OR FieldName LIKE('%شوند%'))


جستجو انجام می دهم

khorsandreza
جمعه 26 اردیبهشت 1393, 23:00 عصر
سلام
من البته دقیقا منظور شما را متوجه نشدم ولی برای مثال شما من از یک حقه استفاده می کنم به انن صورت بجای فاصله در جمله علامت @ را قرار می دهم و یک تابع کوچک نوشتم اگر کلمه یا و از باشد انها را نادیده می گیرد
مثل:
"دانشجویان از کلاس ریاضی یا فیزیک خارج شوند"
برنامه قبل از جستجو متن را به شکل زیر تغییر می دهد
@دانشجویان@قبل@کلاس@ریاضی@ف زیک@خارج@شوند
سپس پارامتری به شکل زیر می سازد

Where ( FieldName LIKE('%دانشجويان%') OR FieldName LIKE('%قبل%') OR FieldName LIKE('%كلاس%') OR FieldName LIKE('%رياضي%') OR FieldName LIKE('%فيزيك%') OR FieldName LIKE('%خارج%') OR FieldName LIKE('%شوند%'))


جستجو انجام می دهم

مهدی رحیم زاده
شنبه 27 اردیبهشت 1393, 14:42 عصر
جناب khorsandreza سلام
فرمایشات شما کاملا درسته . میشه این جستوجو رو با استفاده از Like پیاده سازی کرد و شاید هم ساده باشه ، اما Full text search روی داده های با حجم بالا بسیار بهتر و سریعتر عمل میکنه و به همین دلیل من میخوام از اون استفاده کنم. ضمن اینکه الگوریتم های Full text search فک میکنم بهینه و مناسب باشن.
اگر شما دلایل بهتری دارید برای استفاده از like ممنون میشم بگید به بنده
با تشکر

khorsandreza
شنبه 27 اردیبهشت 1393, 16:27 عصر
سلام
حقیقتش من تا حالا از Full text search استفاده نکردم . و بیشتر با پایگاه داده InterBase کار می کنم و از همین دستور در انجا استفاده می کنم در بین بیش از دو میلیون رکورد حدودا
احتمالا دستوری بهینه نباشد ولی به علت کمتر کاربردی بودن این نوع جستجوها پاسخ کار را دریافت می کنم