Thứ ba, 20/09/2016 | 00:00 GMT+7

Cách cài đặt và cấu hình Sphinx trên CentOS 7

Sphinx là một công cụ tìm kiếm open-souce cho phép tìm kiếm toàn văn. Nó được biết đến nhiều nhất để thực hiện các tìm kiếm trên dữ liệu lớn rất hiệu quả. Dữ liệu được lập index nói chung có thể đến từ các nguồn rất khác nhau: database SQL, file văn bản thuần túy, file HTML, hộp thư, v.v.

Một số tính năng chính của Sphinx là:

  • Hiệu suất lập index và tìm kiếm cao
  • Công cụ lập index và truy vấn nâng cao
  • Xử lý hậu kỳ tập hợp kết quả nâng cao
  • Khả năng mở rộng đã được chứng minh lên đến hàng tỷ tài liệu, hàng terabyte dữ liệu và hàng nghìn truy vấn mỗi giây
  • Tích hợp dễ dàng với các nguồn dữ liệu SQL và XML cũng như các giao diện tìm kiếm SphinxQL, SphinxAPI hoặc SphinxSE
  • Mở rộng quy mô dễ dàng với các tìm kiếm phân tán

Trong hướng dẫn này, ta sẽ cài đặt Sphinx với server MySQL bằng cách sử dụng file SQL mẫu có trong gói phân phối. Nó sẽ cung cấp cho bạn một ý tưởng cơ bản về cách sử dụng Sphinx cho dự án của bạn.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần :

  • Một server CentOS 7.

  • Một user không phải root có quyền sudo , bạn có thể cài đặt theo hướng dẫn này .

  • MySQL được cài đặt trên server của bạn, mà bạn có thể cài đặt theo bước 2 của hướng dẫn này .

Bước 1 - Cài đặt Sphinx

Tại thời điểm viết bài, version Sphinx mới nhất là 2.2.11 . Bạn có thể tìm thấy version mới nhất trên trang web Sphinx .

Trước khi cài đặt Sphinx, trước tiên bạn cần cài đặt các phụ thuộc của nó.

  • sudo yum install -y postgresql-libs unixODBC

Di chuyển đến tmp để download các file của Sphinx ở một nơi không phô trương.

  • cd /tmp

Download version Sphinx mới nhất bằng wget .

  • wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm

Cuối cùng, cài đặt nó bằng yum .

  • sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm

Đến đây bạn đã cài đặt thành công Sphinx trên server của bạn . Trước khi khởi động daemon Sphinx, hãy cấu hình nó.

Bước 2 - Tạo Database Kiểm tra

Ở đây, ta sẽ cài đặt database bằng cách sử dụng dữ liệu mẫu trong file SQL được cung cấp cùng với gói. Điều này sẽ cho phép ta kiểm tra xem tìm kiếm Sphinx có hoạt động sau này không.

Hãy nhập file SQL mẫu vào database . Đầu tiên, đăng nhập vào shell server MySQL.

  • mysql -u root -p

Nhập password cho user root MySQL khi được hỏi. Dấu nhắc của bạn sẽ thay đổi thành MariaDB> .

Tạo một database giả. Ở đây, ta gọi nó là thử nghiệm , nhưng bạn có thể đặt tên cho nó bạn muốn .

  • CREATE DATABASE test;

Nhập file SQL mẫu.

  • SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;

Sau đó, rời khỏi shell MySQL.

  • quit

Đến đây bạn có một database chứa đầy dữ liệu mẫu. Tiếp theo, ta sẽ tùy chỉnh cấu hình của Sphinx.

Bước 3 - Cấu hình Sphinx

Cấu hình của Sphinx phải nằm trong file có tên sphinx.conf trong /etc/sphinx . Cấu hình bao gồm 3 khối chính: chỉ mục , tìm kiếmnguồn .

Có một cấu hình tối thiểu đã được cung cấp, nhưng ta sẽ cung cấp một file cấu hình mẫu mới để bạn sử dụng và giải thích từng phần để bạn có thể tùy chỉnh nó sau này.

Đầu tiên, di chuyển file sphinx.conf hiện có.

  • sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2

Tạo file sphinx.conf mới bằng vi hoặc editor yêu thích của bạn.

  • sudo vi /etc/sphinx/sphinx.conf

Mỗi khối chỉ mục , tìm kiếmnguồn được mô tả bên dưới. Sau đó, ở cuối bước này, toàn bộ sphinx.conf được bao gồm để bạn sao chép và paste vào file .

Khối nguồn chứa loại nguồn, tên user và password của server MySQL. 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ả của từng trường và chính khối nguồn.

  • type : Loại nguồn dữ liệu cần lập index . Trong ví dụ của ta , đây là mysql . Các loại được hỗ trợ khác bao gồm pgsql, mssql, xmlpipe2, odbc, v.v.
  • sql_host : Tên server cho server MySQL. Trong ví dụ của ta , đây là localhost . Đây có thể là một domain hoặc địa chỉ IP.
  • sql_user : Tên user để đăng nhập MySQL. Trong ví dụ của ta , đây là root .
  • sql_pass : Mật khẩu cho user MySQL. Trong ví dụ của ta , đây là password của user MySQL root .
  • sql_db : Tên của database lưu trữ dữ liệu. Trong ví dụ của ta , đây là thử nghiệm .
  • sql_query : Truy vấn kết xuất dữ liệu từ database vào index .

Đây là khối nguồn:

khối nguồn cho sphinx.conf
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 chỉ mục chứa nguồn và đường dẫn để lưu trữ dữ liệu.
trong

  • source : Tên của khối nguồn. Trong ví dụ của ta , đây là src1 .
  • path : Đường dẫn để lưu index .
khối index cho sphinx.conf
index test1 {   source        = src1   path          = /var/lib/sphinx/test1   docinfo       = extern } 

Thành phần searchd chứa cổng và các biến khác để chạy trình Sphinx.

  • listen : Cổng mà Sphinx daemon sẽ chạy, theo sau là giao thức. Trong ví dụ của ta , đây là 9306: mysql41 . Các giao thức đã biết là : sphinx (SphinxAPI) và : mysql41 (SphinxQL)
  • query_log : Đường dẫn để lưu log truy vấn.
  • pid_file : Đường dẫn đến file PID của Sphinx daemon.
  • seamless_rotate : Ngăn chặn searchd quầy hàng trong khi quay chỉ với một lượng lớn dữ liệu để precache.
  • preopen_indexes : Có buộc mở trước tất cả các index khi khởi động hay không.
  • unlink_old : Có xóa các bản sao index cũ khi xoay vòng thành công hay không.
khối searchd cho sphinx.conf
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 đủ để copy paste ở bên dưới. Biến duy nhất bạn cần thay đổi bên dưới là biến sql_pass trong khối nguồn, được đánh dấu.

Tệp sphinx.conf đầy đủ
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/ } 

Để khám phá thêm các cấu hình, bạn có thể xem file /usr/share/doc/sphinx-2.2.11/sphinx.conf.dist , file này có tất cả các biến được giải thích chi tiết.

Bước 4 - Quản lý Chỉ mục

Trong bước này, ta sẽ thêm dữ liệu vào index Sphinx và đảm bảo index này 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 ta đã tạo trước đó.

  • sudo indexer --all

Bạn sẽ nhận được một cái gì đó giống như 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 production , cần phải cập nhật chỉ số. Để làm điều đó, hãy tạo một công việc Cron. Đầu tiên, mở crontab .

  • crontab -e

Công việc Cron sau sẽ chạy hàng 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à ta đã tạo trước đó. Copy paste nó vào cuối file , sau đó lưu file .

crontab
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all 

Bây giờ Sphinx đã được cài đặt và cấu hình đầy đủ, ta có thể bắt đầu dịch vụ và 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 xem trình Sphinx có đang chạy chính xác hay không, hãy chạy:

  • sudo systemctl status searchd

Bạn sẽ nhận được một cái gì đó giống như 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 tùy chỉnh hoàn toàn và đang chạy, vì vậy tiếp theo ta sẽ kiểm tra xem nó có hoạt động chính xác hay không.

Bước 6 - Kiểm tra chức năng tìm kiếm

Bây giờ mọi thứ đã được cài đặt , hãy kiểm tra chức năng tìm kiếm. Kết nối với SphinxQL bằng giao diện MySQL. Dấu nhắc 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 một cái gì đó giống như 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 kết quả trên, bạn có thể thấy rằng Sphinx đã tìm thấy 2 kết quả phù hợp từ index test1 cho câu kiểm tra của ta . SHOW META; lệnh cũng hiển thị số lần truy cập cho 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 một cái gì đó giống như 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)

Trong kết quả ở trên, bạn có thể thấy rằng trong index test1 , Sphinx đã tìm thấy:

  • 5 đối sánh trong 3 tài liệu cho từ khóa 'kiểm tra'
  • 2 đối sánh trong 1 tài liệu cho từ khóa 'một'
  • 0 đối sánh trong 0 tài liệu cho từ khóa 'ba'

Đến đây bạn đã thử nghiệm Sphinx, bạn có thể xóa database thử nghiệm với DROP DATABASE test; nếu bạn thích.

Khi bạn hoàn tất, hãy rời khỏi MySQL shell.

  • quit

Kết luận

Trong hướng dẫn này, ta đã chỉ cho bạn cách cài đặt Sphinx và thực hiện tìm kiếm đơn giản bằng SphinxQL và MySQL.

Bạn cũng có thể tìm thấy các triển khai SphinxAPI bản địa chính thức cho PHP, Perl, Python, Ruby và Java . Nếu bạn đang sử dụng Nodejs, bạn cũng có thể sử dụng gói SphinxAPI .

Bằng cách sử dụng Sphinx, bạn có thể dễ dàng thêm tìm kiếm tùy chỉnh vào trang web của bạn . Để biết thêm thông tin về cách sử dụng Sphinx, hãy truy cập trang web của dự án .


Tags:

Các tin liên quan

Cách cài đặt MEAN Stack với MEAN.JS trên CentOS 7
2016-09-09
Cách tạo người dùng Sudo trên CentOS [Quickstart]
2016-03-29
Cách cài đặt Graylog 1.x trên CentOS 7
2016-03-21
Cách cài đặt Puppet 4 trong Thiết lập Master-Agent trên CentOS 7
2016-03-08
Cách thiết lập Jenkins để tích hợp phát triển liên tục trên CentOS 7
2016-03-03
Cách thiết lập hệ thống bàn trợ giúp với OTRS trên CentOS 7
2016-03-02
Cách cài đặt ứng dụng khách Dropbox làm dịch vụ trên CentOS 7
2016-02-25
Cách thiết lập một cụm sản xuất Elasticsearch trên CentOS 7
2016-02-23
Cách bảo vệ SSH bằng Fail2Ban trên CentOS 7
2016-01-27
Cách bảo mật HAProxy bằng Let's Encrypt trên CentOS 7
2016-01-26