跳轉到內容

Sphinx 搜尋/Sphinx 的不同之處

來自華夏公益教科書,開放世界的開放書籍

Sphinx 與你習慣的 MySQL 查詢略有不同。所以不要指望立刻就能理解它。

什麼是索引?
[編輯 | 編輯原始碼]

Sphinx 從 MySQL 資料庫中的表中檢索資料,並對其進行稱為索引的過程。索引建立了一個檔案,該檔案可以被 Sphinx 輕鬆搜尋。例如,如果你嘗試在 Microsoft Word 中搜索一個文件,它將逐個單詞地在文件文字中搜索。在非常大的文件中,搜尋速度可能會明顯變慢。另一方面,Sphinx 在任何搜尋發生之前都會進行索引。這將建立一個索引,可以高效地搜尋,而不是逐個單詞地搜尋整個文件。一個很好的例子是百科全書的索引。如果我想找到一些關於貓的資訊,我可以像 Microsoft Word 一樣,閱讀百科全書的每一頁,尋找 "cat" 這個詞的出現。或者,我可以查閱最後的索引,在 "cat" 下,發現第 104、195 和 653 頁。方便多了。


Clipboard

待辦事項
解釋索引過程中發生了什麼


你只能搜尋已索引的內容
[編輯 | 編輯原始碼]

你需要記住的是,SPHINX 只能搜尋索引中的內容!這意味著每當你想要搜尋最新的結果時,你必須更新索引。所以,如果你正在撰寫一篇關於貓的文章,並且對文章表進行了索引,然後又寫了一篇關於雞的文章,並進行搜尋,它會找到你的貓的文章,但它會把雞的文章當作不存在一樣對待。

如果你要從本節中記住一件事,那就是SPHINX 只能搜尋索引中的內容!

訪問資料

[編輯 | 編輯原始碼]

如果你使用 PHP 與 MySQL,這對你來說會容易得多。否則,你可能應該考慮學習 PHP 和 MySQL(或者任何語言和 MySQL)。Tigzag 和 W3Schools 上有很棒的教程。

Sphinx 通常返回 MySQL ID,而不是資料!!!
[編輯 | 編輯原始碼]

你需要記住關於 Sphinx 的關鍵一點是,它通常不會檢索資料。它主要檢索文件 ID,所以你可能想知道Sphinx 到底有什麼用呢?搜尋。Sphinx 執行密集的任務,即搜尋特定的記錄。然後,你可以透過 MySQL 完成簡單的部分,即檢索該文件。例如,如果 Sphinx 從索引中提取出文件 ID 1、5 和 7,你需要在 MySQL 中執行一個查詢來檢索記錄(可能具有 1、5 和 7 的 ID)。你可能會認為這很愚蠢,但與搜尋單詞相比,MySQL 搜尋文件 ID 消耗的資源非常少。

以下是一個例子。假設 Sphinx 提取了 ID 為 1、5、7 的文件。你會執行

SELECT * FROM documents WHERE id IN (1,5,7)

你正在告訴 MySQL 從文件表(或結果所在的任何表)中選擇所有列,其中 ID(或你對 ID 欄位的命名)是 1、5 或 7 之一。然後,你可以在 PHP 中使用 mysql_fetch_array 來檢視資料並對它執行任何操作。

一旦你學會了如何使用 Sphinx 對結果進行排序,你就可以透過以下方法保留排序結果

  • 將結果的順序儲存在一個數組中(只需儲存匹配項的 ID 屬性)
  • 對陣列執行 IMPLODE 操作,使用 $result = implode(", ", $array),其中 $array 是你的結果陣列,result 將儲存用逗號空格分隔的結果 ID 的字串。
SELECT * FROM documents WHERE id IN ($result) ORDER BY FIELD(id,$result)

在這裡,我們正在告訴 MySQL 按我們在 $result 中指定的順序,按照 ID 欄位對結果進行排序。

這似乎有很多工作要做,但你很快就會習慣的,最終你會編寫函式來為你處理所有這些。別擔心,這絕對是值得的!!!


Clipboard

待辦事項
待續...

華夏公益教科書