當前位置: 首頁> 最新文章列表> RiSearch + PHP 實現時間序列數據高效搜索與聚合的完整方案

RiSearch + PHP 實現時間序列數據高效搜索與聚合的完整方案

M66 2025-10-20

引言

隨著互聯網應用的不斷發展,系統產生的時間序列數據越來越多,例如傳感器數據、日誌信息、股票價格等。這類數據具有時間連續性和高增長的特點,如何高效地進行搜索與聚合成為一項重要的技術挑戰。本文將介紹如何基於RiSearch 與PHP,構建一個高性能的時間序列數據搜索與聚合解決方案。

RiSearch 與PHP 的環境配置

在實現之前,需要先安裝Redis、RiSearch 以及PHP 的Redis 擴展。以下是基本的配置流程:

  • 安裝Redis:可參考Redis 官方文檔獲取下載與安裝方法。
  • 安裝RiSearch:從官方GitHub 倉庫獲取並完成編譯安裝。
  • 安裝PHP Redis 擴展:使用命令pecl install redis進行安裝,並在PHP 配置文件中啟用。

創建時間序列索引

在RiSearch 中使用索引是進行搜索和聚合的基礎。以下示例展示瞭如何在PHP 中創建一個日誌型時間序列索引:

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

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

// 將日誌數據添加到索引中$logs = array(
    array(&#39;timestamp&#39; => 1615516800, &#39;content&#39; => &#39;這是第一條日誌&#39;),
    array(&#39;timestamp&#39; => 1615603200, &#39;content&#39; => &#39;這是第二條日誌&#39;),
    // ...
);

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

上面的代碼首先定義了一個名為logs的索引,包含時間戳與內容兩個字段,並將多條日誌數據寫入索引,便於後續的搜索與聚合操作。

搜索時間序列數據

RiSearch 提供了高效的查詢語法,可根據時間區間快速檢索數據。以下代碼演示瞭如何在指定時間範圍內搜索日誌:

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

$query = &#39;@timestamp:[1615516800 1615603200]&#39;; // 搜尋2021-03-12 到2021-03-13 的日誌$result = $redis->rawCommand(&#39;FT.SEARCH&#39;, &#39;logs&#39;, $query, &#39;LIMIT&#39;, 0, 10);

// 輸出搜尋結果foreach ($result as $key => $value) {
    if ($key % 2 === 0) {
        echo &#39;日誌ID:&#39;.$value."\n";
    } else {
        echo &#39;內容:&#39;.$value."\n";
    }
}
?>

通過FT.SEARCH命令,我們可以快速查詢時間範圍內的日誌信息,並將結果按需輸出。該方式能夠支持複雜的查詢條件與多字段匹配。

聚合時間序列數據

在日誌分析或監控系統中,聚合統計是常見需求。例如,可以統計某個時間段內某類日誌出現的次數。以下示例展示了使用RiSearch 的聚合命令實現這一功能:

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

$query = &#39;@timestamp:[1615516800 1615603200]&#39;; // 搜尋指定時間範圍的日誌$result = $redis->rawCommand(&#39;FT.AGGREGATE&#39;, &#39;logs&#39;, $query, &#39;LOAD&#39;, 1,
    &#39;GROUPBY&#39;, 1, &#39;@content&#39;,
    &#39;REDUCE&#39;, &#39;COUNT&#39;, 0, &#39;AS&#39;, &#39;count&#39;);

// 輸出聚合結果foreach ($result as $item) {
    echo &#39;內容:&#39;.$item[&#39;@content&#39;].&#39;,出現頻率:&#39;.$item[&#39;count&#39;]."\n";
}
?>

該聚合命令會對查詢結果進行分組,並統計每種日誌內容的出現次數,非常適用於日誌分析、事件統計等場景。

總結

通過結合RiSearch 與PHP,我們可以輕鬆構建出支持時間序列數據搜索與聚合的高性能係統。通過索引建立、搜索查詢與聚合分析三步,能夠高效地管理和分析大規模時間序列數據。開發者可根據實際業務需求進一步擴展,例如增加數據可視化、智能告警或多維度聚合等功能,從而構建出完整的數據分析平台。