Maison  >  Article  >  développement back-end  >  Idées techniques pour implémenter la recherche et l'agrégation de données de séries chronologiques à l'aide de RiSearch PHP

Idées techniques pour implémenter la recherche et l'agrégation de données de séries chronologiques à l'aide de RiSearch PHP

WBOY
WBOYoriginal
2023-10-03 08:34:21969parcourir

RiSearch PHP 实现时间序列数据搜索与聚合的技术思路

RiSearch PHP Idées techniques pour réaliser la recherche et l'agrégation de données de séries chronologiques

Introduction :
Avec le développement d'Internet, de nombreux systèmes d'application généreront une grande quantité de données de séries chronologiques, telles que des données de capteurs, des données de journaux, des stocks. les prix, etc Une exigence importante pour ces données est de pouvoir les rechercher et les regrouper rapidement et avec précision. RiSearch est un moteur de recherche en texte intégral basé sur Redis. Dans cet article, nous verrons comment utiliser RiSearch et PHP pour implémenter les fonctions de recherche et d'agrégation de données de séries chronologiques.

1. Installez et configurez RiSearch
Tout d'abord, nous devons installer Redis et RiSearch, puis installer l'extension redis en PHP. Cela peut être accompli en suivant les étapes ci-dessous :

  1. Installer Redis : Veuillez vous référer à la documentation sur le site officiel de Redis (https://redis.io/) pour télécharger et installer Redis.
  2. Installer RiSearch : veuillez vous référer à la documentation sur le site officiel de RiSearch (https://github.com/RediSearch/RediSearch) pour télécharger et installer RiSearch.
  3. Installez l'extension redis : installez l'extension redis en exécutant la commande pecl install redis et ajoutez-la à la liste des extensions PHP. pecl install redis命令来安装redis扩展,并将其添加到PHP的扩展列表中。

二、创建时间序列索引
使用RiSearch进行搜索和聚合之前,我们需要先创建时间序列索引。假设我们有一个日志系统,每条日志都包含时间戳和内容信息。我们可以通过以下代码来创建时间序列索引:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$redis->rawCommand('FT.CREATE', 'logs', 'SCHEMA', 'timestamp', 'NUMERIC', 'content', 'TEXT');

// 将日志数据添加到索引中
$logs = array(
    array('timestamp' => 1615516800, 'content' => '这是第一条日志'),
    array('timestamp' => 1615603200, 'content' => '这是第二条日志'),
    // ...
);

foreach ($logs as $log) {
    $redis->rawCommand('FT.ADD', 'logs', 'doc:'.$log['timestamp'], 1.0, 'FIELDS', 'timestamp', $log['timestamp'], 'content', $log['content']);
}

?>

在上面的代码中,我们首先创建了一个名为“logs”的时间序列索引,创建时定义了两个字段,分别是“timestamp”(时间戳)和“content”(内容)。然后,我们将每条日志数据按照时间顺序添加到了索引中。

三、搜索时间序列数据

使用RiSearch进行时间序列的搜索可以非常灵活和高效。以下是一个示例代码,用来根据时间范围搜索日志数据:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$query = '@timestamp:[1615516800 1615603200]'; // 搜索2021-03-12到2021-03-13之间的日志

$result = $redis->rawCommand('FT.SEARCH', 'logs', $query, 'LIMIT', 0, 10);

// 输出搜索结果
foreach ($result as $key => $value) {
    if ($key % 2 === 0) {
        echo '日志ID:'.$value."
";
    } else {
        echo '内容:'.$value."
";
    }
}
?>

在上面的代码中,我们使用了FT.SEARCH命令进行搜索,指定了要搜索的索引名称“logs”和查询语句“@timestamp:[1615516800 1615603200]”,表示搜索2021-03-12到2021-03-13之间的日志。通过限制结果的数量和遍历输出,我们可以得到搜索结果。

四、聚合时间序列数据

在实际应用中,我们经常需要对时间序列数据进行聚合,比如计算某个时间段内的平均值、最大值、最小值等。RiSearch也提供了相应的聚合功能,以下是一个示例代码,用来计算特定时间范围内日志内容的出现频率:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$query = '@timestamp:[1615516800 1615603200]'; // 搜索2021-03-12到2021-03-13之间的日志

$result = $redis->rawCommand('FT.AGGREGATE', 'logs', $query, 'LOAD', 1, 'GROUPBY', 1, '@content', 'REDUCE', 'COUNT', 0, 'AS', 'count');

// 输出聚合结果
foreach ($result as $item) {
    echo '内容:'.$item['@content'].',出现频率:'.$item['count']."
";
}
?>

在上面的代码中,我们使用了FT.AGGREGATE

2. Créer un index de séries chronologiques

Avant d'utiliser RiSearch pour la recherche et l'agrégation, nous devons d'abord créer un index de séries chronologiques. Supposons que nous ayons un système de journalisation et que chaque journal contienne des informations d'horodatage et de contenu. Nous pouvons créer un index de série temporelle via le code suivant :
rrreee

Dans le code ci-dessus, nous créons d'abord un index de série temporelle nommé "logs", et définissons deux champs lors de sa création, à savoir "timestamp" (horodatage) et " contenu". Ensuite, nous avons ajouté chaque élément de données de journal à l'index par ordre chronologique. 🎜🎜3. Rechercher des données de séries chronologiques🎜🎜Utiliser RiSearch pour rechercher des séries chronologiques peut être très flexible et efficace. Voici un exemple de code pour rechercher des données de journal en fonction d'une plage horaire : 🎜rrreee🎜 Dans le code ci-dessus, nous avons utilisé la commande FT.SEARCH pour effectuer la recherche, en spécifiant le nom d'index "logs" à rechercher. " et l'instruction de requête " @timestamp:[1615516800 1615603200] " signifie rechercher des journaux entre le 12/03/2021 et le 13/03/2021. En limitant le nombre de résultats et en itérant sur le résultat, nous pouvons obtenir les résultats de la recherche. 🎜🎜4. Agrégation de données de séries chronologiques🎜🎜Dans les applications pratiques, nous avons souvent besoin d'agréger des données de séries chronologiques, telles que le calcul de la valeur moyenne, maximale, minimale, etc. RiSearch fournit également les fonctions d'agrégation correspondantes. Voici un exemple de code pour calculer la fréquence du contenu du journal dans une plage de temps spécifique : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons FT.AGGREGATE La commande effectue l'agrégation. et spécifie le nom d'index « logs » à agréger, l'instruction de requête « @timestamp:[1615516800 1615603200] » et la méthode d'agrégation « COUNT », qui consiste à calculer la fréquence d'apparition de chaque contenu de journal. En parcourant les résultats, nous pouvons obtenir les résultats agrégés. 🎜🎜Résumé : 🎜Grâce à la combinaison de RiSearch et PHP, nous pouvons facilement implémenter les fonctions de recherche et d'agrégation de données de séries chronologiques. En créant des index de séries chronologiques, en utilisant FT.SEARCH pour la recherche et en utilisant FT.AGGREGATE pour l'agrégation, nous pouvons traiter rapidement et avec précision de grandes quantités de données de séries chronologiques pour répondre aux besoins des applications pratiques. Il convient de noter que cet article ne fournit que des idées de base et des exemples de code. L'utilisation réelle nécessite des ajustements et des optimisations correspondants en fonction de besoins spécifiques. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn