pimcore / search-query-parser
将简化的类似 SQL 的查询字符串解析成语法树,可用于构建搜索查询
v1.3.1
2021-05-26 09:55 UTC
Requires
- php: >=7.0
- nikic/phlexy: ^0.1.0
Requires (Dev)
- phpunit/phpunit: ^6.1
- symfony/var-dumper: ^3.2
Suggests
- pimcore/pimcore: If using it in combination with Pimcore and CMF
- zendframework/zendframework1: If using the Zend_Db query builder
README
这是一个基本的搜索查询解析库,可用于将自由文本搜索转换为 SQL(或其他)查询。分析后的搜索查询可用于构建复杂的(SQL)查询,在多个字段中搜索一个术语。请参阅 Zend_Db
端到端测试 示例或查看 examples/ 中的实际示例。
语法
搜索词可以结合 AND/OR,取反,用括号分组,并使用以下语法修改为模糊精确搜索
foo
foo* AND bar
*foo* OR *bar*
*foo* OR !*bar*
*foo* AND bar
foo OR (bar AND baz)
修饰符
模糊搜索: *<term>*
取反: !<term> !(<query>) !*<fuzzy-term>
使用方法
<?php require_once __DIR__ . '/../vendor/autoload.php'; $input = 'doe AND 1212 AND !foo OR (!(am*ya AND 12) blah) OR baz'; // complex query $input = '*john* !502* AND foobar'; // LIKE %john% AND NOT LIKE 502% AND = foobar // tokenizes query string $lexer = new \SearchQueryParser\Lexer(); // contains array of extracted tokens $tokens = $lexer->lex($input); dump($tokens); // parses tokens into an abstract query $parser = new \SearchQueryParser\Parser(); $query = $parser->parse($tokens); dump($query); // use the Zend_Db query builder to transform the Query into conditions $db = new Zend_Db_Adapter_Pdo_Sqlite(array( 'dbname' => ':memory:' )); // dummy query $select = $db ->select() ->from('foo'); // build conditions for every passed field $queryBuilder = new \SearchQueryParser\QueryBuilder\ZendDbSelect([ 'foo', 'bar' ]); $queryBuilder->processQuery($select, $query); dump($select->__toString());
使用外观类
如果您想使用标准词法分析器/解析器,有一个外观类可以调用。
<?php require_once __DIR__ . '/../vendor/autoload.php'; $input = 'foo !bar *doe*'; // returns an abstract query dump(\SearchQueryParser\SearchQueryParser::parseQuery($input));
测试
有几个简单的端到端测试检查定义的输入的输出。只需从项目根目录运行 vendor/bin/phpunit
。