معرفی MySQL Full-Text Search

Image تحقیقات

معرفی MySQL Full-Text Search

سلام دوستان عزیز

در این مقاله یکم درباره MySQL Full-Text Search  و ویژگی های اون صحبت می کنم .

همانطور که می دانید MySql برای جستجوی متن از دو امکان زیر استفاده می کند :‌

  1. LIKE statement
  2. regular expression

هرچند زمانی که ستون متن ما بزرگ شود و یا تعداد رکوردهای ما بسیار افزایش یابد  استفاده از این دو امکان دارای محدودیت ها و مشکلات زیر می باشد :‌

  1. Performance :‌ به دلیل اینکه در دستور LIKE یا استفاده از regular expressions ها , MySql کل جدول را جستجو می کند .این کار در تعداد رکوردهای بالا Performance خوبی ندارد .
  2. Flexible search :‌(جستجوی انعطاف پذیر ) سرچ کردن با استفاده از LIKE و  regularexpression انعطاف کمی دارد . مثلا  محصولاتی را بیابیم که عنوان آنها شامل کلمه ی CAR  باشد ولی در آنها کلمه classic نباشد .
  3. ranking :‌ هیچ راه خاصی وجود ندارد که مشخص کنیم کدام رکورد خروجی , به عبارتی که ما جستجو کردیم نزدیک تر است . در واقع به رکوردهای خروجی نمیتوان رتبه یا امتیازی داد .

به دلیل همین مشکلات , MYSQL قابلیت  full-text search را اضافه کرده است . در قابلیت full-text search , مای اس کیو ال تمام کلمات مروبط به ستون مورد نظر را index می کند که این لیست معمولا به صورت مرتب شده نیز می باشد و از این به بعد جستجو را روی آنها انجام می دهد .

MYSQL با استفاده از الگوریتم های بسیار پیچیده تشخیص می دهد که کدام رکورد ها با مقدار مورد نظر ما تطابق دارد .

در ادامه به چند تا از ویژگی های full-text search در MYSQL  اشاره کرده ام :

  1. Fully dynamic index : مای اس کیو ال به صورت اتوماتیک مقدار index های جدید را زمانی که رکوردهای جدول تغییری کنند , آپدیت می نماید .
  2. در کوئری های پیچیده بسیار سری است .
  3. در مای اس کیو ال ورژن 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

خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.