分享到

簡介

資料庫系統最常見的功能之一是能夠根據給定查詢檢索專案。雖然傳統資料庫查詢非常適合熟悉系統工具和資料結構的使用者執行結構化命令,但大多數向用戶公開的搜尋功能採用不同的技術。

在本文中,我們將介紹全文搜尋背後的理念。我們將討論這種文字處理和檢索型別與傳統資料庫查詢有何不同,以及為什麼它在許多情況下很有用。我們將探討在索引和查詢過程中可以做出的一些決策,以影響您檢索到的結果,並討論在與這些系統互動時為獲得所需結果而必須做出的一些權衡。

全文搜尋 是指允許您在資料庫系統中搜索文件完整文字的一系列技術。這與僅依賴元資料、部分文字源和其他不完整評估的搜尋功能直接相反。

與常規資料庫查詢相比,全文搜尋是語言感知的。這意味著它在一定程度上依賴於對儲存文件和搜尋本身所用語言的理解,以便檢索具有語義意義的結果。

全文搜尋通常還包括根據結果與使用者查詢的相對相似性對結果進行排名和排序的功能。這有助於引擎首先顯示最相關的結果,或者在未明確請求的情況下排除排名較低的專案。

索引的重要性

雖然許多資料庫操作可以透過索引得到改進,但全文搜尋尤其依賴於非同步索引過程。

索引是將現有文件解析以編譯索引的過程。索引是一種更小、經過最佳化的結構,專門用於快速查詢請求的專案。雖然普通資料庫索引可能會分析幾個欄位來建立索引,但全文搜尋索引是透過分析文件的完整文字來建立的。

如果沒有索引,搜尋必須完成一個稱為序列掃描的過程,在該過程中系統在查詢時分析每個專案以檢視它們是否與查詢條件匹配。對於熟悉類 Unix 系統的人來說,這類似於使用 find 工具搜尋檔名(該工具在查詢期間掃描檔案系統)和更快的 locate 命令(該命令依賴於定期更新的索引)之間的區別。

索引是如何建立的

索引過程由多個相關階段組成。首先,文件由解析器掃描,將文字劃分為單個“標記”("tokens")。標記是系統已知的離散詞語,可以根據其詞性、與相似詞的關係等進行分類。

然後,標記被處理成“詞位”("lexemes"),這是一個語言級別的意義單元。在此過程中,術語通常會被規範化,將相關詞語合併為一個條目,這允許查詢引擎返回與字面搜尋略有不同的相關結果。

分析結果隨後被排序並存儲在一個最佳化的索引中,以便查詢引擎能夠找到相關結果並比較每個文件的不同因素。該索引包含有關每個文件中發現的詞位資訊,並可能包括額外的上下文,如位置資料、詞位密度等,以幫助實現更復雜的搜尋條件。

平衡索引過程

雖然我們討論了建立全文索引所需的一般步驟,但我們遺漏了一些影響索引和最終查詢功能的關鍵因素。索引文字的方式有很多種,您選擇的方式會對搜尋功能的效能和特性產生重大影響。

幾乎所有索引過程都採用的一項最佳化是使用停用詞。停用詞是被認為無關緊要或過於模糊而無法在搜尋中有用的詞語列表。它們通常是語言中最常見的詞語,包含最少的相關上下文。英語中的一些例子包括 "the"、"a" 和 "it"。在索引期間,停用詞會從索引中刪除,這有助於保持索引更小,併為更相關的搜尋提供更快的速度。

如前所述,索引過程還可能將密切相關的條目合併為單個專案,以保持索引較小,併為相似查詢提供更廣泛的結果。其中一種技術稱為“詞幹提取”("stemming"),它將同一單詞“詞幹”的不同變體詞語組合在一起。例如,“cook”、“cooking”和“cooked”將被合併為一個條目。其他技術可能會查閱語言感知工具,如同義詞庫,以對映同義詞或識別可能替代某個單詞的短語。

在許多情況下,您在索引過程中做出的決策會影響在查詢過程中獲得的搜尋結果質量。這有時被討論為召回率和精確度之間的平衡,兩者都是用於描述搜尋效果不同方面的技術術語。

召回率(Recall)是返回的相關結果與資料集中相關結果總數之比。高召回率的查詢會檢索到大部分可能的 A相關結果。

與此相關的是搜尋的精確度(precision),它描述了返回結果中有多少是實際相關的。高精確度的查詢其結果中與給定查詢不太相關的數量有限。

停用詞等技術可以透過從分析中消除不重要的詞語來提高結果的精確度。另一方面,詞幹提取主要透過捕獲因微小詞語差異而可能丟失相關結果的情況來提高召回率。這兩個概念可以相互影響,因此在構建索引時必須同時考慮它們,以確保您的結果既具有相關性又具有您希望的數量。

最佳化索引過程

除了停用詞和詞幹提取之外,資料庫管理員還可以透過其他方式最佳化索引過程。

一些系統允許文件作者隨文件文字提供相關關鍵詞列表。這些關鍵詞可以作為索引器判斷詞語適當上下文的提示,也有助於確定文件的預期主要主題。它們還可以用於幫助索引器區分同形異義詞,即拼寫相同但含義不同的詞語(例如“mean”指“刻薄的人”和“mean”指“算術平均值”的區別)。

開發人員和管理員還可以指定使用的解析器、字典和標記型別。這些決定了文字在索引過程中如何處理、分解和分類。更換解析演算法或索引模式可以改變建立的索引結構、其在不同型別查詢下的效能以及它在適應複雜查詢方面的靈活性。

另一個對未來查詢影響很大的影響點是權衡文件文字中的不同因素。例如,管理員可以為文件標題中包含的詞語(而不是其腳註中的詞語)分配更高的“權重”或相關性。根據系統不同,這可能相當複雜和富有表現力。例如,您可以在分析文件標題時使用特定主題的詞語列表,為與該主題相關的術語在每個文件的基礎上分配更高的權重。

影響查詢引擎

對於大多數全文搜尋系統來說,在實際查詢過程中允許表達性也很重要。查詢介面可以透過多種不同方式展現這種表達性。

增加使用者在查詢結構化專案時控制級別最簡單的方法之一是允許按欄位搜尋。這在非結構化文字中不太相關,但與元資料結合使用時,透過作者、出版日期、標題、型別等欄位進行搜尋會非常有用。對於可能值數量較少的欄位,可以直接在介面中選擇它們,而不是進行搜尋,以提高可用性。

複合查詢運算子是全文搜尋工具允許使用者影響查詢引擎的另一種簡單方式。這使使用者能夠使用簡單的布林邏輯(如“and”用於包含必須存在的多個術語,“or”用於包含替代項)來構建查詢。它還可以透過允許使用者提供不應包含的術語列表、必須存在的短語或考慮文字中單詞之間鄰近度的查詢來實現更復雜的功能。

搜尋介面影響查詢引擎的另一個重要方式是啟用“嚴格”查詢模式。雖然在常規操作中包含近似匹配可能很有用,但有時只搜尋給定的精確單詞或短語會更有幫助。允許使用者在模糊匹配和精確匹配之間切換查詢模式會增加顯示相關結果的可能性。

結論

在本文中,我們討論了什麼是全文搜尋,並介紹了一些其背後的核心概念。我們討論了全文搜尋與傳統資料庫查詢之間的區別,解釋了為什麼索引在此上下文中至關重要,並回顧了在設計搜尋索引時可能需要考慮的一些因素。

全文搜尋是一個極其廣泛的主題,包含許多細微差別、最佳化、平衡考量和實現。雖然本文並非旨在成為一個權威資源,但它希望能為您在持續學習中奠定堅實的理念基礎。

關於作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以來一直撰寫關於資料庫、Linux、基礎設施和開發工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必以第三人稱寫作,這對所有相關方來說都是一種解脫。
© . This site is unofficial and not affiliated with Prisma Data, Inc.