سلام دوستان عزیز
در این مقاله یکم درباره MySQL Full-Text Search و ویژگی های اون صحبت می کنم .
همانطور که می دانید MySql برای جستجوی متن از دو امکان زیر استفاده می کند :
- LIKE statement
- regular expression
هرچند زمانی که ستون متن ما بزرگ شود و یا تعداد رکوردهای ما بسیار افزایش یابد استفاده از این دو امکان دارای محدودیت ها و مشکلات زیر می باشد :
- Performance : به دلیل اینکه در دستور LIKE یا استفاده از regular expressions ها , MySql کل جدول را جستجو می کند .این کار در تعداد رکوردهای بالا Performance خوبی ندارد .
- Flexible search :(جستجوی انعطاف پذیر ) سرچ کردن با استفاده از LIKE و regularexpression انعطاف کمی دارد . مثلا محصولاتی را بیابیم که عنوان آنها شامل کلمه ی CAR باشد ولی در آنها کلمه classic نباشد .
- ranking : هیچ راه خاصی وجود ندارد که مشخص کنیم کدام رکورد خروجی , به عبارتی که ما جستجو کردیم نزدیک تر است . در واقع به رکوردهای خروجی نمیتوان رتبه یا امتیازی داد .
به دلیل همین مشکلات , MYSQL قابلیت full-text search را اضافه کرده است . در قابلیت full-text search , مای اس کیو ال تمام کلمات مروبط به ستون مورد نظر را index می کند که این لیست معمولا به صورت مرتب شده نیز می باشد و از این به بعد جستجو را روی آنها انجام می دهد .
MYSQL با استفاده از الگوریتم های بسیار پیچیده تشخیص می دهد که کدام رکورد ها با مقدار مورد نظر ما تطابق دارد .
در ادامه به چند تا از ویژگی های full-text search در MYSQL اشاره کرده ام :
- Fully dynamic index : مای اس کیو ال به صورت اتوماتیک مقدار index های جدید را زمانی که رکوردهای جدول تغییری کنند , آپدیت می نماید .
- در کوئری های پیچیده بسیار سری است .
- در مای اس کیو ال ورژن 5.6 به بعد , full-text search در جداول MyISAM و InnoDB پشتیبانی می شود .
Defining FULLTEXT Indexes
پس تا اینجا متوجه شده ایم که در MySQL ایندکسی به نام full-text وجود دارد که برای جستجو از آن استفاده می شود .
هر زمان که داده های جدول ما عوض شوند . ایندکس full-text دوباره ساختته و آپدیت می شود .
MySQL به شما اجازه می دهد که برای فیلدهایی که از نوع CHAR و VARCHAR و TEXT هستند , ایندکس full-text را تعریف کنید .
همچنین در MySQL می توانیم ایندکس FULLTEXT را در زمان ایجاد جدول با استفاده از CREATE TABLE و یا با استفاده از ALTER TABLE و CREATE INDEX بعد از ایجاد جدول , اضافه نمایید .
Defining FULLTEXT index using CREATE TABLE statement
بریم سراغ تعریف ایندکس FULLTEXT در زمان ایجاد جدول .
CREATE TABLE table_name(
column1 data_type,
column2 data_type,
column3 data_type,
…
PRIMARY_KEY(key_column),
FULLTEXT (column1,column2,..)
);
در خط 7 با استفاده از کلمه ی کلیدی FULLTEXT تعیین کردیم که ستون های column1 و column2 ایندکس FULLTEXT می باشند .
برای مثال کد زیر جدولی به نام POSTS ایجاد می کند و فیلد post_content را به عنوان FULLTEXT قرار می دهد :
CREATE TABLE posts (
id int(4) NOT NULL AUTO_INCREMENT,
title varchar(255) NOT NULL,
post_content text,
PRIMARY KEY (id),
FULLTEXT KEY post_content (post_content)
);
Defining FULLTEXT index for existing tables
در مواقعی ممکن است شما جدول را ایجاد کرده باشید و بعد از آن تصمیم گرفتید که یکی از فیلدها را ایندکس FULLTEXT کنید . در این مواقع می توانید از ALTER TABLE و یا CREATE INDEX استفاده نمایید .
در مثال زیر از ALTER TABLE برای ایجاد ایندکس FULLTEXT استفاده می کنم که سینتکس آن اینگونه می باشد :
ALTER TABLE table_name
ADD FULLTEXT(column_name1, column_name2,…)
مثال : فیلدهای productDescription و productLine را به عنوان FULLTEXT تعیین می کنم .
ALTER TABLE products
ADD FULLTEXT(productDescription,productLine)
در مثال بعدی می خواهم همین کار را با استفاده از CREATE INDEX انجام دهم . سینتکس آن مانند زیر می باشد :
CREATE FULLTEXT INDEX index_name
ON table_name(idx_column_name,...)
برای مثال فیلدهای addressLine1 و addressLine2 را از جدول offices به عنوان ایندکس FULLTEXT معرفی می کنم :
CREATE FULLTEXT INDEX address
ON offices(addressLine1,addressLine2)
Removing full-text search columns
برای حذف ایندکس FULLTEXT از جدول , کافی است از عبارت ALTER TABLE … DROP INDEX استفاده کنید .
برای مثال کد زیر , ایندکس address را از جدول offices حذف می نماید :
ALTER TABLE offices
DROP INDEX address
خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.