PHPackages                             joacub/sphinxsearch - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. joacub/sphinxsearch

ActiveLibrary[Search &amp; Filtering](/categories/search)

joacub/sphinxsearch
===================

Sphinx Search library provides SphinxQL indexing and searching features

0.7.0(11y ago)031BSD-2-ClausePHPPHP &gt;=5.3.3

Since Feb 1Pushed 9y ago1 watchersCompare

[ Source](https://github.com/joacub/sphinxsearch)[ Packagist](https://packagist.org/packages/joacub/sphinxsearch)[ Docs](https://github.com/ripaclub/sphinxsearch)[ RSS](/packages/joacub-sphinxsearch/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (7)Versions (12)Used By (0)

Sphinx Search [![Build Status](https://camo.githubusercontent.com/4d056c02e51d644921996291259d33815353b68f8cbb6b7c38e861f3fd9e45d9/68747470733a2f2f7472617669732d63692e6f72672f72697061636c75622f737068696e787365617263682e706e673f6272616e63683d6d6173746572)](https://travis-ci.org/ripaclub/sphinxsearch) [![Latest Stable Version](https://camo.githubusercontent.com/1a4f44769be95943089ac22cbb91e0757d1512680dcc379adc0a27096fb883cd/68747470733a2f2f706f7365722e707567782e6f72672f72697061636c75622f737068696e787365617263682f762f737461626c652e706e67)](https://packagist.org/packages/ripaclub/sphinxsearch) [![Code Coverage](https://camo.githubusercontent.com/ab7c0ba889cc10cfeaf49cc9b260963ddeac66da261cf8abecb5187ae7d27131/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f72697061636c75622f737068696e787365617263682f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/ripaclub/sphinxsearch/?branch=master) [![Scrutinizer Quality Score](https://camo.githubusercontent.com/fb8d222896f5c548a7232c13648a2b2c0dc40af221e06d7c82224e47d80a2d4c/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f72697061636c75622f737068696e787365617263682f6261646765732f7175616c6974792d73636f72652e706e673f733d65653566643365633235353662613434316463336361353938636565376562646234316461613363)](https://scrutinizer-ci.com/g/ripaclub/sphinxsearch/)
=====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

[](#sphinx-search-)

Sphinx Search library provides SphinxQL indexing and searching features.

- [Introduction](#introduction)
- [Installation](#installation)
- [Configuration (simple)](#configuration-simple)
- [Usage](#usage)
    - [Search](#search)
    - [Indexer](#indexer)
- [Advanced](#advanced)
    - [Adapter Service Factory](#adapter-service-factory)
    - [Prepared statement](#prepared-statement)
    - [Working with types](#working-with-types)
    - [SQL Objects](#sql-objects)
    - [Query expression](#query-expression)
- [Testing](#testing)
- [Code quality](#code-quality)

Introduction
------------

[](#introduction)

This Library aims to provide:

- A SphinxQL query builder based upon [Zend\\Db\\Sql](http://framework.zend.com/manual/2.2/en/modules/zend.db.sql.html)
- A simple `Search` class
- An `Indexer` class to work with RT indices
- Factories for SphinxQL connection through [Zend\\Db\\Adapter](http://framework.zend.com/manual/2.2/en/modules/zend.db.adapter.html)

###### Note

[](#note)

This library does not use `SphinxClient` PHP extension because everything available through the Sphinx API is also available via SphinxQL but not vice versa (i.e., writing to RT indicies is only available via SphinxQL).

Installation
------------

[](#installation)

Using [composer](http://getcomposer.org/):

Add the following to your `composer.json` file:

```
"require": {
	"php": ">=5.3.3",
	"ripaclub/sphinxsearch": "~0.6",
}
```

Alternately with git submodules:

```
git submodule add https://github.com/ripaclub/sphinxsearch.git ripaclub/sphinxsearch

```

Configuration (simple)
----------------------

[](#configuration-simple)

Register in the `ServiceManager` the provided factories through the `service_manager` configuration node:

```
'service_manager' => array(
	'factories' => array(
  		'SphinxSearch\Db\Adapter\Adapter' => 'SphinxSearch\Db\Adapter\AdapterServiceFactory',
	),
	// Optionally
	'aliases' => array(
		'sphinxql' => 'SphinxSearch\Db\Adapter\Adapter'
	),
)
```

Then in your configuration add the `sphinxql` node and configure it with connection parameters as in example:

```
'sphinxql' => array(
	'driver'    => 'pdo_mysql',
	'hostname'  => '127.0.0.1',
	'port'      => 9306,
	'charset'   => 'UTF8'
)
```

For more details see the "Adapter Service Factory" section.

Usage
-----

[](#usage)

### Search

[](#search)

Assuming `$adapter` has been retrivied via `ServiceManager`:

```
use SphinxSearch\Search;
use SphinxSearch\Db\Sql\Predicate\Match;

$search = new Search($adapter);
$rowset = $search->search('foo', new Match('?', 'ipsum dolor'));

echo 'Founds row:' . PHP_EOL;
foreach ($rowset as $row) {
	echo $row['id'] . PHP_EOL;
}
```

The `search()` method takes as first argument the index name (or an array of indicies) and the second one accepts a where condition (same as `Zend\Db\Sql\Select::where()`). Furthermore `search()` second argument can accept a closure, which in turn, will be passed the current `Select` object that is being used to build the `SELECT` query.

The following usage is possible:

```
use SphinxSearch\Search;
use SphinxSearch\Db\Sql\Select;
use SphinxSearch\Db\Sql\Predicate\Match;

$search = new Search($adapter);
$rowset = $search->search('foo', function(Select $select) {
	$select->where(new Match('?', 'ipsum dolor'))
	       ->where(array('c1 > ?' => 5))
               ->limit(1);
});
```

The `SphinxSearch\Db\Sql\Select` class (like [`Zend\Db\Sql\Select`](http://framework.zend.com/manual/2.2/en/modules/zend.db.sql.html#zend-db-sql-select) which we extend from) supports the following methods related to SQL standard clauses:

```
$select->from($table)
$select->columns(array $columns)
$select->where($predicate, $combination = Predicate\PredicateSet::OP_AND)
$select->group($group)
$select->having($predicate, $combination = Predicate\PredicateSet::OP_AND)
$select->order($order)
$select->limit($limit)
$select->offset($offset)
// And also variable overloading for:
$select->where
$select->having
```

Thus it adds some SphinxQL specific methods:

```
$select->withinGroupOrder($withinGroupOrder)
$select->option(array $values, $flag = self::OPTIONS_MERGE)
```

Other utility methods like `setSpecifications`, `getRawState` and `reset` are fully supported.

Instead `quantifier`, `join` and `combine` are just ignored because SphinxQL syntax doesn't have them.

### Indexer

[](#indexer)

Assuming `$adapter` has been retrivied via `ServiceManager` we can perform indexing of documents, provided that the indices on which we act are [real time](http://sphinxsearch.com/docs/2.2.2/rt-overview.html).

```
use SphinxSearch\Indexer;

$indexer = new Indexer($adapter);
$indexer->insert(
	'foo',
	array(
		'id' => 1,
		'short' => 'Lorem ipsum dolor sit amet',
		'text' => 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit ...'
	),
	true
);
```

Note that third parameter of `insert` method is a boolean flag indicating wheter a *"upsert"* rather than an insert have to be done.

Furthermore, an `Indexer` instance allows to update and delete rows from real time indices (using the methods `update` and `delete`, respectively).

Advanced
--------

[](#advanced)

### Adapter Service Factory

[](#adapter-service-factory)

This library come with two factories in bundle in order to properly configure the `Zend\Db\Adapter\Adapter` to work with Sphinx Search.

Use `SphinxSearch\Db\Adapter\AdapterServiceFactory` (see [Configuration](#configuration-simple) section above) for a single connection else if you need to use multiple connections use the shipped `SphinxSearch\Db\Adapter\AdapterAbstractServiceFactory` registering it in the `ServiceManager` as below:

```
'service_manager' => array(
	'abstract_factories' => array(
  		'SphinxSearch\Db\Adapter\AdapterAbstractServiceFactory'
	),
)
```

For the abstract factory configuration refer to [Zend Db Adpater Abstract Factory documentation](http://framework.zend.com/manual/2.2/en/modules/zend.mvc.services.html#zend-db-adapter-adapterabstractservicefactory).

Only two drivers are supported:

- `PDO_MySQL`
- `Mysqli`

### Prepared statement

[](#prepared-statement)

SphinxQL does not support prepared statement, but [PDO drivers are able to emulate prepared statement client side](http://it1.php.net/manual/en/pdo.prepared-statements.php). To achive prepared query benefits this library fully supports this feature.

###### Note

[](#note-1)

The PDO driver supports prepared and non-prepared queries. The `Mysqli` driver does not support prepared queries.

For both `SphinxSearch\Search` and `SphinxSearch\Indexer` you can choose the working mode via `setQueryMode()` using one of the following flags:

```
const QUERY_MODE_PREPARED   = 'prepared'; // use prepared statement
const QUERY_MODE_EXECUTE    = 'execute';  // do not use prepared statement
const QUERY_MODE_AUTO       = 'auto';     // auto detect best available option (prepared mode preferred)
```

With the `auto` option the component will use the best execution mode available, prefering prepared mode if supported by the driver.

### Working with types

[](#working-with-types)

This library aims to normalize API usage among supported drivers and modes, but due to SphinxQL limitations there are some considerations:

- `NULL`

    Not supported by SphinxQL. The library transparently handle it for SQL compatibility: an exception will be thrown by the driver if you try to use a value = `NULL`.
- `boolean`

    SphinxQL does not have a native boolean type but if you try to use a PHP `bool` the library and the driver will cast the value to `0` or `1` respectively.
- `integer`

    PHP native integers work properly when SphinxQL expects an `uint`. Note that strings containing integers do not work in filters (i.e. `WHERE` clause).
    *WARNING: PHP integers are signed, instead SphinxQL supports only UNSIGNED integers and UNIX timestamp.*
- `float`

    Due to SphinxQL specific issues related to `float` values (especially in `WHERE` clause), by default them are converted to a 32-bit-single-precision compatible string rappresentation which are then included into the SQL query as literals, even in the case where prepared statements are used.

    This feature works only if value is a native PHP `float` (anyway strings containing floats do not work within Sphinx). If it is needed, this behaviour can be globally disabled using `$adapter->getPlatform()->enableFloatConversion(false)`.

    *WARNING: disabling float conversion feature can produce unexpected behaviors, some notable examples:*

    - Actually Sphinx SQL interpreter treats a number without decimal part as an integer. So, assumming `f1` as float column, if you try `WHERE f1 = 10` you will get `42000 - 1064 - index foo: unsupported filter type 'intvalues' on float column` else if you try `WHERE f1 = 10.0` it will work fine.
    - Due to the fact that SphinxQL does not support float quoted as strings and PDO driver has no way to bind a double (SQL float) parameter in prepared statement mode, PDO driver will just cast to string producing a locale aware conversion (same as PHP `echo`), so it will work only if `LC_NUMERIC` setting is compliant with point as separator in decimal notation (for example you can use `LC_NUMERIC='C'`)

For those reasons we suggest to **always use proper PHP native types** (i.e., not use strings for numeric fields) when building queries.

Useful link: [Sphinx Attributes Docs](http://sphinxsearch.com/docs/current.html#attributes).

### SQL Objects

[](#sql-objects)

As [Zend\\Db\\Sql](http://framework.zend.com/manual/2.2/en/modules/zend.db.sql.html) this library provides a set of SQL objects:

- `SphinxSearch\Db\Sql\Select` explained in [Search](#search) paragraph
- `SphinxSearch\Db\Sql\Insert`
- `SphinxSearch\Db\Sql\Replace` same as insert, but overwrites duplicate IDs
- `SphinxSearch\Db\Sql\Update` with the ability to handle `OPTION` clause
- `SphinxSearch\Db\Sql\Delete`
- `SphinxSearch\Db\Sql\Show`

Each of them can be retrivied by `SphinxSearch\Db\Sql\Sql` class methods:

```
use SphinxSearch\Db\Sql\Sql;

$sql = new Sql($adapter);
$select = $sql->select();  	// @return SphinxSearch\Db\Sql\Select
$insert = $sql->insert();   // @return SphinxSearch\Db\Sql\Insert
$insert = $sql->replace();	// @return SphinxSearch\Db\Sql\Replace
$update = $sql->update(); 	// @return SphinxSearch\Db\Sql\Update
$delete = $sql->delete();  	// @return SphinxSearch\Db\Sql\Delete
$show   = $sql->show(); 	// @return SphinxSearch\Db\Sql\Show
```

Or can be instanziated directly like in the following example:

```
use SphinxSearch\Db\Sql\Update;
use SphinxSearch\Db\Sql\Predicate\Match;

$update = new Update;
$update->from('myindex')
       ->set(array('bigattr' => 1000, 'fattr' => 3465.23))
       ->where(new Match('?', 'hehe'))
       ->where(array('enabled' => 1))
       ->option('strict', 1);
```

Then you can perform your query by:

```
$statement = $sql->prepareStatementForSqlObject($select);
$results = $statement->execute();
```

Or using the `Search` or the `Indexer` components:

```
$resultset = $indexer->updateWith($update);
```

Thus, every object (that has `where()`) supports the `Match` expression, as explained in next paragrah.

### Query expression

[](#query-expression)

The `SphinxSearch\Query\QueryExpression` class provides a placeholder expression way and a string excape mechanism in order to use safely the [Sphinx query syntax](http://sphinxsearch.com/docs/2.2.2/extended-syntax.html). Also, the component design permits to use it standalone, since it has no dependencies on other library's components.

Some examples:

```
use SphinxSearch\Query\QueryExpression;

$query = new QueryExpression('@title ? @body ?', array('hello', 'world'));
echo $query->toString(); //outputs: @title hello @body world

echo $query->setExpression('"?"/3')
           ->setParameters(array('the world is a wonderful place, but sometimes people uses spe(ia| ch@rs'))
           ->toString(); //outputs: "the world is a wonderful place, but sometimes people uses spe\(ia\| ch\@rs"/3

echo $query->setExpression('? NEAR/? ? NEAR/? "?"')
           ->setParameters(array('hello', 3, 'world', 4, '"my test"'))
           ->toString(); //outputs: hello NEAR/3 world NEAR/4 "my test"
```

The `SphinxSearch\Db\Sql\Predicate\Match` class uses internally the `QueryExpression`, so you can use it in your SQL queries directly:

```
use SphinxSearch\Adapter\Platform\SphinxQL;
use SphinxSearch\Db\Sql\Select;
use SphinxSearch\Db\Sql\Predicate\Match;

$select = new Select;
$select->from('myindex')
       ->where(new Match('? NEAR/? ? NEAR/? "?"', array('hello', 3, 'world', 4, '"my test"')))
       ->where(array('enabled' => 1));

//outputs: SELECT * from `foo` WHERE MATCH('hello NEAR/3 world NEAR/4 "my test"') AND `enabled` = 1
echo $select->getSqlString(new SphinxQL());
```

Testing
-------

[](#testing)

The library source code (**on master**) is 100% covered by unit tests.

Once installed development dependencies through composer you can run `phpunit`.

```
./vendor/bin/phpunit -c tests/

```

Code quality
------------

[](#code-quality)

Run [phpmd](https://github.com/phpmd/phpmd).

```
./vendor/bin/phpmd library/ text phpmd.xml.dist

```

Run [phpcs](https://github.com/squizlabs/PHP_CodeSniffer).

```
./vendor/bin/phpcs --standard=PSR2 library/

```

Run [pdepend](https://github.com/pdepend/pdepend).

```
./vendor/bin/pdepend --exclude=tests,vendor --summary-xml=pdepend.log library/

```

---

[![Analytics](https://camo.githubusercontent.com/844f2ca37ac01680db1ee8742b0252c741215b1c3a6050f06f24bae51fc9ac68/68747470733a2f2f67612d626561636f6e2e61707073706f742e636f6d2f55412d34393635353832392d312f72697061636c75622f737068696e78736561726368)](https://github.com/igrigorik/ga-beacon)

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity55

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 52.8% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~26 days

Recently: every ~55 days

Total

10

Last Release

4248d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/8c5ea80353eb117dbabb0def7d2a43079815acee0d55f690a6476c03e458c203?d=identicon)[joacub](/maintainers/joacub)

---

Top Contributors

[![leodido](https://avatars.githubusercontent.com/u/120051?v=4)](https://github.com/leodido "leodido (242 commits)")[![leogr](https://avatars.githubusercontent.com/u/3390997?v=4)](https://github.com/leogr "leogr (198 commits)")[![joacub](https://avatars.githubusercontent.com/u/2091228?v=4)](https://github.com/joacub "joacub (8 commits)")[![pruno](https://avatars.githubusercontent.com/u/1735022?v=4)](https://github.com/pruno "pruno (6 commits)")[![fntlnz](https://avatars.githubusercontent.com/u/3083633?v=4)](https://github.com/fntlnz "fntlnz (4 commits)")

---

Tags

searchzf2query buildersphinxqlsphinxindexingsearch engine

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/joacub-sphinxsearch/health.svg)

```
[![Health](https://phpackages.com/badges/joacub-sphinxsearch/health.svg)](https://phpackages.com/packages/joacub-sphinxsearch)
```

###  Alternatives

[ripaclub/sphinxsearch

Sphinx Search library provides SphinxQL indexing and searching features

6232.2k3](/packages/ripaclub-sphinxsearch)[foolz/sphinxql-query-builder

A PHP query builder for SphinxQL and ManticoreQL with MySQLi and PDO drivers.

3232.2M32](/packages/foolz-sphinxql-query-builder)[nilportugues/sphinx-search

Fully unit tested SphinxClient (SphinxAPI) for PHP5.3 and above to be used with SphinxSearch

18452.9k2](/packages/nilportugues-sphinx-search)[javer/sphinx-bundle

Provides integration of Sphinx search engine with Symfony using SphinxQL

24185.4k](/packages/javer-sphinx-bundle)[opensearchserver/opensearchserver

PHP library for OpenSearchServer: professionnal search engine, crawlers (web, file, database), REST APIs, .... This library uses OpenSearchServer's V2 API.

5267.5k](/packages/opensearchserver-opensearchserver)[ymigval/laravel-indexnow

Laravel Service Library for notifying search engines about the latest content changes on their URLs using IndexNow.

3410.2k](/packages/ymigval-laravel-indexnow)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
