最近,我遇到了全文搜尋的問題。我在搜尋輸入中使用此功能,後端會在您鍵入時發送可能匹配的提示。後端資料庫是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。
最終程式碼可能如下圖所示:
搜尋更多術語
如果您一次搜尋多個術語(例如 JavaScript 和 TypeScript),則必須提及一個警告。
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中文網其他相關文章!

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用