全文檢索索引是一種資訊檢索技術,旨在從大量文本資料中快速準確地找到與使用者查詢相關的資訊。PolarDB PostgreSQL版(相容Oracle)具備一系列全文檢索索引能力。
背景
與傳統的關鍵詞搜尋相比,全文檢索索引的目標是在海量文本資料中迅速而準確地尋找與使用者查詢相關的資訊。它能夠處理整個文檔的內容,而不僅限於特定欄位或標籤。
全文檢索索引系統通常包括以下步驟:
文本預先處理:將文本進行分詞、去除停用詞及詞幹提取等處理,以提高檢索效率和準確性。
索引構建:將處理後的文本建立索引,通常採用倒排索引結構,記錄每個詞出現的位置和相關文檔。
查詢處理:使用者輸入查詢後,系統分析查詢語句並轉換為合適的格式進行檢索。
結果排序:根據相關性演算法對檢索結果進行排序,返回最符合使用者需求的結果。
使用情境
全文檢索索引具有非常廣泛的使用情境,一些典型的情境如下:
文件管理系統:用於快速尋找公司內部文檔、報告和條款,提升工作效率。
線上搜尋引擎:通過全文檢索索引技術協助使用者快速找到所需資訊。
學術研究:學術資料庫和文獻管理工具中,研究人員可以快速定位相關文獻和資料。
電子商務:電商平台通過全文檢索索引協助顧客快速找到所需的產品,提升購物體驗。
社交媒體:使用者可以根據關鍵詞搜尋文章、評論和圖片,提高資訊擷取的便捷性。
法律文書檢索:律師和法律專業人員通過全文檢索索引工具快速尋找相關案例和法律條款。
病歷管理:醫院可以使用全文檢索索引技術在病曆和報告中快速找出患者資訊和記錄。
客戶支援:線上客服系統通過全文檢索搜尋協助客戶快速找到常見問題集(FAQ)和支援文檔。
內容管理系統:網站和部落格使用全文檢索索引功能幫訪客快速找到相關的文章和資料。
圖書館與資訊檢索:圖書館的資訊檢索系統利用全文檢索索引技術,方便讀者尋找書籍和文章。
功能概述
分詞
PolarDB PostgreSQL版(相容Oracle)全文索引允許對文檔進行預先處理,並儲存一個索引用於後續的快速搜尋。預先處理包括:
將文檔解析成記號。標識出多種類型的記號,例如數字、詞、複雜的詞及電子郵件地址,便於它們可以以不同的方式處理。
將記號轉換成詞位。一個詞位類似於一個記號,是一個經過正規化的字串,使得同一詞的不同形式被統一為相同的表達。例如,正規化通常包括將大寫字母轉換為小寫形式,並且常常涉及去除尾碼(例如英語中的s或es)。這一過程使得搜尋能夠識別同一詞彙的不同變體,從而避免冗長地輸入所有可能的變體形式。
為搜尋最佳化而儲存預先處理的文檔。例如,每一個文檔可以表示為正規化詞位的有序數組。除了詞位,通常還需要儲存用於近似排名的位置資訊。這樣,一個包含查詢詞的“密集”地區的文檔,其排名將高於那些包含分散查詢詞的文檔。
tsvector
tsvector是PolarDB PostgreSQL版(相容Oracle)提供的一個用於全文檢索搜尋的資料類型。該資料類型能夠高效儲存經過處理的文本,以實現快速搜尋和匹配。tsvector用於儲存文檔的詞彙索引,通常由詞彙及其在文本中的位置群組成。
pg_bigm
pg_bigm(模糊查詢)是PolarDB PostgreSQL版(相容Oracle)的一個擴充模組,用於提供模糊搜尋功能,特別是用於實現近似字串匹配。該擴充最常用於處理包含大量文本資料的應用程式,如搜尋引擎和內容管理系統。其核心理念是通過“n-grams”(n-元組)來提高文本搜尋的效率和準確性。
pg_bigm擴充針對前後模糊查詢(like '%xxxx%')有效。
pg_trgm
pg_trgm是PolarDB PostgreSQL版(相容Oracle)的一個擴充模組,用於提供對三元組(trigram)的支援。三元組是一種用於位移字串相似性搜尋的方法,特別適合處理模糊比對和文本相似性查詢。pg_trgm主要通過建立索引和查詢運算子,以提高對大文本資料集的查詢效率,通常應用於全文檢索搜尋、自動補全、拼字錯誤修正等情境。
pg_trgm擴充針對前後模糊查詢(like '%xxxx%')有效。
中文分詞
在中文語言中,詞語是最小的語素單位。與英語不同的是,中文在書寫時並不使用空格分隔詞語。這一特性導致在使用PostgreSQL的預設全文檢索索引引擎時,難以獲得符合中文語義的分詞結果。
針對中文分詞,PolarDB PostgreSQL版(相容Oracle)支援pg_jieba和Zhparser兩種全文檢索索引能力。
pg_jieba
Jieba(結巴)是目前比較流行的中文分詞庫之一,能夠準確地識別中文語句中的單詞,對中文語句進行分詞。pg_jieba(中文分詞)外掛程式將Jieba的分詞能力引入到資料庫中,能夠高效地對中文文本進行分詞處理,從而支援全文檢索索引功能。
Zhparser
SCWS(Simple Chinese Word Segmentation,簡易中文分詞系統),是一套基於詞頻詞典的開源中文分詞引擎,能將一整段的中文文本基本正確地切分成詞。
Zhparser外掛程式是一個基於SCWS能力開發的中文分詞外掛程式,在相容PostgreSQL已有全文檢索索引能力的基礎上,提供豐富的功能配置選項,同時也提供使用者自訂字典功能。
索引
PolarDB PostgreSQL版(相容Oracle)支援多種索引結構以支援全文檢索索引。
GIN索引
GIN(Generalized Inverted Index,廣義倒排索引)是PostgreSQL中一種支援全文檢索索引的索引類型。使用GIN索引可以有效地進行全文檢索搜尋,尤其是在處理大規模文本資料時。GIN索引允許快速的查詢操作,特別是在處理複雜的文字查詢時(如使用tsvector和tsquery的查詢)。同時,GIN索引支援JSONB等類型。
RUM索引
RUM是PostgreSQL的一個擴充,提供了一種可用於全文檢索搜尋及其他索引需求的RUM索引類型。該索引旨在提升全文檢索搜尋的效能,特別是在需要對文檔進行排名的情境中。
RUM索引是一種倒排索引,它與內建的GIN (Generalized Inverted Index) 索引相似。主要區別在於RUM索引為儲存附加資訊提供了一種機制,這在執行排序或其他動作時能夠更快地擷取結果。例如,在全文檢索搜尋中,RUM索引可以儲存詞語在文檔中的位置資訊,從而在查詢時利用這些位置資訊來計算相關排名。
查詢處理
tsquery
tsquery是一個用於全文檢索搜尋的功能,專門用於處理文本資料的查詢。它允許使用者建立複雜的搜尋條件,以便在大規模文本資料中快速有效地尋找所需的資訊。PolarDB PostgreSQL版(相容Oracle)同樣提供了to_tsquery方法將文本轉換為tsquery,結合tsvector及全文檢索索引操作符,就可以完成全文檢索索引查詢。
tsquery支援@@(包含)操作符和Boolean操作符&( AND)、|(OR) 和!(NOT),可以方便地構建組合條件的檢索查詢。
排序
ts_rank
ts_rank是PostgreSQL資料庫中用於全文檢索搜尋的函數,主要用於計算文檔與查詢之間的相關性評分。該評分可用於評估文檔在特定搜尋條件下的重要性或相關性。