首頁 >後端開發 >php教程 >Sphinx PHP 實作全文搜尋的搜尋紀錄與推薦功能

Sphinx PHP 實作全文搜尋的搜尋紀錄與推薦功能

WBOY
WBOY原創
2023-10-03 09:38:041124瀏覽

Sphinx PHP 实现全文搜索的搜索历史记录与推荐功能

Sphinx PHP 實現全文搜尋的搜尋歷史記錄與推薦功能

引言:
隨著互聯網的快速發展,全文搜尋已經成為了許多網站和應用程式中必不可少的功能。 Sphinx是一個功能強大的開源全文搜尋引擎,它可以快速地搜尋和檢索大量的文字資料。本文將介紹如何使用Sphinx PHP來實現全文搜尋的搜尋紀錄與推薦功能,以提升使用者的搜尋體驗。

  1. 安裝和設定Sphinx
    首先,我們需要在伺服器上安裝和設定Sphinx。可以透過以下步驟來完成:

1.1 下載Sphinx

造訪Sphinx官方網站(http://sphinxsearch.com/)下載Sphinx的最新版本。解壓縮檔。

1.2 安裝Sphinx

進入Sphinx的解壓縮目錄,執行下列指令來安裝Sphinx:

./configure
make
make install

1.3 設定Sphinx

在Sphinx的安裝目錄下,建立一個設定檔sphinx.conf,範例如下:

source src1
{
    type = mysql

    sql_host = your_mysql_host
    sql_user = your_mysql_user
    sql_pass = your_mysql_password
    sql_db = your_mysql_database
    sql_port = 3306

    sql_query = 
        SELECT id, title, content 
        FROM articles
}

index idx1
{
    source = src1
    path = /path/to/index
    docinfo = extern

    morphology = stem_ru

    min_stemming_len = 4
}

searchd
{
    listen = 9312
    log = /path/to/log/searchd.log
}

將上述範例中的your_mysql_host、your_mysql_user、your_mysql_password、your_mysql_database替換為實際的資料庫資訊。

  1. 寫PHP程式碼
    接下來,我們將編寫PHP程式碼來使用Sphinx實作全文搜尋的搜尋記錄與推薦功能。範例程式碼如下:
<?php
require_once("sphinxapi.php");

// 定义Sphinx服务器的IP地址和端口号
$host = "127.0.0.1";
$port = 9312;

// 创建Sphinx客户端对象
$sphinx = new SphinxClient();

// 设置Sphinx服务器的连接信息
$sphinx->SetServer($host, $port);

// 设置搜索模式为全文搜索模式
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);

// 定义关键词
$keyword = "php实现搜索";

// 执行搜索
$result = $sphinx->Query($keyword, "idx1");

if ($result["total"] > 0) {
    // 获取搜索结果
    $matches = $result["matches"];

    // 输出搜索结果
    foreach ($matches as $match) {
        echo "文章标题:" . $match["attrs"]["title"] . "<br>";
        echo "文章内容:" . $match["attrs"]["content"] . "<br>";
        echo "<br>";
    }
} else {
    echo "没有找到相关的文章";
}
?>

在上述程式碼中,我們首先引入了sphinxapi.php文件,該文件包含了與Sphinx伺服器通訊所需的API函數。接下來,我們建立了一個SphinxClient對象,並設定了Sphinx伺服器的連線資訊和搜尋模式。

在執行搜尋之前,我們定義了一個關鍵字$keyword,並將其作為參數傳遞給Sphinx的Query方法。 Query方法傳回一個搜尋結果的陣列$result,其中包含了搜尋結果的總數$total和每個符合結果的相關資訊$matches。我們可以透過遍歷$matches數組來輸出搜尋結果的標題和內容。

  1. 搜尋歷史記錄功能
    在實作搜尋歷史記錄功能時,我們可以將使用者的每次搜尋關鍵字儲存到資料庫中。可以透過以下步驟來實現:

3.1 建立搜尋歷史記錄表
在資料庫中建立一個搜尋歷史記錄表,包含以下欄位:

  • id:主鍵
  • user_id:用戶ID
  • keyword:搜尋關鍵字
  • created_at:建立時間

3.2 插入搜尋記錄
在執行搜尋後,將使用者的搜尋關鍵字和目前時間插入搜尋記錄表中。範例程式碼如下:

<?php
// ...
if ($result["total"] > 0) {
    // ...

    // 将搜索关键词插入到搜索历史记录表中
    $user_id = 1; // 假设用户ID为1
    $keyword = "php实现搜索";
    $created_at = date("Y-m-d H:i:s");

    $sql = "INSERT INTO search_history (user_id, keyword, created_at) VALUES ('$user_id', '$keyword', '$created_at')";
    // 执行SQL语句插入搜索历史记录
    // ...

    // 输出搜索结果
    // ...
}

在上述程式碼中,我們先定義了使用者ID$user_id、搜尋關鍵字$keyword和目前時間$created_at。接下來,我們使用INSERT INTO語句將這些值插入到搜尋記錄表中。請依實際情況修改$keyword和$user_id的值。

  1. 推薦功能
    在實作推薦功能時,我們可以根據使用者的搜尋歷史記錄來為其推薦相關的文章。可以透過以下步驟來實現:

4.1 取得使用者搜尋歷史記錄
在資料庫中查詢使用者的搜尋歷史記錄,並儲存到一個陣列中。範例程式碼如下:

<?php
// ...
$user_id = 1; // 假设用户ID为1

// 查询用户的搜索历史记录
$sql = "SELECT keyword FROM search_history WHERE user_id = '$user_id' ORDER BY created_at DESC LIMIT 5";
// 执行SQL语句查询搜索历史记录
// ...

// 将搜索关键词保存到数组中
$keywords = [];
while ($row = mysqli_fetch_assoc($result)) {
    $keywords[] = $row["keyword"];
}

在上述程式碼中,我們使用SELECT語句查詢使用者的搜尋記錄。注意調整LIMIT的值以取得指定數量的搜尋記錄。將查詢結果儲存到陣列$keywords中。

4.2 根據搜尋記錄進行推薦
根據使用者的搜尋歷史記錄,可以從資料庫中查詢相關的文章,並輸出推薦結果。範例程式碼如下:

<?php
// ...
if (count($keywords) > 0) {
    $sql = "SELECT title, content FROM articles WHERE ";
    foreach ($keywords as $keyword) {
        $sql .= "MATCH('$keyword') ";
        $sql .= "OPTION ranker=expr('sum(word_count)*user_weight') ";
        $sql .= "AGAINST('$keyword') OR ";
    }
    $sql = rtrim($sql, " OR ");
    $sql .= " LIMIT 5";
    // 执行SQL语句查询推荐结果
    // ...

    if (mysqli_num_rows($result) > 0) {
        // 输出推荐结果
        while ($row = mysqli_fetch_assoc($result)) {
            echo "文章标题:" . $row["title"] . "<br>";
            echo "文章内容:" . $row["content"] . "<br>";
            echo "<br>";
        }
    } else {
        echo "没有推荐的文章";
    }
}

上述程式碼中,我們先檢查$keywords陣列是否為空,如果不為空,則產生一條帶有OR條件的查詢語句。我們使用MATCH...AGAINST語句來搜尋相關的文章,並使用ranker選項設定匹配度權重。透過為每個查詢關鍵字分配一個較高的權重user_weight,可以提高相關性。將查詢結果輸出到前端。

總結:
本文介紹如何使用Sphinx PHP實現全文搜尋的搜尋歷史記錄與推薦功能。透過儲存使用者的搜尋關鍵字和查詢相關的文章,可以提升使用者的搜尋體驗,並為使用者提供更個人化的推薦結果。希望讀者能夠根據本文提供的方法和範例程式碼,成功實現相應的功能。

以上是Sphinx PHP 實作全文搜尋的搜尋紀錄與推薦功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn