分享⾄

簡介

資料庫系統最常⾒的功能之⼀,是能夠根據給定的查詢來檢索項⽬。雖然傳統資料庫查詢非常適合熟悉系統⼯具和資料結構的⽤⼾所下的結構化指令,但⼤多數向⽤⼾公開的搜尋功能都使⽤不同的技術。

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

全⽂搜尋 是⼀個術語,⽤於描述可在資料庫系統中搜尋⽂件完整⽂字的⼀系列技術。這與僅依賴中繼資料、部分⽂字來源和其他不完整評估的搜尋功能直接相反。

與常規資料庫查詢相⽐,全⽂搜尋具有語⾔感知能⼒。這表示它依賴對儲存⽂件和搜尋本身所使⽤語⾔的某種程度理解,以便檢索在語義上具有意義的結果。

全⽂搜尋通常也包含根據結果與使用者查詢的相對相似性來對結果進⾏排序和排序的能⼒。這可以協助引擎優先顯示最適合的結果,或取消不⾼排名的項⽬,除非明確要求。

索引的重要性

雖然許多資料庫操作可以透過索引來改善,但全⽂搜尋尤其依賴異步索引程序。

索引是剖析現有⽂件以編譯索引的程序。 索引 是⼀種更⼩、更最佳化的結構,專⾨設計⽤於快速尋找要求的項⽬。雖然⼀般資料庫索引可能會分析⼏個欄位來建立索引,但全⽂搜尋索引是透過分析⽂件的完整⽂字來建立的。

如果沒有索引,搜尋必須完成⼀個稱為 循序掃描 的程序,系統會在查詢時分析每個項⽬,以查看它們是否符合查詢條件。對於熟悉類 Unix 系統的⼈來說,這類似於使⽤ find ⼯具(在查詢期間掃描檔案系統)搜尋檔案名稱與更快速的 locate 命令之間的差異,後者依賴定期更新的索引。

索引的建立⽅式

索引程序由許多相關階段組成。⾸先,⽂件由剖析器掃描,以將⽂字劃分為個別的「語彙符號」。 語彙符號 是系統已知的離散字詞,可以根據其詞性、與相似字詞的關係等進⾏分類。

然後將語彙符號處理成 「詞素」,這是⼀個語⾔層級的意義單位。在此程序中,術語通常會標準化,以將相關字詞摺疊成單⼀條⽬,這可讓查詢引擎傳回與字⾯搜尋略有不同的相關結果。

然後將分析結果排序並儲存在最佳化的索引中,以便查詢引擎可以找到相關結果並⽐較每個⽂件的不同因素。索引包含有關每個⽂件中找到的詞素的資訊,並且可能包含其他上下⽂,例如位置資料、詞素密度等,以協助更複雜的搜尋條件。

平衡索引程序

雖然我們討論了建立全⽂索引所需的基本步驟,但我們省略了⼀些關鍵因素,這些因素會影響索引和產⽣的查詢功能。索引⽂字的⽅式有很多種,⽽您選擇執⾏的⽅式可能會對搜尋功能的效能和特性產⽣很⼤的影響。

幾乎所有索引程序都採⽤的⼀種最佳化是使⽤停⽤字。 停⽤字 是⼀系列被認為不相關或太模稜兩可⽽⽆法在搜尋期間使⽤的字詞。它們通常是⼀種語⾔中最常⾒的字詞,包含最少量的相關上下⽂。⼀些英⽂範例包括「the」、「a」和「it」。在索引期間,停⽤字會從索引中移除,這有助於保持索引更⼩且更快,以進⾏更相關的搜尋。

如前所述,索引程序也可能將緊密相關的條⽬摺疊成單⼀項⽬,以保持索引⼩巧,並為相似的查詢提供更廣泛的結果範圍。其中⼀種稱為 「詞幹提取」 的技術,結合了同⼀個字「詞幹」的變體字詞。例如,「cook」、「cooking」和「cooked」將合併為單⼀條⽬。其他技術可能會諮詢語⾔感知⼯具(如詞庫),以對應同義詞或識別可能代替某個字詞的詞組。

很多時候,您在索引期間做出的決策會影響您在查詢程序中可以獲得的搜尋結果品質。這有時被討論為優先考量召回率和精確度之間的平衡,這兩者都是⽤於描述搜尋有效性不同⽅⾯的技術術語。

召回率 是傳回的相關結果與資料集中相關結果總數的⽐率。具有⾼召回率的查詢會檢索⼤部分可能的相關結果。

與此相關的是搜尋的 精確度,它描述了傳回的結果中有多少實際上是相關的。具有⾼精確度的查詢具有有限數量的與給定查詢不太相關的結果。

諸如停⽤字之類的技術可以透過從分析中消除不重要的字詞來提⾼結果的精確度。另⼀⽅⾯,詞幹提取主要透過捕獲由於微⼩的字詞差異⽽會遺漏相關結果的實例來提⾼召回率。這兩個概念可能會相互影響,因此在建⽴索引時,必須同時考慮到這兩個概念,以確保您的結果同時具有您期望的相關性和數量。

最佳化索引程序

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

有些系統允許⽂件作者提供⼀系列相關關鍵字以及⽂件⽂字。這些可以⽤作索引器的提示,以了解字詞的適當上下⽂,並且還可以協助指示⽂件的預期主要主題。它們也可以⽤於協助索引器區分 同形異義字,即拼寫相同但可能具有不同含義的字詞(例如「刻薄」的⼈與數字集的算術「平均值」之間的差異)。

開發⼈員和管理員也可以指定使⽤的剖析器、字典和語彙符號類型。這些決定了⽂字在索引程序期間如何處理、分解和分類。切換剖析演算法或索引模式可能會變更建立的索引結構、其在不同類型查詢中的效能,以及它在適應複雜查詢⽅⾯的靈活性。

另⼀個可能對未來查詢產⽣很⼤影響的影響點是權衡⽂件⽂字中的不同因素。管理員可以為⽂件標題中包含的字詞⽽⾮其腳註中的字詞指定更⾼的 「權重」 或相關性。根據系統的不同,這可能會相當複雜且具有表現⼒。例如,您可以在分析⽂件標題時使⽤特定主題的字詞列表,以根據每個⽂件的主題為相關術語指定更⾼的權重。

影響查詢引擎

對於⼤多數全⽂搜尋系統,在實際查詢程序中允許表現⼒也很重要。查詢介⾯可以透過許多不同的⽅式來公開這種表現⼒。

增加⽤⼾在查詢結構化項⽬期間的控制層級的最簡單⽅法之⼀是允許按欄位搜尋。這在⾮結構化⽂字中不太相關,但當與中繼資料結合使⽤欄位(如作者、出版⽇期、標題、類型等)進⾏搜尋時,可能會⾮常有⽤。對於可能值較少的欄位,這些欄位可以直接在介⾯中選取,⽽⾮可搜尋,以提⾼易⽤性。

複合查詢運算符是全⽂搜尋⼯具允許⽤⼾影響查詢引擎的另⼀種簡單⽅式。這允許⽤⼾使⽤簡單的布林邏輯(如「and」)來結構化查詢,以包含應存在的⼏個術語,以及使⽤「or」來包含替代項。它還可以透過讓⽤⼾提供不應包含的術語列表、應存在的詞組或考慮⽂字中字詞之間鄰近性的查詢來啟⽤更複雜的功能。

搜尋介⾯可以影響查詢引擎的另⼀個重要⽅式是啟⽤「嚴格」查詢模式。雖然在常規操作期間包含近似匹配可能很有⽤,但有時僅搜尋給定的確切字詞或詞組會很有幫助。允許⽤⼾在模糊匹配和精確匹配之間變更查詢模式,增加了浮現相關結果的可能性。

結論

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

全⽂搜尋是⼀個⾮常⼴泛的主題,具有許多細微差別、最佳化、平衡考量和實作。雖然本文⽬的並⾮作為權威資源,但它應該可以作為⼀個強⼤的概念基礎,供您在繼續學習時以此為基礎進⾏建構。

關於作者
Justin Ellingwood

Justin Ellingwood

⾃ 2013 年以來,Justin ⼀直在撰寫關於資料庫、Linux、基礎架構和開發⼈員⼯具的文章。他⽬前與妻⼦和兩隻兔⼦住在柏林。他通常不必以第三⼈稱寫作,這對所有相關⽅來說都是⼀種解脫。