PDA

View Full Version : سوال: یک سوال در مورد تابع CONTAINS و ...



MehranZand
چهارشنبه 25 اردیبهشت 1387, 19:10 عصر
با سلام،

جدولی دارم که بر روی یک ستونش فول تکست سرچ انجام میشه، و با تابع CONTAINS جستجو روی
ستون انجام میشه، مشکل من اینجاست که یکسری پارامتر (که شاید 1 پارامتر باشه شاید هم 10 پارامتر)
از ورودی میگیرم و بر اساس اون سرچ رو انجام میدم دقیقا می خوام به اینصورت باشه که خطوط اول AND
های پارامتر رو سرچ کنه و در ادامه OR ها سرچ بشه یعنی بر اساس وجود اون کلمات در اون فیلد درجه
اهمیتش مرتب بشه.
حالا دقیقا نمیدونم برای اینجور سرچ تابع خاصی یا دستور خاصی ...
یک مثال هم میزنم تا منظورمو بهتر برسونم :
این کوئری رو در نظر بگیرید

SELECT Description
FROM dbo.ResourceData
WHERE CONTAINS(Description, '"SQL" AND "coder"' )

اولین خط می خوام رکوردی رو نشون بده که هم حاوی SQL باشه وهم حاوی coder
در رکوردهای بعدی حداقل یکی از دو عبارت SQL یا coder وجود داشته باشه ... و به همین ترتیب الی آخر

از UNION هم استفاده کردم و جواب نداد مثل اینکه روی عبارت SELECT که حاوی CONTAINS هستند
و روی یک فیلد یک جدول انجام میشن نمیشه ؟

خیلی ممنون میشم دوستان راهنمایی کنند.

AminSobati
چهارشنبه 25 اردیبهشت 1387, 23:02 عصر
مهران جان کاری که شما قصد دارین انجام بدین، نوعی Rank دادن هست. چطوره که از CONTAINSTABLE یا FREETEXTTABLE استفاده کنین

MehranZand
چهارشنبه 25 اردیبهشت 1387, 23:29 عصر
خیلی ممنون از توجهت امین جان، اگر امکان داره یه قدری بیشتر توضیح بده در مورد مفهوم و پیاده سازیش...

MehranZand
پنج شنبه 26 اردیبهشت 1387, 15:54 عصر
این رنکینگ ها چجوری بوجود میاد؟ توسط ما باید در یک ستون دخیره بشه یا الگوریتم خاصی داره و خود sql انجام میده ..؟

AminSobati
جمعه 27 اردیبهشت 1387, 14:10 عصر
در حقیقت freetexttable یک تابع هست که خروجی به شکل Table برمیگردونه. خروجیه اون دارای یک ستون Rank و یک ستون ID که به رکورد اصلی جدول اشاره میکنه هستش. از Join کردن خروجی این تابع با جدول اصلیتون میتونین رکوردهای مورد نظر رو استخراج کنید. به مثال خود Books Online توجه کنید

MehranZand
جمعه 27 اردیبهشت 1387, 16:53 عصر
ستون Rank باید در کدام جدول وجود داشته باشه ؟؟؟ جدولی که داریم FulltextSearch روش انجام میدیم؟

MehranZand
جمعه 27 اردیبهشت 1387, 18:06 عصر
مشکل حل شد، خیلی ممنون راهنمایتون امین جان

MehranZand
جمعه 27 اردیبهشت 1387, 21:30 عصر
در نهایت در Containstable استفاده کردم و از Rank برای مرتب سازی استفاده کردم
که نتیجه بخش بود اما با این کار هنوز به اون مطلبی که در پست #1 سوالم بود دست
نیافتم ،ولی در لایه های منطقی برنامه یکبار Query را با OR در یک DataTable ذخیره میکنم
و یکبار دیگه با َAND کوئری گرفته و در نهایت Table ها را Merge میکنم و به نتیجه میرسم .
فقط سئوال اینه که کاری دیگه ای نمیشه کرد؟ و آیا این کار منطقیه؟ و در سمت SQL روشی
دیگه ای نیست ؟

AminSobati
جمعه 27 اردیبهشت 1387, 23:44 عصر
به اعتقاد من Rank باید همین رو برگردونه! نتیجه چقدر با چیزی که مد نظرتون بود تفاوت داره؟

MehranZand
شنبه 28 اردیبهشت 1387, 08:20 صبح
به عنوان مثال:
یک رکورد دارم که محتوی کلمات coder و software هست
و چندین رکورد دارم که محتوی کلمه software هست.

با کوئری زیز فقط یک رکورد که حاوی coder و software رو بر میگردونه:


SELECT * FROM [ResourceData] AS C
INNER JOIN CONTAINSTABLE([ResourceData],Description,'"software" AND "coder"') AS K
ON C.ResourceID = K.[KEY] ORDER BY RANK DESC

MehranZand
سه شنبه 31 اردیبهشت 1387, 09:18 صبح
راهی به غیر merge کردن table ها پیدا نکردم، راهی به نظر تون نمیرسه؟