Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Idea teknikal untuk melaksanakan carian dan pengagregatan data siri masa menggunakan RiSearch PHP

Idea teknikal untuk melaksanakan carian dan pengagregatan data siri masa menggunakan RiSearch PHP

WBOY
WBOYasal
2023-10-03 08:34:21969semak imbas

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

RiSearch PHP idea teknikal untuk merealisasikan carian data siri masa dan pengagregatan

Pengenalan:
Dengan perkembangan Internet, ma aplikasi Sistem akan menjana sejumlah besar data siri masa, seperti data sensor, data log, harga saham, dsb. Keperluan penting untuk data ini ialah dapat mencari dan mengagregatkannya dengan cepat dan tepat. RiSearch ialah enjin carian teks penuh berdasarkan Redis Dalam artikel ini, kita akan membincangkan cara menggunakan RiSearch dan PHP untuk melaksanakan fungsi carian dan pengagregatan data siri masa.

1 Pasang dan konfigurasikan RiSearch
Pertama, kita perlu memasang Redis dan RiSearch, dan memasang sambungan redis dalam PHP. Ini boleh dicapai dengan mengikuti langkah di bawah:

  1. Pasang Redis: Sila rujuk dokumentasi di tapak web rasmi Redis (https://redis.io/) untuk memuat turun dan memasang Redis .
  2. Memasang RiSearch: Sila rujuk dokumentasi di tapak web rasmi RiSearch (https://github.com/RediSearch/RediSearch) untuk memuat turun dan memasang RiSearch.
  3. Pasang sambungan redis: Pasang sambungan redis dengan menjalankan perintah pecl install redis dan tambahkannya pada senarai sambungan 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 Buat indeks siri masa

Sebelum menggunakan RiSearch untuk carian dan pengagregatan, kita perlu mencipta indeks siri masa terlebih dahulu. Katakan kita mempunyai sistem pengelogan, dan setiap log mengandungi cap masa dan maklumat kandungan. Kita boleh mencipta indeks siri masa melalui kod berikut:
rrreee

Dalam kod di atas, kita mula-mula mencipta indeks siri masa bernama "log", dan mentakrifkan dua medan semasa menciptanya, masing-masing Ia adalah "cap masa " (cap masa) dan "kandungan" (kandungan). Kemudian, kami menambah setiap bahagian data log pada indeks dalam susunan kronologi. #🎜🎜##🎜🎜#3. Mencari data siri masa #🎜🎜##🎜🎜#Menggunakan RiSearch untuk mencari siri masa boleh menjadi sangat fleksibel dan cekap. Berikut ialah contoh kod untuk mencari data log berdasarkan julat masa: #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami menggunakan perintah FT.SEARCH untuk mencari, menyatakan carian The search nama indeks "log" dan pernyataan pertanyaan "@timestamp:[1615516800 1615603200]" bermaksud bahawa log antara 2021-03-12 dan 2021-03-13 dicari. Dengan mengehadkan bilangan hasil dan mengulangi keluaran, kita boleh mendapatkan hasil carian. #🎜🎜##🎜🎜#4 Agregasi data siri masa#🎜🎜##🎜🎜#Dalam aplikasi praktikal, kita selalunya perlu mengagregatkan data siri masa, seperti mengira purata dan nilai maksimum dalam tempoh masa tertentu , nilai minimum, dsb. RiSearch juga menyediakan fungsi pengagregatan yang sepadan Berikut ialah kod sampel untuk mengira kekerapan kandungan log dalam julat masa tertentu: #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami menggunakan FT The .AGGREGATE<. perintah> melaksanakan pengagregatan, menyatakan nama indeks "log" untuk diagregatkan, pernyataan pertanyaan "@timestamp:[1615516800 1615603200]", dan kaedah pengagregatan "COUNT", yang bermaksud mengira kekerapan kejadian setiap kandungan log . Dengan mengulangi keputusan, kita boleh mendapatkan hasil agregat. #🎜🎜##🎜🎜#Ringkasan: #🎜🎜#Melalui gabungan RiSearch dan PHP, kami boleh melaksanakan fungsi carian dan pengagregatan data siri masa dengan mudah. Dengan mencipta indeks siri masa, menggunakan FT.SEARCH untuk mencari dan menggunakan FT.AGGREGATE untuk pengagregatan, kami boleh memproses sejumlah besar data siri masa dengan cepat dan tepat untuk memenuhi keperluan aplikasi praktikal. Perlu diingatkan bahawa artikel ini hanya menyediakan idea asas dan contoh kod Penggunaan sebenar memerlukan pelarasan dan pengoptimuman yang sepadan berdasarkan keperluan khusus. #🎜🎜#

Atas ialah kandungan terperinci Idea teknikal untuk melaksanakan carian dan pengagregatan data siri masa menggunakan RiSearch PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn