• 2 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جستجو با FULLTEXT در MySQL
#1
نوع داده 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 چهار حالت . برای جستجو دارد .
که در ادامه گفته میشود .
مثال های بالا یکی از این روش ها است
  پاسخ
#2
عالی بود
البته در مورد
کد پی‌اچ‌پی:
SELECT idbodyMATCH (title,bodyAGAINST ('search Me..') AS score FROM articles WHERE (...) 
score‌ درصد انتطباق هست.
  پاسخ
تشکر شده توسط : hosseintdk775 iroveb
#3
نقل قول:score‌ درصد انتطباق هست.
کلمه AS برای تعریف نام جدید
برای یک ستون یا ... استفاده می شه
مثلا
کد:
SELECT hello_world AS  hw,salam_khobi  AS  salam  FROM  tbname;

خب ؟ درصد انتطباق ؟ داستان چیه ؟ Exclamation
  پاسخ
تشکر شده توسط :
#4
درسته As برای نام مستعار هست منظور من مقداری هست که AGAINST ('search Me..') وقتی که در قسمت select میاد‌ هست. که در این صورت میزان‌ انطباق هست
با توجه به مثالی که خود mysql زده دستوری که شما دادین این مقدار رو بر می گردونه
کد پی‌اچ‌پی:
+----+------------------+
id score            |
+----+------------------+
|  
0.65545833110809 |
|  
|                |
|  
0.66266459226608 |
|  
|                |
|  
|                |
|  
|                |
+----+------------------+ 

شما بر اساس این مقدار می تونید sort کنید و در این صورت مقداری که بیشتر شبیه به مورد جستجو هست رو اول بیارید
  پاسخ
تشکر شده توسط : k2-4u nasserghiasi amir.s nazila hosseintdk775 iroveb
#5
حالت . پیشفرض . 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/f...words.html
حدف می شوند (توجه این مورد به زبان فارسی مربوط نیست )

البته توجه داشته باشید که لیست stopword ها و
طول حروف قابل تعییر است (تغییرات در سرور اصلی و .... )
http://dev.mysql.com/doc/refman/5.1/en/f...uning.html
  پاسخ
تشکر شده توسط : admin amir.s nazila hosseintdk775 cyletech
#6
خیلی مفید بود.
من یک مشکل در این زمینه دارم
با این روش نمیتوانم چند فیلد جدول را با هم بررسی کنم در صورتی که هر کدام به تنهایی درست کار میکنند.
مثلا:
کد پی‌اچ‌پی:
$query="SELECT * FROM `balatarin` WHERE MATCH (`title`) AGAINST ('$value')"
این به درستی کار میکند
و همچنین:
کد پی‌اچ‌پی:
$query="SELECT * FROM `balatarin` WHERE MATCH (`describe`) AGAINST ('$value')"
هم به درستی کار می‌کند
ولی حالت ترکیبی که در مثال شما هم هست کار نمی‌کند:
کد پی‌اچ‌پی:
$query="SELECT * FROM `balatarin` WHERE MATCH (`title`,`describe`) AGAINST ('$value')"

اشکال از کجا می‌تونه باشه؟ از نسخه مای اسکیوال؟
اگه اینطوری بود چطور می‌تونم با اس کیو ال نتایج دو جستجو را با هم ترکیب کنم که همین کار را پیاده سازی کند؟
فعلا به این کد رسیدم که ظاهراً خوب هم جواب می‌ده :
کد پی‌اچ‌پی:
$query="SELECT `title`,`describe`, MATCH (`describe`) AGAINST ('$value' IN NATURAL LANGUAGE MODE) 
AS `score` FROM `balatarin` WHERE MATCH (`title`) AGAINST ('
$value') ORDER BY score desc limit 200"

منبع
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان