جستجو با FULLTEXT در MySQL

k2-4u

Well-Known Member
نوع داده FULLTEXT . برای فیلد های هست که شما . می خواهید با سرعت در محتویات آنها جستجو کنید
برای استفاده از روش ایندکس گذاری full-text . به موارد زیر دقت کنید

1. ایندکس گذاری full-text فقط برای جدول های MyISAM و نوع های CHAR ,VARCHAR , TEXT
قابل استفاده است

2. ایندکس گذاری full-text باید موقع ساخت جدول و در دستور CREATE TABLE و یا تغییر ساختار جدول (ALTER TABLE CREATE INDEX ) استفاده شود

3 . در مواقعی که حجم اطلاعات خیلی زیاد است . عدم استفاده از full-text سرعت بیشتری دارد


در عمل :
همون طور که گفته شد . full-text رو در هنگام ساخت جدول . باید در نظر گرفت
ما در مثال زیر . یک مطلب داریم که . می خواهیم عنوان مطلب و خود مطلب رو full-text کنیم تا بتونیم
بعدا با امکانات و سرعت بالا در اونا جستجو کنیم

کد:
 CREATE TABLE articles (
	id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
	title VARCHAR(200),
	body TEXT,
	FULLTEXT (title,body)
);
همان طور که میبینید . بعد از تعریف ستون های id , body و title
دو ستون title و body در آخر دستور به وسیله عبارت FULLTEXT
FULLTEXT در نظر گرفته شده اند

بعد از ساخت جدول . شما می توانید جدول را با محتوات دلخواه پر کنید
.
و حالا برای جستجو در این جدول
از دستور AGAINST MATCH به چندین شکل استفاده می شود
به مثال های زیر دقت کنید

در MATCH نام ستون های FULL TEXT مورد نظر که قصد دارید در آنها جستجو کنید قرار میگیرد
و در AGAINST کلمه کلیدی مورد نظر

1 . بعد از WHERE (این روش کم هزینه ترین روش است )
کد:
SELECT *  FROM  articles  WHERE  MATCH (title,body) AGAINST ('search me....');

2. می تواند یکی از مقادیر قبل از FROM باشد . (در این مثال نتیجه جستجو در نام فرضی score قرار می گیرد )
کد:
SELECT id, body, MATCH (title,body) AGAINST ('search Me..') AS score FROM articles WHERE (...)

و 3 . می تواند ترکیبی از این دو مثال بالا یا ... باشد


AGAINST MATCH چهار حالت . برای جستجو دارد .
که در ادامه گفته میشود .
مثال های بالا یکی از این روش ها است
 
آخرین ویرایش:

k2-4u

Well-Known Member
Natural Language Full-Text

حالت . پیشفرض . Full-Text
IN NATURAL LANGUAGE MODE
این حالت مانند مثال قبل است
2 کوئری زیر . هر دو یکی هستند
کد:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);
و
کد:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');

در این حالت . رشته وارد شده در AGAINST جستجو میشود
این حالت به حروف کوچک و بزرگ حساس نیست .مگر اینکه نوع داده ستون آن BINARY باشد
همچنین شما نمی تونید به وسیله هیچ کارکتری (مانند " ' , و... )
حروف را از هم جدا کنید .

2 مورد زیر در جستجو IN NATURAL LANGUAGE MODE حدف می شود

الف : حروف خیلی کوچک حدف میشوند و در نظر گرفته نمی شوند (زیر 4 کارکتر )
ب : حروف stopword . مانند THe And و ...
طبق لیست زیر
http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html
حدف می شوند (توجه این مورد به زبان فارسی مربوط نیست )

البته توجه داشته باشید که لیست stopword ها و
طول حروف قابل تعییر است (تغییرات در سرور اصلی و .... )
http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html
 

k2-4u

Well-Known Member
Boolean Full-Text Searches

حالت جستجو IN BOOLEAN MODE
برای استفاده از این حالت کافی است بعد از عبارت داخل AGAINST
کلید IN BOOLEAN MODE را قرار دهید

کد:
 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('your keyword' IN BOOLEAN MODE);

این حالت جستجو دارای علائم و حروف خاص معنی دار است
که می توانید آنها را اول یا آخر حروف قرار داد
برای مثال به وسیله کارکتر های "+" و"-"
در کوئری زیر
کد:
 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
به دنبال حرف MySQL می گردد . ولی از کلمه YourSQL اجتناب می کند

نکاتی مهم :

1. این روش جستجو بدون FULLTEXT هم امکان پذیر است ولی با کارای و سرعت پایین
2. حروف جستجو شده مانند . حالت IN BOOLEAN MODE محدودیت طول دارد
3. این حالت نیز مانند حالت قبل لیست stopword را در نظر نمی گیرد


نشانه گذاری های جستجو BOOLEAN شامل :

" + " :
این کارکتر به تنهای . میفهماند که باید حرف قبل از آن در نتیجه جستجو باشد


" - "
این کارکتر به تنهای . میفهماند که نباید حرف قبل از آن در نتیجه جستجو باشد

و ... بقیه برای بقیه نشانه ها به این آدرس مراجع کنید
http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html
 

k2-4u

Well-Known Member
Full-Text Searches with Query Expansion

نوع دیگر جستجو WITH QUERY EXPANSION
است

کد:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('keyword' WITH QUERY EXPANSION);

این نوع قابلیتی دارد که به وسیله آن می تواند رابطه میان کلمات را تشخیص دهد
برای مثال اگر کلمه database را جستجو کنید
جستجو گر . به کلماتی مانند SQL MySQL Oracle و ... نیز حساسیت نشان داده و
آنها را نیز در نتایج جستجو نشان می دهد


----------------------------------
این نوع را می توان همزمان با IN NATURAL LANGUAGE MODE نیز به کار برد
که به صورت زیر می شود

کد:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);



و پایان

تاپیک برای سوالات و نظرات شما باز است
 
آخرین ویرایش:

plague

Member
3 . در مواقعی که حجم اطلاعات خیلی زیاد است . عدم استفاده از full-text سرعت بیشتری دارد
از چه نظر ؟
در هنگام وارد کردن اطلاعات در دیتابیس یا در هنگام خواندن اطلاعات از دیتابیس ؟ فکر نمیکنم حجم اطلاعات سایت ها از فوروم ها بیشتر باشه ولی فکر میکنم فوروم ها از این روش استفاده میکنن .
این سیستم برای سایت خبری پیشنهاد میشه؟
ممنون
 

k2-4u

Well-Known Member
از چه نظر ؟
در هنگام وارد کردن اطلاعات در دیتابیس یا در هنگام خواندن اطلاعات از دیتابیس ؟ فکر نمیکنم حجم اطلاعات سایت ها از فوروم ها بیشتر باشه ولی فکر میکنم فوروم ها از این روش استفاده میکنن .
این سیستم برای سایت خبری پیشنهاد میشه؟
ممنون

در هنگام خواندن اطلاعات
اگر شما از FULLTEXT استفاده نکنید
بهتر . یعنی استفاده از اون سرعت و بازدهی رو پایین تر میاره
دلیل دقیقش رو نمیدونم . این مطلب رو در Manual
MySQL دیدم
 

D.A.V.O.O.D

Member
در هنگام خواندن اطلاعات
اگر شما از FULLTEXT استفاده نکنید
بهتر . یعنی استفاده از اون سرعت و بازدهی رو پایین تر میاره
دلیل دقیقش رو نمیدونم . این مطلب رو در Manual
MySQL دیدم

من توی یه کتابی که کوروش معرفی کرده بود ( MySQL در 10 روز ) خوندم که به طور کلی استفاده از هر نوع ایندکس سرعت را پایین می یاره اما استفاده از ایندکس در جاهایی نه تنها سرعت را پایین نمی یاره ، بلکه سرعت را هم به طور محسوسی افزایش و فشار روی MySQL را کمتر می کنه .

کلا کار ایندکس را بخوام شرح بدم به این صورته که شما فکر کن توی تیبل خبر هات بخوای خبر id = 1 را SELECT کنی ، MySQL به طور خود کار می یاد کل ردیف را می خونه اگه id = 1 بود نتیجه را میده و این هم چون شرح خبر توی هر ردیف هست تا بیاد بخونش ...

اما استفاده از ایندکس به این صورته که یه جدول مجزا از ایندکس های تعریف شده می سازه بعد MySQL ردیف های اون را می خونه و اگه پیدا کرد ، با استفاده از ایندکسش به ردیف اصلی پیوند می زند
 

جدیدترین ارسال ها

بالا