示例 - 索引和查询JSON文档
学习如何使用Redis查询引擎与JSON
此示例展示了如何使用predis
来索引和查询Redis JSON数据。
确保你已经安装了Redis Stack和predis
,如上文安装部分所述。
首先导入依赖项:
<?php
require 'vendor/autoload.php';
use Predis\Client as PredisClient;
use Predis\Command\Argument\Search\AggregateArguments;
use Predis\Command\Argument\Search\CreateArguments;
use Predis\Command\Argument\Search\SearchArguments;
use Predis\Command\Argument\Search\SchemaFields\NumericField;
use Predis\Command\Argument\Search\SchemaFields\TextField;
use Predis\Command\Argument\Search\SchemaFields\TagField;
use Predis\Command\Argument\Search\SchemaFields\VectorField;
连接到Redis服务器:
$r = new PredisClient([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'database' => 0,
]);
创建一些测试数据以添加到数据库中:
$user1 = json_encode([
'name' => 'Paul John',
'email' => 'paul.john@example.com',
'age' => 42,
'city' => 'London',
], JSON_THROW_ON_ERROR);
$user2 = json_encode([
'name' => 'Eden Zamir',
'email' => 'eden.zamir@example.com',
'age' => 29,
'city' => 'Tel Aviv',
], JSON_THROW_ON_ERROR);
$user3 = json_encode([
'name' => 'Paul Zamir',
'email' => 'paul.zamir@example.com',
'age' => 35,
'city' => 'Tel Aviv',
], JSON_THROW_ON_ERROR);
创建一个
index。
在这个例子中,只有键前缀为user:
的JSON文档被索引。
更多信息,请参见
Query syntax。
$schema = [
new TextField('$.name', 'name'),
new TagField('$.city', 'city'),
new NumericField('$.age', "age"),
];
try {
$r->ftCreate("idx:users", $schema,
(new CreateArguments())
->on('JSON')
->prefix(["user:"]));
}
catch (Exception $e) {
echo $e->getMessage(), PHP_EOL;
}
将三组用户数据作为JSON对象添加到数据库中。
如果你使用带有user:
前缀的键,那么Redis会在你添加时自动索引这些对象:
$r->jsonset('user:1', '$', $user1);
$r->jsonset('user:2', '$', $user2);
$r->jsonset('user:3', '$', $user3);
你现在可以使用索引来搜索JSON对象。下面的
查询
搜索在任何字段中包含文本“Paul”并且
age
值在30到40之间的对象:
$res = $r->ftSearch("idx:users", "Paul @age:[30 40]");
echo json_encode($res), PHP_EOL;
// >>> [1,"user:3",["$","{\"name\":\"Paul Zamir\",\"email\":\"paul.zamir@example.com\",\"age\":35,\"city\":\"London\"}"]]
指定查询选项以仅返回city
字段:
$arguments = new SearchArguments();
$arguments->addReturn(3, '$.city', true, 'thecity');
$arguments->dialect(2);
$arguments->limit(0, 5);
$res = $r->ftSearch("idx:users", "Paul", $arguments);
echo json_encode($res), PHP_EOL;
// >>> [2,"user:1",["thecity","London"],"user:3",["thecity","Tel Aviv"]]
使用 聚合查询 来计算每个城市中的所有用户。
$ftAggregateArguments = (new AggregateArguments())
->groupBy('@city')
->reduce('COUNT', true, 'count');
$res = $r->ftAggregate('idx:users', '*', $ftAggregateArguments);
echo json_encode($res), PHP_EOL;
// >>> [2,["city","London","count","1"],["city","Tel Aviv","count","2"]]
请参阅Redis查询引擎文档,了解所有查询功能的完整描述及示例。