全文檢索搜尋使用者入門

SQL Server 中的資料庫預設會啟用全文檢索。不過,若要針對資料表使用全文檢索索引,您必須在要以全文檢索引擎存取的資料表資料行中設定全文檢索索引功能。

這項作業包含下列基本步驟:

  1. 建立全文檢索目錄以儲存全文檢索索引。

    每個全文檢索索引都必須屬於一個全文檢索目錄。您可以針對每個全文檢索索引建立個別的文字目錄,也可以讓多個全文檢索索引與給定的目錄產生關聯。

    [!附註]

    從 SQL Server 2008 開始,全文檢索目錄是虛擬物件,而且不屬於任何檔案群組。全文檢索目錄是參考一組全文檢索索引的邏輯概念。

  2. 針對資料表或索引檢視表建立全文檢索索引。

    全文檢索索引是一種特殊類型的 Token 式功能索引,由全文檢索引擎所建立與維護。若要針對資料表或檢視表建立全文檢索搜尋,它必須具有唯一、單一資料行且不可為 Null 的索引。全文檢索引擎需要使用此唯一索引,將資料表中的各資料列對應至唯一且可壓縮的索引鍵。全文檢索索引可包括 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max) 資料行。如需詳細資訊,請參閱<全文檢索索引概觀>。

學習建立全文檢索索引之前,請務必了解全文檢索索引與一般 SQL Server 索引的差異。下表將列出這些差異。

全文檢索索引

一般 SQL Server 索引

每個資料表只允許有一個全文檢索索引。

每個資料表允許有多個一般索引。

將資料加入至全文檢索索引的作業稱為「母體擴展」(Population),可透過排程或特定的要求來要求執行,也可在加入新的資料時自動執行。

當依據的資料有插入、更新或刪除時,會自動更新索引內容。

在相同的資料庫中分組為一或多個全文檢索目錄。

沒有分組。

建立全文檢索索引的考量

本節內容包括下列主題:

  • 選擇資料行語言

  • 選擇全文檢索索引的檔案群組

  • 將全文檢索索引指派給全文檢索目錄

  • 將停用字詞表與全文檢索索引產生關聯

  • 更新全文檢索索引

選擇資料行語言

如需有關選擇資料行語言時應考慮哪些事項的詳細資訊,請參閱<建立全文檢索索引時選擇語言的最佳作法>。

選擇全文檢索索引的檔案群組

建立全文檢索索引的程序需要大量 I/O (在較高層次中,此程序包括從 SQL Server 中讀取資料,然後將篩選的資料傳播至全文檢索索引)。最佳作法是將全文檢索索引放置於最適合將 I/O 效能發揮到極致的資料庫檔案群組中,或是將全文檢索索引放置於另一個磁碟區的不同檔案群組中。

如果管理方便對您很重要,我們建議您將資料表資料及任何附屬的全文檢索目錄儲存在相同檔案群組中。有時候,基於效能的考量,您可能會想要將資料表資料和全文檢索索引存放在儲存於不同磁碟區上的不同檔案群組中,以便有效發揮 I/O 平行處理原則。

將全文檢索索引指派給全文檢索目錄

在全文檢索目錄中,規劃資料表之全文檢索索引的位置是相當重要的步驟。

我們建議您在相同的全文檢索目錄底下,將具有相同更新特性的資料表 (例如少量變更與大量變更,或在每日特定時段頻繁變更的資料表) 產生關聯。透過設定全文檢索目錄的母體擴展排程,在高度資料庫活動期間,全文檢索索引仍然能夠保持與資料表同步,而不會對資料庫伺服器的資源使用量造成負面影響。

當您將資料表指派給全文檢索目錄時,請考量下列指導方針:

  • 永遠選取最小的唯一索引,做為全文檢索唯一索引鍵。(四個位元組的整數式索引最好)。如此可大幅減少 Microsoft Search Service 在檔案系統中所需的資源。如果主索引鍵較大 (超過 101 個位元組) 時,可考慮選擇資料表中其他的唯一索引,做為全文檢索唯一的索引鍵 (或建立另一個唯一索引)。若全文檢索唯一索引鍵的大小超過允許的最大值 (900 個位元組) 時,將無法執行全文檢索的母體擴展作業。

  • 如果您正在針對包含數百萬資料列的資料表建立索引,請將此資料表指派給它本身的全文檢索目錄。

  • 考慮正在建立全文檢索索引之資料表中發生的變更數量,以及資料列總數。如果變更的資料列總數,與上次執行全文檢索母體擴展的資料列總和超過百萬,請將此資料表指派給它本身的全文檢索目錄。

將停用字詞表與全文檢索索引產生關聯

SQL Server 2008 導入了停用字詞表。「停用字詞表」(Stoplist) 是停用字詞 (也稱為非搜尋字) 的清單。停用字詞表會與每個全文檢索索引相關聯,而且該停用字詞表中的字詞會套用至該索引的全文檢索查詢。根據預設,系統停用字詞表會與新的全文檢索索引相關聯。不過,您可以改為建立並使用自己的停用字詞表。如需詳細資訊,請參閱<停止字詞和停止清單>。

例如,下列 CREATE FULLTEXT STOPLISTTransact-SQL 陳述式會透過從系統停用字詞表複製,建立名為 myStoplist3 的新全文檢索停用字詞表:

CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO

下列 ALTER FULLTEXT STOPLISTTransact-SQL 陳述式會更改名為 myStoplist 的停用字詞表,並加入 'en' 一詞 (先針對西班牙文,然後再針對法文):

ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO

更新全文檢索索引

如同一般 SQL Server 索引,當相關聯資料表中的資料變更時,就可以自動更新全文檢索索引。這是預設行為。或者,您也可以手動或以指定的排程間隔將全文檢索索引保持在最新狀態。擴展全文檢索索引可能會相當耗時而且需要大量資源,因此,索引更新通常會當做在背景中執行的非同步處理序執行並且在修改基底資料表之後,將全文檢索索引保持在最新狀態。在基底資料表每次變更之後立即更新全文檢索索引可能需要大量資源。因此,如果您設定了非常高的更新/插入/刪除速率,可能會遇到查詢效能降低的情況。如果發生這種情況,請考慮排程手動變更追蹤更新,以便偶爾與許多變更保持同步,而非與查詢爭用資源。

若要監視母體擴展狀態,請使用 FULLTEXTCATALOGPROPERTY 函數或 OBJECTPROPERTYEX 函數。若要取得目錄母體擴展狀態,請執行下列陳述式:

SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');

一般而言,如果完整母體擴展進行中,傳回的結果會是 1。

範例:在 AdventureWorks 中設定全文檢索搜尋 (Transact-SQL)

下列兩部分的範例會針對 AdventureWorks 資料庫建立名為 AdvWksDocFTCat 的全文檢索目錄,然後針對 AdventureWorks 中的 Document 資料表建立全文檢索索引。這個陳述式會在安裝期間所指定的預設目錄中建立全文檢索目錄。名為 AdvWksDocFTCat 的資料夾位於預設的目錄中。

  1. 為了建立名為 AdvWksDocFTCat 的全文檢索目錄,此範例會使用 CREATE FULLTEXT CATALOG 陳述式:

    USE AdventureWorks;
    GO
    CREATE FULLTEXT CATALOG AdvWksDocFTCat;
    
  2. 針對 Document 資料表建立全文檢索索引之前,請確定此資料表具有唯一、單一資料行且不可為 Null 的索引。下列 CREATE INDEX 陳述式會針對 Document 資料表的 DocumentID 資料行建立唯一索引 ui_ukDoc:

    CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
    
  3. 在您擁有唯一索引鍵之後,就可以使用下列 CREATE FULLTEXT INDEX 陳述式,針對 Document 資料表建立全文檢索索引。

    CREATE FULLTEXT INDEX ON Production.Document
    (
        Document                         --Full-text index column name 
            TYPE COLUMN FileExtension    --Name of column that contains file type information
            Language 2057                 --2057 is the LCID for British English
    )
    KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index
    WITH CHANGE_TRACKING AUTO            --Population type;
    GO
    

    在這個範例中定義的 TYPE COLUMN 會在資料表中指定類型資料行,其中在 'Document' 資料行的每個資料列中包含文件類型 (二進位類型)。此類型資料行會在給定的資料列中儲存使用者提供的文件副檔名,例如 ".doc" 和 ".xls"。全文檢索引擎會使用給定資料列中的副檔名來叫用正確的篩選,以便用於剖析該資料列中的資料。在此篩選已經剖析資料列的二進位資料之後,指定的斷詞工具將會剖析內容 (在此範例中,將會使用英式英文的斷詞工具)。請注意,當全文檢索索引已啟用自動變更追蹤時,篩選程序只會在建立索引時進行,或在使用者於基底資料表中插入或更新資料行時進行。如需詳細資訊,請參閱<全文檢索搜尋篩選>。

檢視全文檢索索引的相關資訊

目錄或動態管理檢視

說明

sys.fulltext_index_catalog_usages (Transact-SQL)

針對通往全文檢索索引參考的每個全文檢索目錄,各傳回一個資料列。

sys.fulltext_index_columns (Transact-SQL)

針對屬於全文檢索索引一部分的每個資料行,各包含一個資料列。

sys.fulltext_index_fragments (Transact-SQL)

全文檢索索引會使用稱為「全文檢索索引片段」的內部資料表來儲存反向索引資料。此檢視表可用來查詢有關這些片段的中繼資料,此檢視表針對每一個資料表內包含全文檢索索引的每一個全文檢索索引片段各包含一個資料列。

sys.fulltext_indexes (Transact-SQL)

針對表格式物件的每個全文檢索索引,各包含一個資料列。

sys.dm_fts_index_keywords (Transact-SQL)

針對指定的資料表傳回全文檢索索引之內容的相關資訊。

sys.dm_fts_index_keywords_by_document (Transact-SQL)

針對指定的資料表傳回全文檢索索引之文件層級內容的相關資訊。給定的關鍵字可能會出現在許多份文件中。

sys.dm_fts_index_population (Transact-SQL)

傳回有關目前進行中之全文檢索索引母體擴展的資訊。