آموزش Query Expansion در MySQL

Image تحقیقات

آموزش Query Expansion در MySQL

با سلامی دوباره خدمت دوستان عزیز

در ادامه ی مقالات مربوط به Full Text Search , امروز می خواهم درباره مد دیگری صحبت کنم به نام  Query Expansion .

اگر 2 سری قبلی آموزش های Full Text Search را نخوانده اید , پیشنهاد می کنم در ابتدا آنها را مطالعه کنید .

وقتی شما از مد Query Expansion در جستجوی FULL TEXT استفاده کنید ,در واقع MySQL full-text search , مراحل زیر را انجام می دهد .

  • در ابتدا به دنبال سطرهایی می باشد که با عبارت جستجو شده تطابق دارند. (مرحله اول )
  • سپس تمام سطرهایی که یافته است را چک می کند و کلمات آن را بیرون می کشد. (مرحله دوم)
  • سپس بار دیگر این کلمات بیرون کشیده شده را در تمام سطرها جستجو کرده و نتایج منطبق را پیدا می کند . (مرحله سوم )
  • در آخر , سطرهای که در مرحله اول پیدا کرده به همراه سطرهایی که در مرحله سوم پیدا شده است را  به کاربر نشان می دهد .

فرض کنید در میان جدول کاربران ,  شما کلمه  ali را سرچ می کنید و نتایج بدست آمده سه رکورد مانند زیر می باشد :

  • ali
  • ali reza
  • mohammad ali

همان طور که مشاهده می کنید 3 رکورد یافت شده است .در میان این 3 رکورد کلمات reza , mohammad نیز وجود دارد . پس بار دیگر MYSQL در میان جدول کاربران به دنبال رکوردهایی است که فیلد نام آنها شامل کلمات reza یا mohammad است و آن رکورد ها را نیز به کاربر نشان می دهد .

  • بهتر است زمانی از query expansion استفاده کنیم که تعداد رکوردهای خروجی کم است .
  • برای استفاده از query expansion کافی است از WITH QUERY EXPANSION در فانکشن AGAINST() استفاده کنید  که سینتکس آن به این گونه می باشد
SELECT column1, column2
FROM table1
WHERE MATCH(column1,column2) 
      AGAINST('keyword',WITH QUERY EXPANSION);

خب دیگه وقتش هست بریم سراغ یک مثال .

 

فرض کنید جدولی داریم به نام  products که شامل لیست محصولات می باشد . ابتدا فیلد productName از این جدول را ایندکس fulltext می نماییم :

ALTER TABLE products 
ADD FULLTEXT(productName);

حالا در میان رکورد ها به دنبال محصولی می گردیم که نام آن شامل 1992 می باشد .(بدون استفاده از  query expansion )

SELECT productName
FROM products
WHERE MATCH(productName) AGAINST('1992');

خروجی :

+-----------------------------------+
| productName                       |
+-----------------------------------+
| 1992 Ferrari 360 Spider red       |
| 1992 Porsche Cayenne Turbo Silver |
+-----------------------------------+
2 rows in set (0.00 sec)

همانطور که مشاهده می نمایید تنها 2 رکورد که نام آن شامل 1992 می باشد یافت شده است.

در ادامه می خواهم همین سرچ را با استفاده از مد QUERY EXPANSION انجام دهم :

SELECT productName
FROM products
WHERE MATCH(productName) 
      AGAINST('1992' WITH QUERY EXPANSION);

خروجی :

+-------------------------------------+
| productName                         |
+-------------------------------------+
| 1992 Porsche Cayenne Turbo Silver   |
| 1992 Ferrari 360 Spider red         |
| 2001 Ferrari Enzo                   |
| 1932 Alfa Romeo 8C2300 Spider Sport |
| 1948 Porsche 356-A Roadster         |
| 1948 Porsche Type 356 Roadster      |
| 1956 Porsche 356A Coupe             |
+-------------------------------------+
7 rows in set (0.00 sec)

این دفعه مشاهده می شود که نتایج بیشتری را برگردانده است .چرا ؟؟؟

به این دلیل که در ابتدا به دنبال رکوردهایی گشته است که نام آنها شامل عبارت  1992 باشد . پس رکورد اول و دوم در خروجی را یافته است . یعنی  :

  •  1992 Porsche Cayenne Turbo Silver
  • 1992 Ferrari 360 Spider red

سپس در بین این دو رکورد کلمات را جدا کرده و رکورهایی را یافته است که شامل این کلمات باشد :

  • Porsche
  • Cayenne
  • Turbo
  • Silver
  • Ferrari
  • Spider

و خروجی های 3 تا 7 را برگردانده است .یعنی :

  • 2001 Ferrari Enzo
  • 1932 Alfa Romeo 8C2300 Spider Sport
  • 1948 Porsche 356-A Roadster
  • 1948 Porsche Type 356 Roadster
  • 1956 Porsche 356A Coupe

به همین دلیل است که می گویند استفاده از WITH QUERY EXPANSION زمانی به صرفه است که کاربر عبارت کوچکی را سرچ کرده باشد .. وگرنه تعداد نتایج خروجی و جستجو بین رکوردها به شدت زیاد می شود .

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