در این آموزش میخواهیم نحوه نصب و پیکرهبندی sphinx را در کنار پایگاه دادههای MySQL در سیستم عامل اوبونتو فرا بگیریم. ابتدا خوب است بدانیم sphinx چیست و چه امکاناتی را در اختیار ما قرار میدهد.
تصورکنید پایگاه داده شما با تعداد بسیار زیادی از ردیفهای اطلاعات پر شده است. شاید میلیاردها رکورد اطلاعات! و شما میخواهید در کمترین زمان ممکن در این تعداد انبوه از اطلاعات جستجو کنید. در واقع میخواهید یک موتور جستجو داشته باشید. شاید این نام ترس در دل شما بیاندازد و همین اول راه منصرف شوید، اما نگران نباشید. به کمک sphinx ساخت یک موتور جستجو چندان هم سخت نیست.
بگذارید مسئله را تعریف کنیم: میخواهیم در میان انبوهی از اطلاعات و در کمترین زمان ممکن جستجو کنیم.
خب سادهترین راه حل استفاده از امکانات داخلی پایگاه داده مانند index است. یعنی زمانی که میخواهید جدولی بسازید، برای فیلدهایی که در آینده میخواهید بر روی آنها جستجو کنید، امکان index را فعال میکنید.
با اینکار میتوانید به کمک تابع MATCH در SQL جستجو را در کمترین زمان ممکن انجام دهید. حال این سوال در ذهنتان بوجود خواهد آمد که پس sphinx چه کمکی به ما خواهد کرد. جواب ساده است. فرض کنید تعداد رکوردها به چندین میلیارد برسد. در این حالت وقتی رکورد جدیدی از اطلاعات در پایگاه داده ثبت شود، باید index دوباره از نو ساخته شود تا داده جدید را نیز شامل شود. ساخت index برای MySQL بسیار دشوار است و بروز رسانی آن بسیار کند خواهد بود. برای حل این مشکل باید ایجاد فایل index و بروز رسانی آن را بر عهده یک ابزار خارجی مانند sphinx قرار دهیم.
برای نصب sphinx در ubuntu باید دستور زیر را اجرا کنید:
sudo apt-get install sphinxsearch
نصب به همین راحتی انجام شد. حال باید پیکرهبندی را انجام دهیم. این کار هم بسیار ساده است. برای اینکار باید دستور زیر را در ترمینال وارد کنید تا فایل تنظیمات ساخته شود:
sudo nano /etc/sphinxsearch/sphinx.conf
فایل تنظیمات دارای سه بلاک است که عبارتند از index و searchd و source که در ادامه به هر کدام از این بخش میپردازیم.
[divider]
قسمت Source شامل اطلاعاتی درباره منبع اطلاعات(پایگاه داده)، نام کاربری، رمزعبور و آدرس پایگاه اطلاعاتی برای اتصال به پایگادهدادهها است. همچنین در این بخش تنظیماتی در مورد نوع دیتابیس و دستور SQL ای که میخواهیم جستجوی Full Text در آن اتفاق بیوفتد، نیز وجود دارد. به طور کلی بلاک Source میتواند مانند نمونه زیر باشد:
source src1 { type = mysql #SQL settings (for ‘mysql’ and ‘pgsql’ types) sql_host = localhost sql_user = root sql_pass = password sql_db = test sql_port = 3306 # optional, default is 3306 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added }
در نمونه بالا، نام src1 نامی است که به بلاک تنظیمات Source اختصاص دادیم. این نام در بلاک index مورد استفاده قرار خواهد گرفت. در این بلاک کلید type تعیین کننده نوع دیتابیس است که به غیر از mysql برای نوع پایگاه داده، میتوان از نامهای دیگر مانند pgsql, mssql, xmlpipe2, odbc و سایر پایگاهدادهها استفاده کرد. مقادیر sql_host، sql_user ،sql_pass ،sql_db sql_port باید مقادیر مناسب را برای برقراری ارتباط sphinx با پایگاه داده قرار دهیم. همانطور که در مثال بالا میبینید، sql_query همان دستوری است که باید اطلاعات را از دیتابیس واکشی کند. دو کلید انتهایی نوع داده ستونهایی که از sql_query بدست میاید را تعیین میکنند.
[divider]
بلاک بعدی بلاک index است که دو وظیفه مهم دارد. اول تعیین Source مورد استفاده برای Sphinx و دیگری محل نگهداری index ساخته شده توسط Sphinx است. در نتیجه نمونه بلاک تنظیمات برای این بخش بصورت نمونه زیر خواهد بود:
index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern }
[divider]
بخش آخر تنظیمات Sphinx تنظیمات مربوط به Search Daemon یا همان searchd است. این بخش از Sphinx یک سرویس پست پرده است که دائما در حال اجراست و مسئول پاسخگویی به پرس و جو های ما خواهد بود. تنظیمات این بخش به شرح زیر هستند:
searchd { listen = 9312:sphinx #SphinxAPI port listen = 9306:mysql41 #SphinxQL port log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
در نمونه بالا، seamless_rotate برای جلوگیری از اشتباه در عملیات جستجو، زمانی که فایل index حجیم شده و با اطلاعات موقت کش در حال ادغام است، استفاده میشود. همچنین preopen_indexes باعث میشود که Sphinx در هنگام شروع به کار تمام فایلهای index را باز کند. و در نهایت unlink_old باعث میشود زمانی که فایلهای index با هم ادغام شدند و فایل جدید را ساختند، فایلهای قدیمی که دیگر بی ارزش هستند را از روی هارد پاک کند.
[divider]
با ادغام هر سه بلاک فایل تنظیمات کامل میشود. در مثال ما فایل تنظیمات حاوی اطلاعات زیر خواهد بد:
source src1 { type = mysql sql_host = localhost sql_user = root sql_pass = your_root_mysql_password sql_db = test sql_port = 3306 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added } index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern } searchd { listen = 9306:mysql41 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
[divider]
مدیریت Index
در این مرحله مقداری داده در index قرار میدهیم تا مطمئن شویم sphinx به خوبی کار میکند. سپس به کمک cron کاری میکنیم که index هر ساعت بروز رسانی شود. اگر در پایگاهداده اطلاعاتی وجود داشته باشد، یعنی چند رکورد اطلاعات در دیتابیس داشته باشید، به راحتی به کمک دستور زیر قادر خواهید بود تا index اطلاعات را ایجاد کنید.
sudo indexer --all
هر بار که دستور بالا را اجرا کنید، فایل index از نو ساخته میشود. در محیط production یعنی وقتی محصول شما به کاربر ارائه شده است، باید همیشه اطمینان حاصل کنید که index بطور خودکار بروز شود. برای اینکار همانطور که قبلتر هم گقتیم، از قابلیت cron استفاده میکنیم. برای اضافه کردن دستور بروز رسانی sphinx به لیست cron jobs دستور زیر را وارد کنید:
crontab -e
دستور زیر هر ساعت اجرا شده و فایل index را با توجه به فایل تنظیماتی که ساختیم از نو ایجاد میکند:
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
[divider]
گام نهایی، راه اندازی سرویس Sphinxsearch
به صورت پیشفرض Daemon مربوطه به Sphinx خاموش است. برای روشن کردن آن باید در مسیر /etc/default/sphinxsearch مقدار START=no را به START=yes تغییر دهیم. این کار با دستور زیر انجام میشود:
sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch
حال به کمک دستور زیر باید سرویس sphinx را ریاستارت کنیم:
sudo systemctl restart sphinxsearch.service
اگر با خطایی روبرو نشویم، نشانگر این است که همه مراحل را درست طی کردهایم. با اینحال، برای مشاهده وضعیت سرویس sphinx از دستور زیر استفاده کنید:
sudo systemctl status sphinxsearch.service
موفق و پیروز باشید.