示例 - 索引和查询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查询引擎文档,了解所有查询功能的完整描述及示例。

RATE THIS PAGE
Back to top ↑