Sphinx is a powerful documentation generator that has many great features for writing technical documentation

 

Sphinx 3

Sphinx is a free, dual-licensed search server. Sphinx is written in C++, and focuses on query performance and search relevance.

The primary client API is currently SphinxQL, a dialect of SQL. Almost any MySQL connector should work. Additionally, basic HTTP/JSON API and native APIs for a number of languages (PHP, Python, Ruby, C, Java) are provided.

This document is an effort to build a better documentation for Sphinx v.3.x and up. Think of it as a book or a tutorial which you could actually read; think of the previous “reference manual” as of a “dictionary” where you look up specific syntax features. The two might (and should) eventually converge.

 

Getting started on Linux (and MacOS)

Versions and file names will vary, and you most likely will want to configure Sphinx at least a little, but for an immediate quickstart:

$ wget -q http://sphinxsearch.com/files/sphinx-3.3.1-b72d67b-linux-amd64.tar.gz
$ tar zxf sphinx-3.3.1-b72d67b-linux-amd64.tar.gz
$ cd sphinx-3.3.1-b72d67b-linux-amd64/bin
$ ./searchd
Sphinx 3.3.1 (commit b72d67b)
Copyright (c) 2001-2020, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)

listening on all interfaces, port=9312
listening on all interfaces, port=9306
WARNING: No extra index definitions found in data folder
$

That’s it; the daemon should now be running and accepting connections on port 9306. And you can connect to it using MySQL CLI (see below for more details, or just try mysql -P9306 right away).

 

Running queries via MySQL shell

mysql -h 127.0.0.1 -P 9306
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 3.3.1 (commit b72d67b) 

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

 

Configuration

This extension interacts with Sphinx search daemon using MySQL protocol and SphinxQL query language. In order to setup Sphinx “searchd” to support MySQL protocol following configuration should be added:

create a sphinx.conf like this:

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source base
{
    type            = mysql

    sql_host        = sql_host
    sql_user        = sql_user
    sql_pass        = sql_pass
    sql_port        = 3306  # optional, default is 3306
}

source source_test : base
{
    sql_db          = test
    sql_query_pre = SET NAMES utf8
    sql_query       = \
        SELECT t.id, t.status, UNIX_TIMESTAMP(t.date) as date, t.subject, t.content \
        FROM tb_test t

    # attr
    sql_attr_uint       = status
    sql_attr_bigint     = date

    # fields
    sql_field_string    = subject
    sql_field_string    = content
}

index idx_test
{
    source          = source_test
    path            = ./sphinxdata/indexes/idx_test
    # Strip html
    html_strip      = 1
    # Supoort CJK (Chinese, Japanese, Korean)
    ngram_len       = 1
    ngram_chars     = U+3000..U+2FA1F
}

indexer
{
    mem_limit       = 128M
}

searchd
{
    listen          = 127.0.0.1:9312
    listen          = 127.0.0.1:9306:mysql41
    log             = ./sphinxdata/logs/searchd.log
    query_log       = ./sphinxdata/logs/query.log
    read_timeout    = 5
    max_children    = 30
    pid_file        = ./sphinxdata/searchd.pid
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old      = 1
    workers         = threads # for RT to work
    binlog_path     = ./sphinxdata/binlogs
}

 

Start searchd with configuration

by default searchd load sphinx.conf in current directory, you can speficy config file by using -c or –config

# Start searchd
./searchd --config /path/to/sphinx.conf

# Using indexer
./indexer --all --rotate

 

Sphinx Extension for Yii 2

The preferred way to install this extension is through composer.

Either run

php composer.phar require --prefer-dist yiisoft/yii2-sphinx

or add

"yiisoft/yii2-sphinx": "~2.0.0"

To use this extension, simply add the following code in your application configuration:

return [
    //....
    'components' => [
        'sphinx' => [
            'class' => 'yii\sphinx\Connection',
            'dsn' => 'mysql:host=127.0.0.1;port=9306;',
            'username' => '',
            'password' => '',
              'charset' => 'utf8mb4',
            'tablePrefix' => 'idx_',
        ],
    ],
];

Search by sphinx

<?php
use yii\sphinx\Query as SphinxQuery;

public function actionSearch() {
    $q = 'test';
    $st = time() * 1000;
    $results = (new SphinxQuery())
        ->select('*')
        ->from('{{%test}}')
        ->match(
            (new MatchExpression())
                ->match(['subject' => $q])
                ->orMatch(['content' => $q])
        )
        ->facets([
            'subject',
            'content',
        ])
        ->search();

    print_r($results);
}
?>

 

Search engines comparison
  Sphinx Solr Elasticsearch Xapian
Indexing speed (Mb/s) 4.5 2.75 3.8 1.36
Search speed (ms) 7/75 25/212 10/212 14/135
Index size (%) 30 20 20 200
Realization Server Server Library Library
Interface API, SQL Web-service API API
Search operators Boolean, prefix search, exact phrase, words near, ranges, word order, zones Boolean, prefix search (+ wildcards), exact phrase, words near, ranges, approximate search Boolean, prefix search (+ wildcards), exact phrase, words near, ranges, approximate search Boolean, prefix search, exact phrase, words near, ranges, approximate search

Table 1 – Search engines comparison

El fin!