首頁 >web前端 >js教程 >PostgreSQL 全文搜尋按位置排名

PostgreSQL 全文搜尋按位置排名

Patricia Arquette
Patricia Arquette原創
2024-12-13 13:08:10968瀏覽

PostgreSQL Full Text Search Rank by Position

最近,我遇到了全文搜尋的問題。我在搜尋輸入中使用此功能,後端會在您鍵入時發送可能匹配的提示。後端資料庫是PostgreSQL。我需要根據搜尋字詞在文字中的位置對提示進行排名。

因此,如果您搜尋“星球大戰”標題,您將首先看到“星球大戰”帖子,而不是“星球大戰7-9 如何改變星球大戰世界(一部關於星球大戰的有趣製作的紀錄片) ”,這可能會該詞出現3 次後排名更高。

PostgreSQL 中的全文搜索

PostgreSQL 中的全文搜尋可以輕鬆實現。主要使用兩個工具:

  • tsvector - 表示可搜尋文件。
  • tsquery - 表示針對文件執行的搜尋查詢。

假設我們要搜尋部落格文章的標題。為了使它們可搜索,我們可以使用以下查詢:

在這種情況下,我們會在每次搜尋時動態地將貼文標題轉換為 tsvector。然而,這種轉變需要一些時間。更好的方法是提前在資料庫中執行此轉換,並將其儲存為標題的索引,以便更快地搜尋。

讓我們建立一個新的標題向量列,並為這個新列建立索引:

現在嘗試搜尋術語「JavaScript」

您也可以直接在標題列上從 ts 向量建立索引,如下所示:

並使用這樣的搜尋:

現在,全文搜尋將非常快,只需幾毫秒即可完成。

對結果進行排名

PostgreSQL 提供了 ts_rank 功能,它允許您對搜尋結果進行評分並根據排名對其進行排序。 PostgreSQL 支援以下排名選項:

  • 0(預設值)忽略文件長度
  • 1 將排名除以 1 文件長度的對數
  • 2 將排名除以文件長度
  • 4 將排名除以範圍之間的平均調和距離(這僅由 ts_rank_cd 實現)
  • 8 將排名除以文件中唯一單字的數量
  • 16 將排名除以 1,即文件中唯一單字數量的對數
  • 32 將排名除以 1

您可以像這樣使用 ts_rank:

但是,沒有基於搜尋字詞在字串中的位置(即標題列)的內建排名選項。

救援位置

幸運的是 PostgreSQL 中有 POSITION 函數。 PostgreSQL POSITION 函數用於尋找給定字串中子字串的位置。在我們的例子中,我們可以像這樣使用它

ts_rank 使用歸一化整數 2,因為 2 將排名除以文件長度
神奇數字 0.0001 是為了避免除以 0,因為 POSTION 函數從 1 開始計數,而不是從 0 開始計數,如果找不到字串,則傳回 0。

最終程式碼可能如下圖所示:

搜尋更多術語

如果您一次搜尋多個術語(例如 JavaScriptTypeScript),則必須提及一個警告。

to_tsquery 函數的參數可以非常靈活地使用,包括邏輯運算子等。另一方面,POSITION 函數「只是」字串中的一個子字串。

現實世界的例子

這是我在 SvelteKit Web 應用程式中來自現實世界端點的範例,該應用程式使用 postgres (sql) npm 庫:

以下是相關文件的連結:

  • https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-DOCUMENTS
  • https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING
  • https://www.postgresql.org/docs/9.1/functions-string.html

以上是PostgreSQL 全文搜尋按位置排名的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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