zk2 / human-to-tsquery
Convert human request to postgres ts_query
Installs: 3 505
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 1
Forks: 1
Open Issues: 0
Requires
- php: ^7.4|^8
Requires (Dev)
- ext-curl: *
- ext-pdo: *
- ext-pdo_pgsql: *
- 1happyplace/phpunit-colors: ^1.1
- doctrine/dbal: ^2.10
- elasticsearch/elasticsearch: ^8.8
- phpunit/phpunit: ^8.5
- symfony/var-dumper: ^5.0
README
Human query to ts_query for PostgreSQL full text search (https://www.postgresql.org/docs/12/textsearch.html). Provides a clement parser and associated tools for a convert human query to query which can be used ih Postgres Full Text Search. Lenient in that is will produce a parse tree for any input, given a default operator and by generally ignoring any unparsable syntax.
The query language supports the following features at a high level:
-
Boolean operators: AND (infix), OR (infix), "-" (prefix) with an implied default operator and precedence rules, e.g. "boy OR girl -infant"
-
Proximity Near Operator (Nx) -
television N2 violence
- Finds words within x number of words from each other, regardless of the order in which they occur. -
Proximity Within Operator (Wx) -
Franklin W2 Roosevelt
- Finds words within x number of words from each other, in the order they are entered in the search. -
Optional parenthesis for explicitly denoting precedence.
-
Quoted phrases (for proximity matching)
Documentation
// Some function, which getting SQL query and return single string result
$closure = function (string $sql) use ($connection) {
return $connection->fetchOne($sql);
};
$humanToTsQuery = new HumanToTsQuery('Opel AND (auto car (patrol OR diesel OR "electric car") AND -sale)');
$tsQuery = $humanToTsQuery->getQuery($closure);
var_dump($tsQuery); // "opel & (auto & car & (patrol | diesel | (electr <-> car)) & !sale)"
$humanToTsQuery = new HumanToTsQuery('indigenous N2 ("debt financing" OR lalala) AND ("New York" OR Boston)');
$tsQuery = $humanToTsQuery->getQuery($closure);
var_dump($tsQuery); // "(indigen <2> ((debt <-> financ) | lalala ) | ((debt <-> financ) | lalala ) <2> indigen | indigen <1> ((debt <-> financ) | lalala ) | ((debt <-> financ) | lalala ) <1> indigen) & ((new <-> york) | boston )"
$humanToTsQuery = new HumanToTsQuery('(indigenous OR texas) W2 ("debt financing" OR lalala) AND ("New York" OR Boston)');
$tsQuery = $humanToTsQuery->getQuery($closure);
var_dump($tsQuery); // "((indigen | texa ) <2> ((debt <-> financ) | lalala ) | (indigen | texa ) <1> ((debt <-> financ) | lalala )) & ((new <-> york) | boston )"
Running the Tests
Install the Composer dev
dependencies:
composer install --dev
Then, run the test suite using PHPUnit:
vendor/bin/phpunit
License
This bundle is released under the MIT license. See the complete license in the bundle:
LICENSE