使用 NEAR 搜尋靠近另一個單字的字詞
您可以在 CONTAINS 述詞或 CONTAINSTABLE 函數中使用相近詞彙 (NEAR),以便搜尋彼此靠近的單字或片語。 您也可以指定分隔第一個和最後一個搜尋詞彙之非搜尋詞彙的數目上限。 此外,您也可以依任何順序或是您所指定的順序來搜尋單字或片語。 SQL Server 2012 支援舊版的泛型相近詞彙 (目前已被取代) 和自訂相近詞彙 (SQL Server 2012 中的新功能)。
本主題內容
自訂相近詞彙
鄰近搜尋的其他考量
已被取代的泛型相近詞彙
自訂相近詞彙
自訂相近詞彙導入下列新功能:
您可以指定分隔第一個和最後一個搜尋詞彙之非搜尋詞彙的數目上限 (或「最大距離」(Maximum Distance)),以便構成符合項目。
如果您指定了詞彙的數目上限,也可以指定符合項目必須按照指定的順序包含搜尋詞彙。
若要成為符合項目,文字字串必須:
以其中一個指定的搜尋詞彙為開頭,並且以其中一個指定的其他搜尋詞彙為結尾。
包含所有指定的搜尋詞彙。
出現在第一個和最後一個搜尋詞彙之間的非搜尋詞彙 (包括停用字詞) 數目必須小於或等於最大距離 (如果有指定的話)。
基本語法如下:
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).。這樣就會搜尋與 "Smith" 距離兩個詞彙以內的 "John",但是只有當 "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 …)。
範例:使用自訂相近詞彙
下列範例會在 AdventureWorks2008 範例資料庫的 Production.Document 資料表中搜尋包含與 "bracket" 一字位於相同文件中之 "reflector" 一字的所有文件摘要。
USE AdventureWorks2012
GO
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 的搜索結果>。
transform noise words 伺服器選項
如果您在鄰近搜尋中指定停用字詞,則 transform noise words 的值會影響 SQL Server 處理停用字詞的方式。 如需詳細資訊,請參閱<轉換非搜尋字伺服器組態選項>。
[回到頁首]
已被取代的泛型相近詞彙
重要事項 |
---|
未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 我們建議您使用自訂相近詞彙。 |
泛型相近詞彙表示指定的搜尋詞彙必須全部都出現在同一份文件中,才會傳回符合項目,不論搜尋詞彙之間的非搜尋詞彙數目 (「距離」(Distance)) 為何。 基本語法如下:
{ 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
這表示 "reflector" 必須與 "bracket" 位於相同的文件中,而且 "bracket" 必須與 "installation" 位於相同的文件中。
[回到頁首]