PDA

View Full Version : مشکل جستجو با استفاده از Full Text Search



مهدی کرامتی
یک شنبه 26 تیر 1384, 16:32 عصر
با سلام.

من در SQL Server 2005 CTP در یکی از دیتابیس هام برای یک جدول Full Text Search Catalog تعریف کرده ام.

این جدول حاوی ستون نام افراد است و مقادیری مانند "رضایی"، "رضا"، "علیرضا" در رکوردهای آن قرار دارند.

با دستوری مانند زیر دنبال کلمه "رضا" میگردم:

Select * from Users where Contains(*,'"*رضا*"')
در نتیجه خروجی فقط رکوردهایی مانند "رضایی" و "رضا" برگردانده میشوند ولی "علیرضا" در نتیجه خروجی وجود ندارد.

کسی درباره مبدا مشکل اطلاعی دارد؟

AminSobati
سه شنبه 28 تیر 1384, 11:53 صبح
سلام دوست عزیزم،
FTS جستجو روی پیشوند رو پشتیبانی نمیکنه. یعنی عبارت مورد جستجو حتما باید حرف اولش مشخص باشه و اگر * وجود داشته باشه، نادیده گرفته خواهد شد. BOL هم در < prefix term > ::= بهش اشاره کرده(راهنمای CONTAINS). این مطلب منطقی به نظر میرسه چون Full Text Indexing لغات رو Sort میکنه که در Sort باید ابتدای کلمه مشخص باشه.
در مورد لغات لاتین هم این موضوع صادقه.

setarehman
سه شنبه 11 مرداد 1384, 23:22 عصر
من یه Full Text Search Catalog ساختم اما نمیتونم جدولی رو که میخوام انتخاب کنم
چه جوری باید از این استفاده کنم

AminSobati
سه شنبه 11 مرداد 1384, 23:57 عصر
به راهنمای دستور CONTAINS رجوع کنین، چندین مثال خوب وجود داره..

setarehman
چهارشنبه 12 مرداد 1384, 06:59 صبح
خوب مشکل همینه که من نمیتونم از این دستور استفاده کنم پیغام میده که شما ایندکس روی جدولتون ندارید و این دستور شناخته شده نیست
من وقتی یه Full Text Search Catalog ساختم چه جوری باید بگم روی کدوم جدول این ایندکس تعریف بشه
و در ثانی این نحوه جسنجو فقط برای فیلهای متنی کار ساز هست یا هر نوع فیلدی
و یه عنوان دیگه که توی منوی وظایف جدول ها با عنوان manage index هست آیا ارتباطی به این ایندکس گذاری داره یا نه فقط برای sort کردن یه فیلدی که ما انتخاب میکنیم هست
ممنون میشم اگه به سوالاتم جواب بدید

sarami
چهارشنبه 12 مرداد 1384, 21:34 عصر
بهترین کلر استفاده از دستور like باید باشه البته هنوز نمیدونم دقیقا این چیزیه که شما دنبالش هستین یانه امیدوارم همین باشه
Select * from Users where name like '%رضا%'

sarami
چهارشنبه 12 مرداد 1384, 21:46 عصر
الان فکر کنم متوجه شدم باید توضیح بدم که ساختن ایندکسهای تمام متنی .با ساختن ایندکسهای متنی تفاوت جزئی داره برای ساختن این ایندکسها هیچ دستور ddl وجود نداره و باید از ویزارد موجود در اینتر پرایز استفاده کنین برای راه انداختن این ویزارد باید جدول مورد نطرتون رو در اینتر پرایز انتخاب کنین و روی جرول راست کلیک کنین و درمنوی نمایش داده شده full_text index رو انتخاب کنین
با ویزاردی که ظاهر میشه کارتون رو انجام بدین فقط اینم میدونم که روی ستونهای از نوع text این کار امکان پذیر نیست

AminSobati
پنج شنبه 13 مرداد 1384, 00:28 صبح
خوب مشکل همینه که من نمیتونم از این دستور استفاده کنم پیغام میده که شما ایندکس روی جدولتون ندارید و این دستور شناخته شده نیست
من وقتی یه Full Text Search Catalog ساختم چه جوری باید بگم روی کدوم جدول این ایندکس تعریف بشه
و در ثانی این نحوه جسنجو فقط برای فیلهای متنی کار ساز هست یا هر نوع فیلدی
و یه عنوان دیگه که توی منوی وظایف جدول ها با عنوان manage index هست آیا ارتباطی به این ایندکس گذاری داره یا نه فقط برای sort کردن یه فیلدی که ما انتخاب میکنیم هست
ممنون میشم اگه به سوالاتم جواب بدید
دوست عزیزم،
روی جدول Right Click کنین و Define Full-Text... رو انتخاب کنین. جدول شما باید حتما اقلا یک ایندکس یونیک داشته باشه که در ابتدای Wizard از شما سوال میکنه کدام ایندکس یونیک رو برای این کار انتخاب میکنین.
تنها فیلدهای کاراکتری برای این عمل قابل انتخاب هستند. وقتی در حال انتخاب فیلدها هستین، یادتون باشه Language رو روی neutral تنظیم کنین (اگر اطلاعات شما فارسی هستش )
بعد از ساخته شدن Catalog، روی اون Right Click کنین و Start Full Population انجام بدین.
اگر تا اینجا همه چیز بدون مشکل پیش رفته، الان CONTAINS باید قابل استفاده باشه.
در مورد ایندکس یونیک، قبل از آغاز Wizard، باید ایندکس رو ایجاد کرده باشین. این ایندکس با Full Text Index فرق داره.
موفق باشید

AminSobati
پنج شنبه 13 مرداد 1384, 00:29 صبح
الان فکر کنم متوجه شدم باید توضیح بدم که ساختن ایندکسهای تمام متنی .با ساختن ایندکسهای متنی تفاوت جزئی داره برای ساختن این ایندکسها هیچ دستور ddl وجود نداره و باید از ویزارد موجود در اینتر پرایز استفاده کنین برای راه انداختن این ویزارد باید جدول مورد نطرتون رو در اینتر پرایز انتخاب کنین و روی جرول راست کلیک کنین و درمنوی نمایش داده شده full_text index رو انتخاب کنین
با ویزاردی که ظاهر میشه کارتون رو انجام بدین فقط اینم میدونم که روی ستونهای از نوع text این کار امکان پذیر نیست
تمام این کارها دستور T-SQL دارند:
sp_fulltext_catalog
sp_fulltext_column
sp_fulltext_database
sp_fulltext_table

ضمن اینکه استفاده عمده Full Text Search برای جستجو در متنهای حجیم داخل فیلدهای Text و nText هست.

sarami
پنج شنبه 13 مرداد 1384, 00:42 صبح
جهت اطلاعات بیشتر خدمتتون عرض کنم که مطالب من بر گرفته از کتاب transact-sql نوشته لاول مائر و ترجمه آقای کامران سیروسیان می باشد صحبت های قاطعانه شما من رو به شک انداخت و مجبور شدم داخل کتاب بگردم تا صحت گفته هام رو دوباره چک کنم در مورد دستور ddl رجوع به صفحه 237 عین متن:
برای ساختن ایندکسهای تمام متنی هیچ دستوری در ddl وجود ندارد.
درمورد ستونهای text رجوع به صفحه 238 عین متن:
اگرچه ایندکس تمام متنی را میتوان روی ستونهای از نوع varchar ساخت ولی ساختن آن بر روی ستونهای از نوع text امکان پذیر نیست.

AminSobati
پنج شنبه 13 مرداد 1384, 01:26 صبح
برای ساختن ایندکسهای تمام متنی هیچ دستوری در ddl وجود ندارد.
عرض شد که دستور T-SQL دارند، نه DDL.


اگرچه ایندکس تمام متنی را میتوان روی ستونهای از نوع varchar ساخت ولی ساختن آن بر روی ستونهای از نوع text امکان پذیر نیست.
BOL > Accessing and changing relational data > Full-text Search > Full-text Querying SQL Server Data

همچنین در داخل master..sp_fulltext_column این قسمت به خوبی Typeهای قابل قبول برای Full Text Search رو مشخص میکنه:


-- VALIDATE COLUMN TYPE --
if @typename NOT in (N'nchar',N'nvarchar',N'ntext',N'char',N'varchar', N'text', N'image')
begin
raiserror(15611,-1,-1,@colname,@tabname)
goto error_abort_exit
end

setarehman
پنج شنبه 13 مرداد 1384, 18:35 عصر
آقای ثباتی این ایندکس یونیک رو من باید به ساختار بانک اطلاعاتیم اضافه کنم
یعنی فیلدی باید براش تعریف کنم؟
چون گفتم من از طریق index manage یه ایندکس روی جدولم قرار میدم که این این ایندکس فقط برای من یه فیلدی رو که انتخاب کردم sort میکنه فقط همین

AminSobati
جمعه 14 مرداد 1384, 00:33 صبح
این ایندکس رو باید برای جدول روی فیلد تعریف کنین. اگر ایندکسی که میفرمایید در حال حاضر وجود داره، یونیک هستش، از همین میتونین در Full Text Indexing هم استفاده کنین.

setarehman
شنبه 15 مرداد 1384, 23:07 عصر
مرسی حل شد به دلیل اینکه جدول من primery key نداشت ایندکس ساخته نمیشد
فقط من فرق بین این و like رو نمیفهمم
چه مزیتی نسبت به like داره

AminSobati
یک شنبه 16 مرداد 1384, 00:32 صبح
Like این قابلیت رو داره که حتی وسط یک کلمه رو جستجو کنه مثلا


Like '%سلام%'

که میتونه لغات: اسلام، سلامی و ... رو بدست بیاره. ولی از نظر نحوه جستجو روش بسیار نا کارآمدی برای حجمهای بالا محسوب میشه. در مقابل، FTS روش بسیار خوبی داره ولی همونطور که در اولین پست های همین تاپیک بحث شد، محدودیت خاص خودش رو هم داره (مثلا ابتدای کلمه باید مشخص باشه برای جستجو) ولی خواص جالب توجهی در کل ارائه میده.

sarami
دوشنبه 17 مرداد 1384, 16:43 عصر
دوست عزیز ممکنه چون من از sql_server 2000 استفاده می کنم این مورد جزو تفاوت های 2000و 2005 باشه

AminSobati
دوشنبه 17 مرداد 1384, 19:50 عصر
دوست عزیز ممکنه چون من از sql_server 2000 استفاده می کنم این مورد جزو تفاوت های 2000و 2005 باشه
در مورد FTS روی 2005 من هنوز فرصت مطالعه نداشتم. مطالبی که عرض شد روی 2000 هستش.