使用 NEAR 搜尋靠近另一個單字的字詞
您可以在 CONTAINS 述詞或 CONTAINSTABLE 函式中使用鄰近字詞 (NEAR) 來搜尋彼此附近的單字或片語。 您也可以指定分隔第一個和最後一個搜尋字詞之非搜尋字詞的數目上限。 此外,您可以依任何順序搜尋單字或片語,也可以依您指定字詞的順序搜尋單字和片語。 SQL Server 2014 同時支援先前的泛 型鄰近詞彙,現在已被取代,以及 SQL Server 2012 中新增的自定義鄰近詞彙。
自定義鄰近詞彙
自定義鄰近詞彙引進下列新功能:
您可以指定分隔第一個和最後一個搜尋字詞之非搜尋字詞的數目上限 (或「最大距離」),以便構成符合項目。
如果您指定了詞彙的數目上限,也可以指定符合項目必須按照指定的順序包含搜尋字詞。
若要成為符合項目,文字字串必須:
以其中一個指定的搜尋字詞為開頭,並且以其中一個指定的其他搜尋字詞為結尾。
包含所有指定的搜尋字詞。
如果指定的話,非搜尋字詞的數目,包括停用字詞,在前一個搜尋字詞與最後一個搜尋字詞之間必須小於或等於最大距離。
基本語法為:
NEAR(
{
search_term [ ,...n ]
|
(search_term [ ,...n ] [, maximum_distance> [, <<match_order> ] ]
}
)
注意
如需custom_proximity_term語法的詳細資訊<,請參閱 CONTAINS (Transact-SQL) 。>
例如,您可以搜尋與 'Smith' 距離兩個詞彙以內的 'John',如下所示:
CONTAINS(column_name, 'NEAR((John, Smith), 2)')
符合的部分字串範例包括 "John Jacob Smith
" 和 "Smith, John
"。 "John Jones knows Fred Smith
" 字串包含三個中介非搜尋字詞,所以它不是符合項目。
若要要求按照指定的順序尋找詞彙,您會將範例相近詞彙變更為 NEAR((John, Smith),2, TRUE).
。這樣就會搜尋與 "John
" 距離兩個詞彙以內的 "Smith
",但是只有當 "John
" 在 "Smith
" 前面時才符合。 在由左至右閱讀的語言 (例如英文) 中,符合的字串範例為 "John Jacob Smith
"。
請注意,若為由右至左閱讀的語言 (例如阿拉伯文或希伯來文),全文檢索引擎就會按照反向順序套用指定的詞彙。 此外,SQL Server Management Studio 中的物件總管,會自動反轉以由右至左書寫語言所指定單字的顯示順序。
注意
如需詳細資訊,請參閱本主題稍後的<
測量最大距離的方式
特定的最大距離 (例如 10 或 25) 會決定給定字串中出現在第一個和最後一個搜尋字詞之間的非搜尋字詞 (包含停用字詞) 數目。 例如, NEAR((dogs, cats, "hunting mice"), 3)
會傳回下列資料列,其中非搜尋字詞的總數是三 ("enjoy
"、"but
" 和 "avoid
"):
“Cats
enjoy
hunting mice``, but avoid
dogs``.
相同的相近詞彙不會傳回下列資料列,因為四個非搜尋字詞 ("enjoy
"、"but
"、"usually
" 和 "avoid
") 超過了最大距離:
“Cats
enjoy
hunting mice``, but usually avoid
dogs``.
結合自定義鄰近詞彙與其他詞彙
您可以將自定義鄰近詞彙與其他一些詞彙結合。 您可以使用 AND (&)、OR (|) 或 AND NOT (&!) 來結合自訂鄰近字詞與其他自訂鄰近字詞、不可分割的字詞或前置字詞。 例如:
CONTAINS('NEAR(term1,term2),5) and term3')
CONTAINS('NEAR(term1,term2),5) OR term3')
CONTAINS('NEAR(term1,term2),5) AND NOT term3')
CONTAINS('NEAR(term1,term2),5) and NEAR(term3,term4,2)')
CONTAINS('NEAR(term1,term2),5) OR NEAR(term3,term4),2, TRUE)')
例如,
CONTAINS(column_name, 'NEAR((term1, term2), 5, TRUE) AND term3')
您無法將自定義鄰近詞彙與一般鄰近詞彙(term1 NEAR term2)、世代詞彙(ISABOUT ...)或加權詞彙 (FORMSOF ...) 結合。
範例:使用自定義鄰近詞彙
下列範例會在 Production.Document
範例資料庫的 AdventureWorks2012
資料表中搜尋包含與 "bracket" 一字位於相同文件中之 "reflector" 一字的所有文件摘要。
SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable
INNER JOIN CONTAINSTABLE(Production.Document, Document,
'NEAR(bracket, reflector)' ) AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC;
GO
鄰近搜尋的其他考慮
本節討論影響泛型和自定義鄰近搜尋的考慮:
搜尋字詞的重疊項目
所有鄰近搜尋都只會尋找非重疊項目。 搜尋字詞的重疊項目絕對不會成為符合項目。 例如,請考慮下列相近詞彙,它會按照此順序搜尋最大距離為兩個詞彙的 "
A
" 和 "AA
":CONTAINS(column_name, 'NEAR((A,AA),2, TRUE')
可能的符合項目為 "
AAA
"、"A.AA
" 和 "A..AA
"。 只包含 "AA
" 的資料列則不符合。注意
您可以指定重疊的詞彙,例如
NEAR("mountain bike", "bike trails")
或(NEAR(comfort*, comfortable), 5)
。 指定重疊的詞彙會增加可能的符合項目排列,因而增加查詢的複雜性。 如果您大量指定這類重疊的詞彙,查詢可能會耗盡資源並失敗。 如果發生這種情況,請簡化查詢,然後再試一次。泛型 NEAR 和自定義 NEAR (不論是否指定最大距離)都表示詞彙之間的邏輯距離,而不是兩者之間的絕對距離。 例如,在某個段落中,不同片語或句子內的詞彙會比相同片語或句子內的詞彙被視為距離較遠,不論其實際距離為何都一樣,不過前提是它們都互不相關。 同樣地,不同段落中的詞彙則被視為距離更遠。 如果某個符合項目跨越句子、段落或章節的結尾,用於排列文件等級的間距會分別增加 8、128 或 1024。
相近詞彙對於 CONTAINSTABLE 函數排列等級的影響
在 CONTAINSTABLE 函數中使用 NEAR 時,文件的叫用次數相對於其長度以及每次叫用中第一個和最後一個搜尋字詞之間的距離就會影響每份文件的等級。 對於泛型相近詞彙而言,如果符合的搜尋字詞距離 >50 個邏輯詞彙,針對文件傳回的等級就是 0。 若為沒有指定整數做為最大距離的自訂相近詞彙,只包含間距 >100 個邏輯詞彙之叫用的文件將收到的等級為 0。 如需自訂鄰近搜尋等級的詳細資訊,請參閱限制 RANK 的搜尋結果。
[轉換非搜尋字] 伺服器選項
如果您在鄰近搜尋中指定停用字詞,則 [轉換非搜尋字] 的值會影響 SQL Server 處理停用字詞的方式。 如需詳細資訊,請參閱 轉換非搜尋字伺服器組態選項。
已被取代的泛型鄰近詞彙
重要
未來的 Microsoft SQL Server 版本將移除這項功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 我們建議您使用 自定義鄰近詞彙。
泛型鄰近字詞表示指定的搜尋字詞必須全部出現在檔中,才能傳回相符專案,而不論搜尋字詞之間的非搜尋字詞數目( 距離)。 基本語法為:
{ search_term { NEAR | ~ } search_term } [ ,...n ]
例如,在下列範例中,'fox' 和 'chicken' 兩個字必須以任一順序出現,才能產生相符專案:
CONTAINS(column_name, 'fox NEAR chicken')
CONTAINSTABLE(table_name, column_name, 'fox ~ chicken')
注意
如需generic_proximity_term>語法的相關信息<,請參閱 CONTAINS (Transact-SQL) 。
如需詳細資訊,請參閱本主題稍後的<
結合泛型鄰近詞彙與其他詞彙
您可以使用 AND (&)、OR (|) 或 AND NOT (&!) 來結合泛型鄰近詞彙與另一個泛型鄰近詞彙、簡單詞彙或前置詞字詞。 例如:
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
)
您無法將泛型鄰近詞彙與自定義鄰近詞彙結合,例如 NEAR((term1,term2),5)
、加權字詞 (ISABOUT ...),或世代詞彙 (FORMSOF ...)。
範例:使用泛型鄰近詞彙
下列範例會使用泛型鄰近詞彙,在與 “bracket” 一詞相同的檔中搜尋 “reflector” 這個字。
USE AdventureWorks2012;
GO
SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable INNER JOIN
CONTAINSTABLE(Production.Document, Document,
'(reflector NEAR bracket)' ) AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
請注意,您也可以反轉 CONTAINSTABLE 中的字詞,以取得相同的結果:
CONTAINSTABLE(Production.Document, Document, '(bracket NEAR reflector)' ) AS KEY_TBL
您可以使用底狀字元 (~) 取代舊版查詢中的 NEAR 關鍵詞,並取得相同的結果:
CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket)' ) AS KEY_TBL
在搜尋條件中可以指定兩個以上的單字或片語。 例如,可以寫入:
CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket ~ installation)' ) AS KEY_TBL
這表示「反映器」 必須位於與 「bracket」 相同的檔中,而 「bracket」 必須位於與 「installation」 相同的檔中。
另請參閱
CONTAINSTABLE (Transact-SQL)
使用全文檢索搜尋查詢
CONTAINS (Transact-SQL)