PDA

View Full Version : بهترین روش برای نوشتن Search



maxpayn2
چهارشنبه 12 دی 1386, 09:40 صبح
سلام
بهترین روش برای نوشتن یک سرچ قوی برای سایت با دیتا بیس SQL چیه ؟

Behrouz_Rad
چهارشنبه 12 دی 1386, 10:07 صبح
Full Text Search

Search About it

delphi77
چهارشنبه 12 دی 1386, 10:39 صبح
و چطور می شه ازش در سایت استفاده کرد

Behrouz_Rad
چهارشنبه 12 دی 1386, 13:15 عصر
همون طور که میشه در موردش در سایت جستجو کرد... به راحتی.

maxpayn2
چهارشنبه 12 دی 1386, 13:44 عصر
آیا SQL 2000 هم full text search رو داره ؟ اگه داره بعد از نصب چه طوری میشه اون رو اضافه کرد ؟

سار
چهارشنبه 12 دی 1386, 14:33 عصر
Full Text Search

Search About it

بهروز خان Search About it یک تکنولوژی است یا منظورت معنی فارسیش بود؟! :متفکر:

سار
چهارشنبه 12 دی 1386, 14:35 عصر
آیا SQL 2000 هم full text search رو داره ؟ اگه داره بعد از نصب چه طوری میشه اون رو اضافه کرد ؟

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

Behrouz_Rad
چهارشنبه 12 دی 1386, 17:24 عصر
بهروز خان Search About it یک تکنولوژی است یا منظورت معنی فارسیش بود؟! :متفکر:
در برخی پست هام این جمله رو می بینی. یعنی "در موردش جستجو کن" :لبخندساده:

maxpayn2
چهارشنبه 12 دی 1386, 17:28 عصر
بله داره. اگر درست یادم باشه تو بخش مقالات باید یک مقاله در این مورد باشه.

اگه موقع نصب SQL 2000 یادم رفته باشه full text search رو نصب کنم باید چی کار کنم ، جستجو کردم چیزی در این مورد نبود

Behrouz_Rad
چهارشنبه 12 دی 1386, 17:39 عصر
این سوالت، یک سوال جدیده.
در بخش SQL Server مطرح کن.

maxpayn2
پنج شنبه 13 دی 1386, 08:30 صبح
چشم ، خیلی ممنون ، تصمیم گرفتم 2005 نصب کنم

mehrdad201
پنج شنبه 13 دی 1386, 09:58 صبح
شما اون مقاله ای رو که دوستان گفتند پیدا کردید ؟؟!؟!

من هم دوست دارم که در این مورد بدونم و دارم جستجو می کنم.

maxpayn2
پنج شنبه 13 دی 1386, 15:22 عصر
اون لینک رو تو همین سایت (http://barnamenevis.org) پیدا کرده بودم

با اجازه از نویسندش اون مقاله رو اینجا میزارم :

جستجوهای قدرتمند , استفاده از Full Text Search
نویسنده مطلب : مهدی خسروی
منبع : DotNetSource.Com - DNS

یک مثال: فرض کنیم چنین عبارتی را در یک فیلد داریم و در رکوردهای مشابه نیز به همین حجم .
"به موجب مادة 7 قانون چک بلامحل مجازات فاعل، حبس تعزیری تعیین، ولی در مادة 13 همین قانون نوع حبس (تعزیری یا باز دارنده) قید نگردیده است، از طرفی مادة 12 قانون مجازات اسلامی انواع مجازاتها را به حدود، قصاص و دیات و تعزیرات و مجازاتهای باز دارنده تقسیم و هر کدام را تعریف نموده است، لذا با توجه به مقدمة فوق، آیا مجازات مقرر در مواد 7 و 13 قانون صدور چک بلامحل از نوع تعزیری است یا بازدارنده؟ و آیا می‌توان محکومان صدور چک بلامحل را مشمول مواد 173 قانون ‌آیین ‌دادرسی دادگاههای عمومی و انقلاب که منحصراً مربوط به اشخاصی که محکومیت از نوع مجازاتهای بازدارنده تحصیل نموده‌اند تسری داد یا خیر؟
توضیح:
یکی از مباحث مهمی که در بین فقها مطرح است در مورد قلمرو اعمال مجازات تعزیری به عبارت دیگر افعال قابل تعزیر است. در این خصوص بین فقها چهار نظر وجود دارد:
الف. عده‌ای معتقدند اساسا عملی قابل تعزیر است که شرعاً حرام باشد(به خاطر ارتکاب فعل حرام یا ترک واجب) که آن¬چه از کتابهای فقهی بر می‌آید قول مشهور فقها هم این نظر است.
ب. عده¬ای دیگر اعتقاد دارند هر فعل حرام یا ترک واجب قابل تعزیرنیست بلکه عملی قابل تعزیر است که از «گناهان کبیره» باشد.
ج. برخی را نیز عقیده بر این است، عملی قابل تعزیر است که اولاً : در شرع حرام شده باشد، ثانیاً : در شرع قابل تعزیر شناخته شده باشد ثالثاً : مقدار هم معین شده باشد.
د. این دسته می‌گویند عملی قابل تعزیر است که منجر به اضرار به غیر شود، به عبارت دیگر، هر عملی که مفسده زا باشد می‌تواند ملاک تعزیر قرار گیرد.
با توجه مفاهیم داده شده می‌توان، حرام را به حرام شرعی و حرام عقلی و واجب را به واجب شرعی و واجب عقلی تقسیم نمود که حرام و واجب شرعی همان است که توسط شارع مقدس تعیین شده و حرام و واجب عقلی همان است که عقلای جهان بر قبح آن اتفاق دارند. همانند جرایم رانندگی یا جرم صدور چک بلامحل.
بنابراین از نظر فقهی، جرایم موجب تعزیر دو دسته¬اند :
1. جرایمی که همواره در جامعه وجود داشته و به عنوان جرم شناخته شده و در زمان شارع هم بوده است، اعم از تعزیرات معینه مثل وطی با بهایم و غیر معینه مثل اعمال منافی عفت غیر از زنا که به این¬ها «تعزیرات شرعی» می‌گویند.
2. دسته دوم جرایمی که بر حسب زمان و مکان از ناحیه حکومت تعریف و ارتکاب آنها موجب الزامات یا ممنوعیت¬های حکومتی مجازات تعزیری است که هم اکنون ما آنها را تعزیرات حکومتی یا مجازات بازدارنده می‌نامیم."

حال می خواهیم جستجویی داشته باشیم که به دنبال کلمه ی محکومیت در یک چنین رکوردی بگردیم. فرض می کنیم اسم فیلد question میباشد با این خط کد می توانیم این کار را انجام دهیم:
کد:

SELECT * FROM t_question WHERE question LIKE '*محکومیت*'


بله, همانطوری که گفتم نتیجه بازگردانده خواهد شد اما به مدت طول یک عمر! هرچقدر تعداد رکورد ها بیشتر شود مدت زمان نیز ....! در این هنگام تنها چیزی که به کمک ما می آید Full Text Indexing می باشد که در زیر در مورد آن صحبت می کنیم.

یکی از امکانات جالب و قدرتمند SQL Server که از نسخه 7 به بالا اضافه شده است Full Text Search میباشد.

ابتدا باید کاتالوگهایی ایجاد شوند و بعد از آن جداولی که قرار است روی آنها جستجوهای حجیم انجام شود را به این کاتالوگها اضافه نمود و در نهایت نیز باید فیلدهایی که قرار است جستجو بر روی آنها انجام شوند تعیین خواهد شوند. حال شما میتوانید بروی این جدول و فیلدهایی که کاندید شده اند جستجوهایی متنی کامل(full text) و یا جستجوهای مفهومی داشته باشید.

در جستجوی مفهومی نیز شما میتوانید با جملات انگلیسی از بانک اطلاعاتی سئوال کنید مثلا:"what "What is JAVA" و بانک اطلاعاتی جوابهای سوال شما را بصورت لیست از رکوردها که به آن مربوط میشود خواهد داد. از سوی دیگر شما در جستجوهایتان میتوانید بگویید که مثلا به دنبال کلمه eat بگرد و حالتهای ماضی و مضارع آن را(ate و eating) نیز اگر وجود دارد بیاور.

لازم به ذکر است که شما میتوانید stopwordها و یا کلمات زاید را تعریف کرده و عملیات ایندکس سازی و به پیرو آن جستجو روی آن ها انجام نشود مانند:the,and, است , بود , .....

معایب :
1- ایجاد یک Full Text Index کار زمانگیری بوده و باید دقیق انجام شود (اما به زحمتش می ارزه!!)

2- رکوردهای جدید و یا ویرایش شده باید سرشماری(population) شوند تا بتوان روی آن جستجو کرد که این نیز خود مشکلات زیادی را ایجاد میکند.(کمی تجربه این مشکلات را هم براحتی حل می کند!!)

3- امکانات جستجوی مفهومی آن تنها برای زبان انگلیسی میباشد.(می توان این کار را برای زبان فارسی و دیگر زبان ها انجام داد اما یک انسان از خود گذشته باید پیدا شود تا کلمات و هم خانواده ها و ماضی و مضارع و غیره و غیره را برای این انجین تعریف کند)

4- کار کردن با آن برای زبانهای غیر انگلیسی از جمله فارسی مشکلات و تنظیمات خاصی نیاز دارد.(که البته در نسخه ی 2005 مشکلات خیلی خیلی کم شده اند و بهتر است بگویم تقریبا مشکلی وجود ندارد.)

5- فرمت دستورات آن مختص SQLServer بوده و از استانداردها تبعیت نمیکند.

کمی چرت و پرت :
1- ابتدا باید مطمئن شوید که فول تکست را هنگام نصب اسکیوال نصب کرده اید.
2- این قابلیت را برای بانک خود فعال کنید, برای آگاهی از فعال بودن آن این کد کمکتان می کند:
کد:

SELECT DatabaseProperty ('DBNname','IsFulltextEnabled')


اگر خروجی صفر باشید یعنی تا فعال نیست پس باید فعال شود:
کد:

EXEC sp_fulltext_database 'enable'

sp_configure "show advanced options",1
reconfigure


شما به هر تعداد که بخواهید میتوانید کاتالوگ تعریف کنید ولی در اسکیو ال 7 بیش از 5 کاتالوگ اکیداً توصیه نمیشود و با مشکلاتی روبرو خواهید شد!!!

3- برای ایجاد کاتالوگ نام آنرا در این دستور وارد کنید:
کد:

exec sp_fulltext_catalog 'CATName+','create'


4- این اندکس ها در کاتالوگ ها ذخیره می شوند جدول های مورد نظر خود را به این کاتالوگ ها اضافه کنید:
کد:

exec sp_fulltext_table 'TableName','create','CATName','IndexFieldName'


5- حال نوبت افزودن فیلدها به کاتالوگ است:
کد:

EXEC sp_fulltext_table TableName,'deactivate'
EXEC sp_fulltext_column TableName,FullTextFieldName,'add'
EXEC sp_fulltext_table TableName,'activate'


6- برای اجرا سرشماری نیز از این دستورات استفاده کنید(توجه داشته باشید که دو نوع وجود دارد که برای اطلاعات بیشتر به BooksOnline مراجعه کنید(:

کد:

EXEC sp_fulltext_catalog 'CATName','start_full'

EXEC sp_fulltext_catalog 'CATName','start_incremental'


وقتی سرشماری انجام شد می توانید کوئری های خود را اجرا کنید:

کوئری که در بالا داشتیم و عبارت محکومیت را جستجو می کرد به این صورت در خواهد آمد اما اینبار در کسری از ثانیه پاسخ خواهد داد:
کد:

SELECT * FROM t_question WHERE CONTAINS(question,'محکومیت')


می توان جستجو های ترکیبی نیز داشت که این کار با دلالت کیورد هایی مثل AND OR و ... انجام خواهد شد. مثلا دنبال رکوردی می گردیم که علاوه بر عبارت محکومیت شامل عبارت شرع نیز باشد. به این صورت:
کد:

SELECT * FROM t_question WHERE CONTAINS(question, '"محکومیت" and "شرع"'(

نمونه ای نیز از دستورات مربوطه:

کد:

SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')

کد:

SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')

کد:

SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')

حتما یک سری به BooksOnline هم بزنید.
نکته ی دیگر این است که تمامی مراحل ایجاد کاتالوگ و افزودن جدول به کاتالوگ و راه اندازی Full Text Search برای بانک و ... و .... همگی از طریق ویزاردها قابل انجام شدن می باشند.

سوالات خود را حتما در ادامه تاپیک مطرح کنید. این بحث واقعا بحث شیرین و جالبی است. نکاتی در مورد بالاتر بردن کارایی این امکان موجود هست که اگر مایل بودید ادامه خواهیم داد.

با تشکر – مهدی خسروی