最近,我遇到了全文搜尋的問題。我在搜尋輸入中使用此功能,後端會在您鍵入時發送可能匹配的提示。後端資料庫是PostgreSQL。我需要根據搜尋字詞在文字中的位置對提示進行排名。
因此,如果您搜尋“星球大戰”標題,您將首先看到“星球大戰”帖子,而不是“星球大戰7-9 如何改變星球大戰世界(一部關於星球大戰的有趣製作的紀錄片) ”,這可能會該詞出現3 次後排名更高。
PostgreSQL 中的全文搜尋可以輕鬆實現。主要使用兩個工具:
假設我們要搜尋部落格文章的標題。為了使它們可搜索,我們可以使用以下查詢:
在這種情況下,我們會在每次搜尋時動態地將貼文標題轉換為 tsvector。然而,這種轉變需要一些時間。更好的方法是提前在資料庫中執行此轉換,並將其儲存為標題的索引,以便更快地搜尋。
讓我們建立一個新的標題向量列,並為這個新列建立索引:
現在嘗試搜尋術語「JavaScript」
您也可以直接在標題列上從 ts 向量建立索引,如下所示:
並使用這樣的搜尋:
現在,全文搜尋將非常快,只需幾毫秒即可完成。
PostgreSQL 提供了 ts_rank 功能,它允許您對搜尋結果進行評分並根據排名對其進行排序。 PostgreSQL 支援以下排名選項:
您可以像這樣使用 ts_rank:
但是,沒有基於搜尋字詞在字串中的位置(即標題列)的內建排名選項。
幸運的是 PostgreSQL 中有 POSITION 函數。 PostgreSQL POSITION 函數用於尋找給定字串中子字串的位置。在我們的例子中,我們可以像這樣使用它
ts_rank 使用歸一化整數 2,因為 2 將排名除以文件長度
神奇數字 0.0001 是為了避免除以 0,因為 POSTION 函數從 1 開始計數,而不是從 0 開始計數,如果找不到字串,則傳回 0。
最終程式碼可能如下圖所示:
如果您一次搜尋多個術語(例如 JavaScript 和 TypeScript),則必須提及一個警告。
to_tsquery 函數的參數可以非常靈活地使用,包括邏輯運算子等。另一方面,POSITION 函數「只是」字串中的一個子字串。
這是我在 SvelteKit Web 應用程式中來自現實世界端點的範例,該應用程式使用 postgres (sql) npm 庫:
以下是相關文件的連結:
以上是PostgreSQL 全文搜尋按位置排名的詳細內容。更多資訊請關注PHP中文網其他相關文章!