Bài 3: Cấu hình và sử dụng sphinx cơ bản

Chúng ta cùng cấu hình và tiến hành chạy thử Sphinx lần đầu tiên nào!

Đầu tiên ta sẽ cấu hình hệ thống searchd của sphinx:
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
    workers                = threads 
    binlog_path            = /var/lib/sphinx
}

Với cấu hình này, khi sử dụng chúng ta sẽ kết nối với Sphinx thông qua cổng 9306 và dưới extension mysql41 (kết nối giống hệt như với MYSQL nên rất tiện)

Cấu trúc của một hệ thống tìm kiếm của sphinx bao gồm:
  • Source: Tức nguồn dữ liệu, thông thường là MYSQL, phần này sẽ bao gồm những lệnh kết nối tới MYSQL và câu lệnh để xuất dữ liệu ra.
  • Index: Cấu hình cách Index các dữ liệu từ Source.
Cấu hình 1 source:
source tên_source
{
     type             = mysql
     sql_host         = MYSQL_HOST
     sql_user         = MYSQL_USER
     sql_pass         = PASSWORD
     sql_db           = MYSQL_DATABASE
     sql_port         = 3306
     sql_query_pre    = SET CHARACTER_SET_RESULTS=utf8
     sql_query_pre    = SET NAMES utf8
     sql_query        = SELECT id, col1, col2, col3, col4, col5 FROM table
     sql_field_string = col1
     sql_attr_string  = col2
     sql_attr_uint    = col3
     sql_attr_float   = col4
     sql_attr_timestamp = col5
}

Các thuộc tính:

  • sql_query_pre: Các câu lệnh được thực hiện trước khi chạy câu lệnh lấy dữ liệu chính (sql_query).
  • sql_query: Câu lệnh chính lấy dữ liệu (lưu ý phải có cột ID).
  • sql_field_*: Là những cột dữ liệu vừa dùng để index search, vừa dùng lưu dữ liệu.
  • sql_attr_*: Là những cột dữ liệu chỉ lưu lại, không index

Các kiểu dữ liệu trong sphinx:

  • string: Kiểu chuỗi
  • uint: Kiểu số nguyên
  • float: Kiểu số thực
  • timestamp: Kiểu thời gian

Lưu ý: Các cột dữ liệu được sử dụng dưới sql_feild_*sql_attr_* phải có trong kết quả từ câu lệnh chính sql_query.

Cấu hình 1 index:
index tên_index
{
    source             = tên_source
    path               = /var/lib/sphinx/file
    docinfo            = extern
    min_word_len       = 1
    min_prefix_len     = 0
    charset_table      = CHARSERT_TABLE
}

Các thuộc tính:

  • source: Tên sourrce mà bạn đã cấu hình.
  • path: Đường dẫn lưu file index.
  • min_word_len: Dộ dài nhỏ nhất một đơn vị index.
  • charset_table: Các bảng mã để index đúng, tôi khuyên dùng bảng mã sau: https://yabeow.com/content/images/sphinx_charset.txt
Chạy thử:
  • Trước hết cho sphinx reindex lại: indexer --rotate tên_index (reindex 1 index cụ thể) hoặc indexer --rotate all (reindex lại toàn bộ)
  • Sau đó tiến hành kết nối đến sphinx bằng các ứng dụng web (PHPMyAdmin, PHP, ASP, Adminer,...) giống hệt như kết nối với MYSQL. Ví dụ thử chạy bằng PHP:

    <?php
       $term = "phần mềm";
       $sphinx = new mysqli("127.0.0.1", "", "", "", 9306);
       $query  = "SELECT * FROM tên_index WHERE MATCH('\"$term\"/1')";
       $data =  $sphinx->query($query);
       $data = $data->fetch_all;
       print_r($data);
    ?>
    
  • Nếu trên màn hình xuất hiện một đống rối rắm, thì bạn đã thành công rồi đấy. Tiếp tục nghiên cứu chuyên sâu về 1 câu lệnh trong Sphinx nào!

Một lệnh truy vấn (Query) trong Sphinx có dạng:
SELECT 
 các_cột [col1, col2, select_expr,...] 
 FROM tên_index [index1, index2,...]  
 WHERE điều_kiện [MATCH(term), somecol = somevalue,...] 
 ORDER BY [somecol, expr,... ASC|DESC] 
 LIMIT [OFFSET, ROWCOUNT] 
 OPTION opt_name = opt_value
  • Phần OPTION có những giá trị hay dùng sau:
    • maxmatches: Số kết quả tối đa cho mỗi câu lệnh.
    • maxquerytime: Thời gian tìm kiếm tối đa (ms).
    • ranker: Các chế độ để xếp hạng các kết quả tìm kiếm: 'proximitybm25', 'bm25', 'none', 'wordcount', 'proximity', 'matchany', 'fieldmask', 'sph04', 'expr', hoặc 'export'.

Như vậy là xong rồi đấy. bạn chỉ cần xây dựng câu truy vấn Sphinx (Query) cho phù hợp với mục đích tìm kiếm của mình và sử dụng nó như mysql cho ứng dụng của mình là xong!

Dây rút nhựa tp hcm