PDA

View Full Version : امکانات اسکیوال سرور برای جستجو در حجم بالای متون



فؤاد
سه شنبه 08 مهر 1382, 13:36 عصر
با سلام

خواستم بپرسم که آیا اس کیو ال سرور برای جستجو در حجم بالایی از متون امکاناتی را در نظر گرفته است ؟؟؟

در صورتی که در اس کیو ال سرور چنین امکانی تعبیه نشده است چه راهی برای جستجو در حجم بالای اطلاعات متنی پیشنهاد میکنید ؟!

تکنولوژی های مورد نظر :

ASP 3.0
SQL SERVER 2000

با تشکر - فواد

جـاوید
سه شنبه 08 مهر 1382, 17:37 عصر
Full-Text Indexing رو استفاده کردید یا نه؟
این یه نوع ایندکسه که روی ستونهای text یا ntext یا کاراکتری... یک جدول می سازید و امکان Rapid Access به محتوبات این نوع فیلدها رو می ده و موقع پرس جو از پایگاه داده به جای نام جدول، نام ایندکس فول تکست رو مشخص می کنید و اون رو جستجو میکنید.

برای ساخت اون توی Enterprise Manager به منوی Tools و بعد گزینه Full-Text Indexing رو انتخاب کنید.(باید جدول موردنظرتون رو انتخاب کرده باشید)

فؤاد
چهارشنبه 09 مهر 1382, 01:03 صبح
با سلام و تشکر از جوابتون

راستش میخواستم بپرسم این روشی که شما میگین اولا اینکه روی وب قابل استفاده هست یا نه ؟ ثانیا اینکه آیا احتیاج به فعال بودن سرویس خاصی داره یا خیر ( مثل ایندکس سرور ) ثالثا اینکه ممکنه یه نمونه مثال یا یه منبع فارسی که در این رابطه اطلاعات داشته باشه معرفی کنین ؟

با تشکر فراوان - فواد

جـاوید
پنج شنبه 10 مهر 1382, 14:57 عصر
پرس و جوش که طبیعتا روی وب قابل استفاده است اما اگه منظورتون پیکربندی و کانفیگ کردنشه، برای این کار باید مجوز ایندکسینگ Full-Text داشته باشید.(شرمنده الان اسکوپل رو سستمم نصب نیست) چند تا پروسیجر هم بود که امکان پیکر بندی ش رو میداد: sp_fulltext_table یا sp_fulltext_database و ... (به جای استفاده از اینترپرایز منیجر)

برای مرجع هم فکر نکنم از هلپ خود اسکوپل مرجع بهتری پیدا کنید.

جـاوید
جمعه 11 مهر 1382, 22:01 عصر
موقع نصب اسکوئل سرور 2000 باید نوع نصب Custom رو انتخاب کنید. در صفحه Select Components از چک لیست Components گزینه اول (Server Components) رو انتخاب و در چک لیست Sub_Components گزینه Full-Text Search باید چک خورده باشه(اینا برای اینکه روی سیستم خودتون تست کنید) . موتور فول تکست در ویندوز NT/۲۰۰۰ تحت سرویسی به نام Microsoft Search اجرا می‌شه. (به گفته هلپ اسکوئل این سرویس برای ویرایش Personal اسکوئل سرور در دسترس نیست)


چند تا تفاوت با ایندکسهای معمولی داره. ایندکسهای معمولی درون پایگاه داده‌ای که تعریف شدن ذخیره می‌شن اما ایندکسهای فول تکست خارج از پایگاه ذخیره شده ولی مدیریتشون از داخل پایگاه داده است. بر خلاف ایندکسهای معمولی برای هر جدول ققط یه ایندکس فول تکست می‌تونید داشته باشید.

برای هر جدولی که می‌خواید ایندکس فول تکست بسازید باید یک ایندکس unique در اون جدول داشته باشید.


(برای اجرای دستورات زیر باید مالک جدول یا عضو role (نقش) db_owner باشید)


توی اینترپرایز منیجر روی جدول راست کلیک کنید. Full-Text Index Table و سپس Define Full-Text Indexing on a Table رو انتخاب کنید تا ویزارد باز بشه. Next رو کلیک کنید. در صفحه دوم ویزارد یک ایندکس unique رو از لیست انتخاب کنید. صفحه بعد ستون مورد نظر برای ایندکس فول تکست چک بزنید. صفحه بعدی Create a new catalog رو تیک بزنید و نامی رو به کاتالوگ جدید اختصاص بدید(نام دلخوه). در صفحه بعد(صفحه Select or create population schedules(optional) بدون هیچ تغییری Next رو کلیک بزنید. در صفحه اخر هم که Finish رو که کلیک زدید. یه باکس ظاهر می‌شه. صبر کنید که کارش رو انجام بده. بعد در قسمت چپ اینترپرایز منیجر Full-Text Catalogs رو انتخاب کنید. کاتالوگی که ساختید رو راست کلیک کنید. Start Full Population رو کلیک کنید.

این پیکربندی ش.

اما پرس و جو از ایندکس فول تکست. مثال:



select col_name from catolag_name
where CONTAINS (col_name_2, 'my_word')



catolag_name که مشخصه. col_name_2 نام یکی از ستونهای ایندکس شده س که در ویزارد انتخاب کردید. my_word هم اون واژه‌ای است که دنبالش می‌گردید.

عملگرهایی که به جای Contains می‌تونید استفاده کنید فکر کنم ایناس:
CONTAINSTABLE
FREETEXT
FREETEXTTABLE


اگه از طریق اینترپرایز منیجر نمی‌تونید این کارا رو انجام بدید بگید تا پروسیجرهاش رو بگم.

ClaimAlireza
سه شنبه 26 تیر 1386, 14:43 عصر
دوستان من در زمینه fts هر چی تاپیک بود خوندم تا به این تاپیک فسیل شده رسیدم.

طبق کد زیر :



select col_name from catolag_name
where CONTAINS (col_name_2, 'my_word')

من کدم رو نوشتم:



select*from alireza wherecontains(*,' "a*" ')


من نمیتونم از کاتالوگ ایجاد شده select بگیرم و error زیر رو در یافت می کنم.




Invalid object name 'alireza'.


البته اگه نام جدول رو بزارم مشکلی به وجود نمیاد..

ولی چون روی چندین جدول میخام search کنم این طور که فهمیدم باید از کاتالوگ و ایندکس استفاده کنم.

با تشکر...

ClaimAlireza
چهارشنبه 27 تیر 1386, 08:43 صبح
دوستان من books online هم تا حدودی خوندم ولی جایی به شکل بالا query ننوشته بود .

در حالی که مشکل من در صورتی حل میشه که به شکل بالا query بگیرم.

و فکر می کنم بحث ایندکس ها در fts برای همین مطرح می باشد.

لطفا راهنمایی کنید.

AminSobati
چهارشنبه 27 تیر 1386, 13:31 عصر
علیرضا جان هر Search روی یک جدول (ولی هر چند تا فیلد که باشه) اتفاق میافته. شما نمیتونین با یک Select همه جداول رو جستجو کنین. یکی از روشهایی که بعضا استفاده میکنند اینه که اطلاعات متنی از جداول مختلف، درون یک جدول مشترک تجمیع میشه و FTS روی اون بوجود میاد.
روش دیگه اینه که شما یک View بسازید که روی همه جداول مربوطه جستجو کنه و این Selectها با هم UNION ALL بشن

ClaimAlireza
چهارشنبه 27 تیر 1386, 14:16 عصر
جناب ثباتی عزیز یه سوال دیگه اینکه '%like%' مشابهی داره .

می دونید توی books online نوشته



contains(*,'"ali*"')


مثل '%like%' عمل میکنه در حالی که فقط مقادیری رو بر می گردونه که پیشوندشون ali هستش.

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

خواه وسطشون یا آخرشون یا اولشون ...

با تشکر....

AminSobati
چهارشنبه 27 تیر 1386, 15:28 عصر
اگر هر دو طرف ali ستاره قرار بدین چطور؟

ClaimAlireza
پنج شنبه 28 تیر 1386, 08:20 صبح
اینم امتحان کرده بودم.

باز هم فرقی نداره...

ClaimAlireza
سه شنبه 23 مرداد 1386, 10:02 صبح
جناب ثباتی بنابراین بنده 2 راه دارم :

1- یه جدول ایجاد کنم و زمانی که فردی عمل سرچ رو انجام میده مقادیر رو توی اون insert کنم و بعدش یه select بگیرم.

مشکلی که اینجا به وجود میاد اینه که اگر شخص اول پس ازخواندن موضوعات مختلف قصد مشاهده جزییات یک مطلب رو داشته باشه و قرار باشه که برای دیدن جزییات به یه صفحه دیگه redirect بشه و دقیقا قبل از redirect شدن شخص دومی دوباره سرچی را انجام بده اونوقت مقادیر جدول عوض میشه و جزییات نشان داده شده به شخص اول دیگه صحیح نیست.

2- یه tempTable ایجاد بشه.مشکل این روش هم اینه که بعد از redirect شدن به صفحه دیگه ، select گرفتن امکان پذیر نیست چون جدول موقتی ما توی SP قبلی از بین رفت.آیا راه حل دیگه ای هست...

باتشکر....

AminSobati
جمعه 26 مرداد 1386, 23:09 عصر
علیرضا جان روش شما رو متوجه نشدم! اگر از FTS استفاده میکنین، فلسفه جدول موقتی و امثالهم چیه!

ClaimAlireza
یک شنبه 28 مرداد 1386, 08:51 صبح
امین جان عزیز شما در پست 8 اینطور فرمودید.البته شاید هم من درست متوجه نشدم.

من برای سرچ در کل db نیاز به این کار دارم.

امکانش هست یه نمونه بزارین.

AminSobati
یک شنبه 28 مرداد 1386, 09:24 صبح
منظور این بود که یک جدول داشته باشین، اطلاعات متنی داخل اون جمع آوری بشه (با آدرس جدول اصلی) و بوسیله Trigger، وقتی رو جداول اصلی تغییری رخ میده، این جدول به روز بشه. حالا FTS روی این جدول راه اندازی میشه.
از پست قبلی شما اینطور برداشت کردم که به ازاء هر Query میخواین یک جدول بسازین!