Sphinx là một công cụ tìm kiếm mã nguồn mở, cho phép tìm kiếm full-text. Sphinx rất hiệu quả cho quá trình tìm kiếm trên cơ sở dữ liệu lớn. Dữ liệu được index có thể đến từ nhiều nguồn khác nhau như cơ sở dữ liệu SQL, file văn bản thuần túy, file HTML, hộp thư,… Trong bài viết này, bạn sẽ được hướng dẫn cài đặt và cấu hình Sphinx trên CentOS 7.
Bước 1: Cài đặt Sphinx
Để làm theo hướng dẫn này, bạn cần một máy chủ CentOS 7 đã cài đặt MySQL và non-root user được cấp quyền sudo. Tìm hiểu bài viết cách cài đặt MySQL trên CentOS 7 để biết cách cài đặt hiệu quả.
Hướng dẫn này cài đặt phiên bản Sphinx 2.2.11. Bạn có thể truy cập vào website của Sphinx để cập nhật phiên bản mới nhất.
Trước khi cài đặt Sphinx, bạn nên cài đặt các thành phần liên quan bằng lệnh sau:
sudo yum install -y postgresql-libs unixODBC
Di chuyển đến thư mục tmp
để tải xuống các file của Sphinx:
cd /tmp
Tải xuống phiên bản mới nhất của Sphinx bằng cách sử dụng tiện ích wget
.
wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
Cuối cùng, cài đặt Sphinx bằng lệnh sau:
sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm
Bây giờ bạn đã cài đặt thành công Sphinx trên máy chủ của mình. Bạn cần cấu hình Sphinx trước khi chạy Sphinx daemon.
Bước 2: Tạo cơ sở dữ liệu thử nghiệm
Trong bước này, bạn sẽ thiết lập cơ sở dữ liệu bằng cách sử dụng dữ liệu mẫu trong file SQL được cung cấp cùng với package. Điều này cho phép kiểm tra tìm kiếm Sphinx có hoạt động hay không.
Nhập file SQL mẫu vào cơ sở dữ liệu. Đầu tiên, đăng nhập vào server shell MySQL:
$ mysql -u root -p
Nhập mật khẩu cho root user MySQL khi có thông báo. Prompt của bạn sẽ thay đổi thành MariaDB>
.
Tạo một cơ sở dữ liệu giả, ở đây sử dụng test. Bạn có thể thay test bằng một tên tùy ý:
CREATE DATABASE test;
Nhập file SQL mẫu:
SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;
Sau đó thoát khỏi MySQL shell.
quit
Khi đã có một cơ sở dữ liệu chứa toàn dữ liệu mẫu, bạn sẽ tùy chỉnh cấu hình của Sphinx.
Để có thể lưu trữ cơ sở dữ liệu theo thời gian sử dụng lâu dài, bạn cần có một máy chủ với khả năng nâng cấp, mở rộng tài nguyên linh hoạt. VPS NVMe là giải pháp tối ưu nhất trong trường hợp này. Các gói dịch vụ VPS của Vietnix bao gồm VPS NVMe, VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS GPU với cấu hình và mức giá linh hoạt để phù hợp với những nhu cầu khác nhau của cá nhân, doanh nghiệp.
Một số ưu điểm của VPS của Vietnix bao gồm độ ổn định cao, tốc độ truy cập nhanh, chất lượng dịch vụ tốt, hỗ trợ nhanh chóng và chuyên nghiệp. Liên hệ với Vietnix để được tư vấn chi tiết về các gói dịch vụ mà bạn quan tâm.
Bước 3: Cấu hình Sphinx
Các cấu hình của Sphinx sẽ nằm trong file sphinx.cnf
ở thu mục /etc/sphinx
. Cấu hình bao gồm 3 block chính là index, searchd và source. Ban đầu khi cài đặt hệ thống sẽ cung cấp cho người dùng cấu hình đơn giản, nhưng trong bài này bạn sẽ tuỳ chỉnh một file cấu hình mới để sử dụng cũng như hiểu được từng bước thực hiện.
Đầu tiên, đổi tên file cấu hình hiện có bằng lệnh sau:
$ sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
Tạo một file sphinx.conf
mới bằng vi
hoặc trình soạn thảo khác tùy ý:
$ sudo vi /etc/sphinx/sphinx.conf
Mỗi block index, searchd và source được mô tả bên dưới, và bạn sẽ sao chép toàn bộ cấu hình của ba block để dán vào file cấu hình.
Block source chứa nguồn, username và password cho server SQL. Cột đầu tiên của sql_query
phải là một id duy nhất. Truy vấn SQL sẽ chạy trên mọi index và kết xuất dữ liệu vào file index Sphinx. Dưới đây là mô tả từng trường của block source:
type
: Nguồn dữ liệu để lập index, bài viết này sử dụng mysql. Ngoài ra bạn có thể sử dụng pssql, mssql, xmlpipe2, odbc,…sql_host
: Hostname cho host MySQL, bài viết này sử dụnglocalhost
.sql_host
có thể là domain hoặc địa chỉ IP.sql_user
: Username để đăng nhập MySQL, bài viết này sử dụng username là root.sql_pass
: Mật khẩu cho user MySQL. Bài viết này sử dụng password của root user MySQL.sql_db
: Tên của database lưu trữ dữ liệu, ở đây database là test.sql_query
: Truy vấn chuyển dữ liệu từ cơ sở dữ liệu sang index.
Đây là block 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
}
Thành phần index chứa source và đường dẫn để lưu trữ dữ liệu:
source
: Tên của block source, bài viết này sử dụng tên src1.path
: Đường dẫn lưu index.
index test1
{
source = src1
path = /var/lib/sphinx/test1
docinfo = extern
}
Thành phần searchd chứa port và các biến khác để chạy daemon Sphinx:
listen
: Port mà Sphinx daemon sẽ chạy. Tiếp theo là giao thức, ở đây listen là 9306:mysql41. Các giao thức đã biết là :sphinx (SphinxAPI) và :mysql41 (SphinxQL).query_log
: Đường dẫn lưu query log.pid_file
: Đường dẫn đến file PID của Sphinx daemon.seamless_rotate
: Ngăn chặn các searchd stall trong khi xoay các index có dữ liệu khổng lồ vào precache.preopen_indexes
: Các index có bắt buộc phải mở trước khi khởi động hay không.unlink_old
: Các bản sao index cũ có cần xóa khi xoay vòng thành công hay không.
searchd
{
listen = 9312:sphinx #SphinxAPI port
listen = 9306:mysql41 #SphinxQL port
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinx/
}
Cấu hình đầy đủ để sao chép và dán ở bên dưới. Biến duy nhất cần được thay đổi là sql_pass
trong block source.
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/sphinx/test1
docinfo = extern
}
searchd
{
listen = 9306:mysql41
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinx/
}
Để xem thêm các cấu hình, bạn có thể truy cập vào file /usr/share/doc/sphinx-2.2.11/sphinx.conf.dist
, file này chứa tất cả các biến được giải thích chi tiết.
Bước 4: Quản lý index
Trong bước này, bạn sẽ thêm dữ liệu vào index Sphinx và đảm bảo index luôn được cập nhật bằng cách sử dụng cron
.
Đầu tiên, thêm dữ liệu vào index bằng cách sử dụng cấu hình mà bạn đã tạo trước đó:
sudo indexer --all
Bạn sẽ nhận được output sau:
Output
Sphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinx/sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.006 sec, 29765 bytes/sec, 616.90 docs/sec
total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
Trong môi trường triển khai, cần phải cập nhật index. Để làm điều này, hãy tạo một Cron job. Đầu tiên, mở crontab
:
crontab -e
Cron job sẽ chạy định kì mỗi giờ và thêm dữ liệu mới vào index bằng cách sử dụng file cấu hình mà bạn đã tạo trước đó. Sao chép và dán crontab vào cuối file, sau đó lưu và đóng file.
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all
Khi Sphinx đã được thiết lập và cấu hình đầy đủ, bạn có thể bắt đầu dùng thử.
Bước 5: Khởi động Sphinx
Sử dụng systemctl
để khởi động daemon Sphinx:
$ sudo systemctl start searchd
Để kiểm tra Sphinx daemon có chạy đúng không, hãy sử dụng lệnh:
$ sudo systemctl status searchd
Bạn sẽ nhận được output sau:
Output
● searchd.service - SphinxSearch Search Engine
Loaded: loaded (/usr/lib/systemd/system/searchd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2016-08-19 17:48:39 UTC; 5s ago
. . .
Sphinx đã được cấu hình và đang hoạt động, tiếp theo bạn sẽ kiểm tra xem Sphinx có hoạt động bình thường hay không.
Bước 6: Kiểm tra chức năng tìm kiếm
Khi đã thiết lập cấu hình, hãy kiểm tra chức năng tìm kiếm. Kết nối với Sphinx bằng MySQL interface. Prompt của bạn sẽ thay đổi thành MySQL>
:
mysql -h0 -P9306
Hãy tìm kiếm một câu:
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
Bạn sẽ nhận được kết quả sau:
Output
+------+----------+------------+
| id | group_id | date_added |
+------+----------+------------+
| 1 | 1 | 1465979047 |
| 2 | 1 | 1465979047 |
+------+----------+------------+
2 rows in set (0.00 sec)
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| total | 2 |
| total_found | 2 |
| time | 0.000 |
| keyword[0] | test |
| docs[0] | 3 |
| hits[0] | 5 |
| keyword[1] | document |
| docs[1] | 2 |
| hits[1] | 2 |
+---------------+----------+
9 rows in set (0.00 sec)
Trong output trên, bạn có thể thấy Sphinx đã tìm thấy 2 kết quả phù hợp từ index test1
cho câu kiểm tra. Lệnh SHOW META
cũng hiển thị số lần truy cập của mỗi từ khóa trong câu.
Hãy tìm kiếm một số từ khóa:
CALL KEYWORDS ('test one three', 'test1', 1);
Bạn sẽ nhận được kết quả sau:
Output
+------+-----------+------------+------+------+
| qpos | tokenized | normalized | docs | hits |
+------+-----------+------------+------+------+
| 1 | test | test | 3 | 5 |
| 2 | one | one | 1 | 2 |
| 3 | three | three | 0 | 0 |
+------+-----------+------------+------+------+
3 rows in set (0.00 sec)
Từ output trên, bạn có thể thấy trong index test1, Sphinx đã tìm thấy:
- 5 kết quả phù hợp trong 3 tài liệu cho từ khóa “test”.
- 2 kết quả phù hợp trong 1 tài liệu cho từ khóa “one”.
- Không có kết quả phù hợp cho từ khóa “three”.
Khi đã hoàn tất thử nghiệm Sphinx, bạn có thể xóa cơ sở dữ liệu thử nghiệm DROP DATABASE test ;
nếu muốn. Sau đó thoát khỏi MySQL shell bằng lệnh:
quit
Nếu bạn đang gặp phải các vấn đề khi thực hiện các thao tác trên hoặc cảm thấy chúng quá phức tạp, đừng lo lắng. Bạn có thể sử dụng dịch vụ VPS của Vietnix để được hỗ trợ cài đặt một cách nhanh chóng và dễ dàng hơn. Với hơn 11 năm kinh nghiệm và hơn 50.000 khách hàng cá nhân và doanh nghiệp đã tin tưởng sử dụng dịch vụ, Vietnix là một trong những nhà cung cấp giải pháp lưu trữ hàng đầu tại Việt Nam.
Ngoài ra, Vietnix còn là đối tác tin cậy của nhiều khách hàng lớn như GTV, UB Group, iVIVU, Vietnamworks, SEOSONA, SAGO Media,… với hơn 100.000 dịch vụ được kích hoạt. Vietnix luôn cam kết mang lại cho khách hàng sự hài lòng tuyệt đối với các dịch vụ chất lượng cao và tiện ích đa dạng. Còn chần chờ gì mà không đăng ký trải nghiệm dịch vụ của Vietnix ngay hôm nay.
Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
- Hotline: 1800 1093.
- Email: sales@vietnix.com.vn.
Trong hướng dẫn này, bạn đã hoàn tất cài đặt Sphinx và thực hiện tìm kiếm đơn giản bằng SphinxQL và MySQL. Chúc các bạn cài đặt thành công và có thể ứng dụng Sphinx để tìm kiếm tùy chỉnh trên trang web của mình. Ngoài ra, đừng quên theo dõi các bài viết tiếp theo của Vietnix để cập nhật thêm các mẹo sử dụng công cụ này.