共用方式為


使用 XML 資料行進行全文檢索搜尋

您可以在 XML 資料行上建立全文檢索索引,以檢索 XML 值的內容,但忽略 XML 標記。 元素標記會當做 Token 界限來使用。 將索引下列項目:

  • XML 元素的內容。

  • 僅限最上層元素之 XML 屬性的內容,除非這些值是數值。

在可能的情況下,您可以用下列方法將全文檢索搜尋與 XML 索引合併:

  1. 首先,使用 SQL 全文檢索搜尋來篩選出感興趣的 XML 值。

  2. 接著,查詢那些在 XML 資料行上使用 XML 索引的 XML 值。

範例:結合全文搜索與 XML 查詢

在 XML 資料行上建立全文檢索之後,下列查詢會確認 XML 值在書名中有包含 "custom" 這個字:

SELECT *   
FROM   T   
WHERE  CONTAINS(xCol,'custom')   
AND    xCol.exist('/book/title/text()[contains(.,"custom")]') =1  

contains() 方法會使用全文檢索索引來篩選文件中包含任意位置「custom」這個字的 XML 值。 exist() 子句可確保 「custom」 一詞發生在書籍的標題中。

使用 contains() 和 XQuery contains() 的全文搜索具有不同的語意。 後者是子字串匹配,前者則是使用詞幹提取的標記匹配。 因此,如果搜尋標題中有「run」的字串,符合條件的專案會包括「run」、「runs」和「running」,因為滿足全文搜索 contains() 和 Xquery contains()。 不過,因為查詢與標題中的「可自訂」一詞不符,全文檢索 contains() 失敗,而 Xquery contains() 則得以滿足。 一般而言,針對純子字串比對,應該移除全文包含 contains() 子句。

此外,全文搜索會使用字幹分析,但 XQuery contains() 進行的是字面匹配。 下一個範例將舉例說明之間的差異。

範例:使用詞幹分析進行 XML 值的全文檢索

XQuery contains() 檢查已在上一個範例中執行,通常無法排除。 請考量這項查詢:

SELECT *   
FROM   T   
WHERE  CONTAINS(xCol,'run')   

文件中的 "ran" 之所以能夠符合搜尋條件,是因為使用了詞幹提取。 此外,不會使用 XQuery 檢查搜尋內容。

使用已編製全文檢索索引的 AXSD 將 XML 分解成關係型數據行時,透過 XML 檢視發生的 XPath 查詢不會在基礎表上執行全文搜索。

另請參閱

XML 索引 (SQL Server)