macfja / redisearch
RediSearch 的 PHP 客户端
2.2.0
2022-08-13 22:10 UTC
Requires
- php: ^7.2 || ^8.0
- ext-intl: *
- composer/semver: ^3.2
- respect/validation: ^2.0
Requires (Dev)
- ext-mbstring: *
- amphp/redis: ^1.0
- cheprasov/php-redis-client: ^1.10
- colinmollenhour/credis: ^1.12
- enlightn/security-checker: ^1.9
- ergebnis/composer-normalize: ^2.13
- friendsofphp/php-cs-fixer: ^3.0
- geometria-lab/rediska: ^0.5.10
- insolita/unused-scanner: ^2.3
- php-parallel-lint/php-parallel-lint: ^1.3
- phpmd/phpmd: ^2.10
- phpstan/phpstan: ^1.2.0
- phpunit/phpunit: ^8.5 || ^9.3
- predis/predis: ^1.1 || ^2.0
- ptrofimov/tinyredisclient: ^1.1
- redisent/redisent: dev-master
- roave/security-advisories: dev-latest
- rskuipers/php-assumptions: ^0.8.0
- sebastian/phpcpd: ^4.1 || ^6.0
- ukko/phpredis-phpdoc: dev-master
- vimeo/psalm: ^4.7
Suggests
- ext-phpiredis: To use Phpiredis extension implementation
- ext-redis: To use Phpredis extension implementation
- amphp/redis: To use AmpPhp implementation
- cheprasov/php-redis-client: To use Cheprasov implementation
- colinmollenhour/credis: To use Credis implementation
- geometria-lab/rediska: To use Rediska implementation
- predis/predis: To use Predis implementation
- ptrofimov/tinyredisclient: To use TinyRedisClient implementation
- redisent/redisent: To use Redisent implementation
README
MacFJA/redisearch 是 RediSearch 的 PHP 客户端。
实现的 API 用于 RediSearch 2.x
安装
composer require macfja/redisearch
使用
获取 Redis 客户端
此库可以使用多个 Redis 连接器
- Predis - 纯 PHP 实现
- Phpredis - PHP 扩展
- Phpiredis - 依赖于 hiredis 的 PHP 扩展
- Amp\Redis - 纯 PHP 异步实现
- cheprasov/php-redis-client - 纯 PHP 实现
- Credis - 纯 PHP 实现
- Rediska - 纯 PHP 实现
- Redisent - 纯 PHP 实现
- TinyRedis - 纯 PHP 实现
您可以根据需要选择连接器。
$clientFacade = new \MacFJA\RediSearch\Redis\Client\ClientFacade(); // With Predis $client = $clientFacade->getClient(new \Predis\Client(/* ... */)); // With Phpredis extension $client = $clientFacade->getClient(new \Redis([/* ... */])); // With Phpiredis extension $client = $clientFacade->getClient(phpiredis_connect($host)); // With Amp\Redis $client = $clientFacade->getClient(new \Amp\Redis\Redis(new RemoteExecutor(Config::fromUri(/* ... */)))); // With Cheprasov $client = $clientFacade->getClient(new \RedisClient\Client\Version\RedisClient6x0([/* ... */])); // With Rediska $client = $clientFacade->getClient(new \Rediska(['servers' => [[/* ... */]]])); // With Redisent $client = $clientFacade->getClient(new \redisent\Redis(/* ... */)); // With TinyRedisClient $client = $clientFacade->getClient(new \TinyRedisClient(/* ... */)); // With Credis $client = $clientFacade->getClient(new \Credis_Client(/* ... */));
您也可以添加自己的实现,您只需实现接口 \MacFJA\RediSearch\Redis\Client
并将其添加到客户端接口即可。
$clientFacade = new \MacFJA\RediSearch\Redis\Client\ClientFacade(); $clientFacade->addFactory(\MyVendor\MyPackage\MyRedisClient::class);
创建新的索引
$client = /* ... */; $builder = new \MacFJA\RediSearch\IndexBuilder(); // Field can be created in advance $address = (new \MacFJA\RediSearch\Redis\Command\CreateCommand\GeoFieldOption()) ->setField('address'); $builder ->setIndex('person') ->addField($address) // Or field can be created "inline" ->addTextField('lastname', false, null, null, true) ->addTextField('firstname') ->addNumericField('age') ->create($client);
构建器也可以用 withXxx
和 withAddedXxx
代替 setXxx
和 addXxx
使用。这将为您提供一个具有配置数据的新的构建器实例。
添加文档
$client = /* ... */; $index = new \MacFJA\RediSearch\Index('person', $client); $index->addDocumentFromArray([ 'firstname' => 'Joe', 'lastname' => 'Doe', 'age' => 30, 'address' => '-74.044502,40.689247' ]);
搜索
$client = /* ... */; $search = new \MacFJA\RediSearch\Redis\Command\Search(); $search ->setIndex('person') ->setQuery('Doe') ->setHighlight(['lastname']) ->setWithScores(); $results = $client->execute($search);
创建搜索查询
use MacFJA\RediSearch\Query\Builder\GeoFacet; use MacFJA\RediSearch\Query\Builder\Negation; use MacFJA\RediSearch\Query\Builder\NumericFacet; use MacFJA\RediSearch\Query\Builder\Optional; use MacFJA\RediSearch\Query\Builder\Word; use MacFJA\RediSearch\Redis\Command\SearchCommand\GeoFilterOption; $queryBuilder = new \MacFJA\RediSearch\Query\Builder(); $query = $queryBuilder ->addElement(NumericFacet::greaterThan('age', 17)) ->addString('Doe') ->addElement( new Negation( new GeoFacet(['address'], -74.044502, 40.589247, 40, GeoFilterOption::UNIT_KILOMETERS) ) ) ->addElement(new Optional(new Word('John'))) ->render(); // The value of $query is: // @age:[(17 +inf] Doe -@address:[-74.044502 40.589247 40.000000 km] ~John
管道
use MacFJA\RediSearch\Redis\Command\Aggregate; use MacFJA\RediSearch\Redis\Command\AggregateCommand\GroupByOption; use MacFJA\RediSearch\Redis\Command\AggregateCommand\ReduceOption; use MacFJA\RediSearch\Redis\Command\Search; use MacFJA\RediSearch\Redis\Command\SugGet; $client = /* ... */; $query = '@age:[(17 +inf] %john%'; $search = new Search(); $search->setIndex('people') ->setQuery($query); $stats = new Aggregate(); $stats->setIndex('people') ->setQuery($query) ->addGroupBy(new GroupByOption([], [ ReduceOption::average('age', 'avg'), ReduceOption::maximum('age', 'oldest') ])); $aggregate = new Aggregate(); $aggregate->setIndex('people') ->setQuery($query) ->addGroupBy(new GroupByOption(['lastname'], [ReduceOption::count('count')])); $suggestion = new SugGet(); $suggestion->setDictionary('names') ->setPrefix('john') ->setFuzzy(); $result = $client->pipeline($search, $stats, $aggregate, $suggestion); // $result[0] is the search result // $result[1] is the first aggregation result // $result[2] is the second aggregation result // $result[3] is the suggestion result
使用 Predis (v1.x) 简化语法
$client = new \Predis\Client(/* ... */); \MacFJA\RediSearch\Redis\Initializer::registerCommandsPredis($client->getProfile()); $client->ftsearch('people', '@age:[(17 +inf] %john%'); // But you will have raw Redis output.
使用 Rediska 简化语法
$client = new \Rediska(/* ... */); \MacFJA\RediSearch\Redis\Initializer::registerCommandsRediska(); $client->ftsearch('people', '@age:[(17 +inf] %john%'); // But you will have raw Redis output.
类似项目
- ethanhann/redisearch-php - 已废弃
- front/redisearch -
ethanhann/redisearch-php
的部分分支 - ashokgit/redisearch-php -
ethanhann/redisearch-php
的分支
贡献
您可以为库做出贡献。为此,您可以使用 Github 的问题
- 提出您的问题
- 请求任何更改(错别字、糟糕的代码、新功能等。)
- 等等...
您还可以通过 PR
- 建议更正
- 建议新功能
- 等等...
有关更多信息,请参阅 CONTRIBUTING。
许可证
MIT 许可证(MIT)。请参阅 许可证文件 获取更多信息。