نماد سایت امپراطوری من

نصب و پیکره‌بندی sphinx در ubuntu

در این آموزش میخواهیم نحوه نصب و پیکره‌بندی 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

موفق و پیروز باشید.

خروج از نسخه موبایل