Sphinx PHP 實現全文搜尋的搜尋歷史記錄與推薦功能
引言:
隨著互聯網的快速發展,全文搜尋已經成為了許多網站和應用程式中必不可少的功能。 Sphinx是一個功能強大的開源全文搜尋引擎,它可以快速地搜尋和檢索大量的文字資料。本文將介紹如何使用Sphinx PHP來實現全文搜尋的搜尋紀錄與推薦功能,以提升使用者的搜尋體驗。
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替換為實際的資料庫資訊。
<?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數組來輸出搜尋結果的標題和內容。
3.1 建立搜尋歷史記錄表
在資料庫中建立一個搜尋歷史記錄表,包含以下欄位:
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的值。
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中文網其他相關文章!