جستجوی تمام متن در MySQL خوب، بد و زشت
جستجوهای تمام متن در MySQL چیست؟
جستجوی متن کامل تکنیکی است که به شما امکان می دهد رکوردهایی را جستجو کنید که ممکن است کاملاً با معیارهای جستجو مطابقت نداشته باشند. جستجوهای متن کامل در MySQL زمانی انجام می شود که نمایه های خاصی در حال استفاده هستند و آن نمایه ها دارای تفاوت های ظریف منحصر به فرد هستند از جمله موارد زیر:
- برای اینکه نمایه یک نمایه تمام متن در نظر گرفته شود، باید نمایه از نوع FULLTEXT باشد .
- ایندکس های FULLTEXT را فقط می توان در جداول دارای موتورهای ذخیره سازی InnoDB یا MyISAM استفاده کرد.
- نمایه های FULLTEXT را فقط می توان برای ستون های CHAR ، VARCHAR ، یا TEXT ایجاد کرد .
- ایندکس های FULLTEXT تنها زمانی استفاده می شوند که از عبارت MATCH() AGAINST() استفاده شود.
- جستجوهای تمام متن دارای سه حالت هستند: حالت زبان طبیعی، حالت بولی و حالت گسترش پرس و جو.
نمایه FULLTEXT نوع خاصی از نمایه است که به جای مقایسه مقادیر با مقادیر موجود در فهرست، کلمات کلیدی را در متن پیدا می کند. اگرچه جستجوی FULLTEXT با سایر انواع تطبیق متفاوت است، توجه داشته باشید که می توانید یک نمایه BTREE و یک نمایه FULLTEXT را در یک ستون به طور همزمان داشته باشید - آنها تضاد ندارند زیرا برای اهداف مختلف مناسب هستند.
انواع جستجوی تمام متن
هنگام اجرای جستجوی متن کامل در MySQL ، به خاطر داشته باشید که سه نوع جستجو برای انتخاب وجود دارد:
- یک نوع جستجوی زبان طبیعی - چنین حالت جستجو رشته جستجو را به عنوان یک عبارت تحت اللفظی تفسیر می کند. اگر اصلاحکنندهای مشخص نشده باشد یا زمانی که اصلاحکننده حالت IN NATURAL LANGUAGE MODE مشخص شده باشد، بهطور پیشفرض فعال میشود.
- یک نوع جستجوی گسترش پرس و جو - چنین حالت جستجوی جستجو را دو بار انجام می دهد. هنگام جستجوی بار دوم، مجموعه نتایج شامل چند سند مرتبط از جستجوی اول است. با استفاده از اصلاح کننده WITH QUERY EXPANSION فعال شد .
- یک نوع جستجوی بولی - چنین حالت جستجوی جستجو برای پرس و جوهای پیچیده را امکان پذیر می کند که می تواند شامل عملگرهای بولی مانند کمتر از (" < ") و بیشتر از (">) باشد، عبارات فرعی ("(" و ")")، علامت بعلاوه (+)، علامت منفی (-)، نقل قول های دوگانه ("")، عملگر که سهم مقدار را در نتایج کاهش می دهد (~) و عملگر علامت عام (*) - عملگر حروف عام امکان جستجو با تطبیق فازی را می دهد ( برای مثال، "دمو*" نیز با "نمایش" مطابقت دارد). با استفاده از اصلاح کننده IN BOOLEAN MODE فعال شد .
جستجوهای تمام متن با حالت جستجوی زبان طبیعی
حالت جستجوی زبان طبیعی، همانطور که در بالا ذکر شد، به طور پیشفرض فعال میشود یا زمانی که اصلاحکننده حالت IN NATURAL LANGUAGE MODE مشخص شده باشد. این حالت یک جستجوی زبان طبیعی را در برابر یک مجموعه متن معین (یک یا چند ستون) انجام می دهد. قالب پرس و جو اصلی جستجوهای تمام متن در MySQL باید مشابه موارد زیر باشد:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);
هنگامی که MATCH() همراه با یک عبارت WHERE استفاده می شود ، ردیف ها به طور خودکار بر اساس بالاترین ارتباط مرتب می شوند. برای جستجوی یک رشته دقیق، آن را با دو نقل قول قرار دهید.
جستجوی تمام متن با حالت گسترش پرس و جو
جستجوهای تمام متن نیز از حالت گسترش پرس و جو پشتیبانی می کنند. چنین حالت جستجویی اغلب زمانی استفاده میشود که کاربر به دانش ضمنی تکیه میکند - برای مثال، کاربر ممکن است «DBMS» را جستجو کند به این امید که «MongoDB» و «MySQL» را در نتایج جستجو ببیند. دلیل اینکه کاربر ممکن است در هنگام استفاده از چنین حالت جستجویی بتواند به دانش ضمنی تکیه کند بسیار ساده است - جستجوی تمام متن با حالت بسط پرس و جو با انجام دوبار جستجو کار می کند: عبارت جستجوی دوم اولین عبارت جستجو است. همراه با چند ورودی مرتبط از اولین جستجو. به این معنی که، برای مثال، اگر در جستجوی اول، یکی از ردیفها حاوی کلمه «DBMS» و کلمه «MySQL» باشد، جستجوی دوم ورودیهایی را پیدا میکند که شامل کلمه «MySQL» میشود، حتی اگر آنها نباشند. حاوی "DBMS" است.
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION);
جستجوی متن کامل با استفاده از حالت بولی
حالت بولی شاید یکی از جالب ترین چیزهایی باشد که جستجوی متن کامل MySQL ارائه می کند. این حالت اخطارهای زیادی دارد که منحصر به فرد است زیرا به شما امکان می دهد قابلیت های جستجو را با استفاده از عملگرهای بولی گسترش دهید. هنگامی که حالت بولی در حال استفاده است، کاراکترهای خاصی می توانند در ابتدا یا انتهای کلمات معنی خاصی داشته باشند. مثلا:
- " +" به معنای AND است.
- " -" به معنای NOT است.
- عملگرهای " (" و ")" اجازه می دهد تا عبارات فرعی ایجاد کنید.
- اپراتورهای " <" و ">" رتبه مقدار جستجو را پایین یا بالاتر تغییر می دهند.
- " ~" سهم ارزش را در نتایج جستجو کاهش می دهد.
- نقل قول های دوتایی ( "") فقط با مقادیر تحت اللفظی مطابقت دارند.
- " *" یک عملگر عام است (به توضیح بالا مراجعه کنید).
این عملگرها به شما اجازه میدهند تا عملکرد جستجو را گسترش دهید: برای مثال، اگر میخواهید تمام ردیفهایی را که حاوی کلمه "Demo" هستند، اما نه "Demo2" را بازیابی کنید، میتوانید از یک پرس و جو مانند این استفاده کنید:
SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);
همچنین میتوانید از نقلقولهای دوگانه همراه با نقلقولهای تکی مانند زیر استفاده کنید:
SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);
جستجوی کامل متن Gotchas
قبل از استفاده از جستجوی متن کامل در MySQL ، به خاطر داشته باشید که جستجو دارای چند "نقشه" است:
- هر دو موتورهای ذخیره سازی InnoDB و MyISAM فهرست های مختص به خود را دارند. فهرست کلیدواژه InnoDB را میتوانید در اینجا پیدا کنید، فهرست کلیدواژه MyISAM را میتوانید در اینجا پیدا کنید .
- برای تعریف فهرست کلیدواژه خود برای InnoDB، جدولی با ساختار مشابه جدول INNODB_FT_DEFAULT_STOPWORD تعریف کنید ، کلمات توقف را در آنجا وارد کنید، سپس مقدار گزینه innodb_ft_server_stopword_table را به شکل db_name/table_name تنظیم کنید .
- برای تعریف فهرست کلیدواژه خود برای MyISAM، متغیر ft_stopword_file را روی نام مسیر فایل حاوی فهرست کلیدواژه تنظیم کنید. کلمات توقف در فایل را می توان با هر کاراکتر غیرالفبایی به جز "_" و "'" از هم جدا کرد. فایل توقف پیش فرض در store/myisam/ft_static.c قرار دارد. Stopwords را می توان با تنظیم متغیر روی یک رشته خالی غیرفعال کرد.
- جستجوهای تمام متن در جداول پارتیشن بندی شده پشتیبانی نمی شوند.
- همه ستونهای یک نمایه FULLTEXT باید از مجموعه کاراکترها و دستهبندی یکسانی استفاده کنند.
- عملیات جستجوی متن کامل، رشته % را به عنوان علامت عام در نظر نمی گیرد.
نکته دیگری هم در اینجا وجود دارد: ممکن است بخواهید به خاطر داشته باشید که تجزیه کننده داخلی FULLTEXT با نگاه کردن به کاراکترهای خاصی از جمله فاصله (" ")، کاما ("") و نقطه (.") تعیین می کند که کلمات کجا شروع و پایان می یابند. ) به این معنی که اگر رشته جستجوی شما حاوی یک یا چند مورد از آن کاراکترها باشد، نتایج جستجو ممکن است دقیق نباشد. به عنوان مثال، اگر پایگاه داده شما حاوی 5 ردیف با رشته "test.demo" باشد، عبارت جستجوی "test.demo" ممکن است نتایج بیشتری (10، 15 و غیره) از جمله "demo"، "string.demo_example" و غیره را ارائه دهد زیرا بهجای «test.demo» «دمو» را جستجو میکند، بنابراین ممکن است با بسیاری از موارد مشابه گیر بیفتید. اگر مایل به نوشتن افزونه خود در C یا C++ هستید، MySQL راه حلی برای این مشکل ارائه می دهد ( به مستندات MySQL مراجعه کنید)، اما تا آن زمان، شما نمی توانید کار زیادی انجام دهید.
فهرست کامل محدودیتهای متن کامل MySQL را میتوانید در صفحه مستندات MySQL مشاهده کنید .
خلاصه
قابلیت جستجوی متن کامل MySQL یک راه ساده برای پیاده سازی تکنیک های جستجوی مختلف (جستجوی زبان طبیعی، جستجوی گسترش پرس و جو، و جستجوی بولی) در برنامه کاربردی شما که MySQL را اجرا می کند، فراهم می کند. هر یک از این تکنیکهای جستجو اخطارهای خاص خود را دارند و هر یک از آنها ممکن است برای اهداف متفاوتی مناسب باشند - هنگام تصمیمگیری در مورد استفاده از جستجوی متن کامل، به خاطر داشته باشید که این نوع جستجو ظرافتهای منحصر به فرد زیادی دارد، هم از مزایا و معایب استفاده از جستجوی تمام متن در MySQL و عاقلانه انتخاب کنید.