使用 NEAR 搜尋靠近另一個單字的字詞

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

您可以在 CONTAINS 述詞或 CONTAINSTABLE 函式中使用「鄰近字詞」NEAR,以便搜尋彼此接近的單字或片語。

NEAR 的概觀

NEAR 具有下列功能:

  • 您可以指定分隔第一個和最後一個搜尋字詞之非搜尋字詞的數目上限。

  • 您可以依任何順序來搜尋單字或片語,或依特定順序來搜尋單字或片語。

  • 您可以指定分隔第一個和最後一個搜尋字詞之非搜尋字詞的數目上限 (或「最大距離」),以便構成符合項目。

  • 如果您指定了詞彙的數目上限,也可以指定符合項目必須按照指定的順序包含搜尋字詞。

若要成為符合項目,文字字串必須:

  • 以其中一個指定的搜尋字詞為開頭,並且以其中一個指定的其他搜尋字詞為結尾。

  • 包含所有指定的搜尋字詞。

  • 出現在第一個和最後一個搜尋字詞之間的非搜尋字詞 (包括停用字詞) 數目必須小於或等於最大距離 (如果指定最大距離的話)。

NEAR 的語法

NEAR 的基本語法如下:

 NEAR (  
  
 {  
  
 *search_term* [ ,...*n* ]  
  
 |  
  
 (*search_term* [ ,...*n* ] ) [, <maximum_distance> [, <match_order> ] ]  
  
 }  
  
 )  

如需語法的詳細資訊,請參閱 CONTAINS (Transact-SQL)

範例

範例 1

例如,您可以搜尋與 '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 中的物件總管,會自動反轉以由右至左書寫語言所指定單字的顯示順序。

範例 2

下列範例會在 Production.Document 範例資料庫的 AdventureWorks 資料表中搜尋包含與 "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  

最大距離的測量方式

特定的最大距離 (例如 10 或 25) 會決定給定字串中出現在第一個和最後一個搜尋字詞之間的非搜尋字詞 (包含停用字詞) 數目。 例如, NEAR((dogs, cats, "hunting mice"), 3) 會傳回下列資料列,其中非搜尋字詞的總數是三 ("enjoy"、"but" 和 "avoid"):

"Catsenjoyhunting mice``, but avoiddogs``."

相同的相近詞彙不會傳回下列資料列,因為四個非搜尋字詞 ("enjoy"、"but"、"usually" 和 "avoid") 超過了最大距離:

"Catsenjoyhunting mice``, but usually avoiddogs``."

合併使用 NEAR 與其他詞彙

您可以合併使用 NEAR 與一些其他詞彙。 您可以使用 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')  

您無法將 NEAR 與衍生詞彙 (ISABOUT ...) 或加權詞彙 (FORMSOF ...) 合併使用。

深入了解鄰近搜尋

  • 搜尋字詞的重疊項目

    所有鄰近搜尋都只會尋找非重疊項目。 搜尋字詞的重疊項目絕對不會成為符合項目。 例如,請考慮下列相近詞彙,它會按照此順序搜尋最大距離為兩個詞彙的 "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 (不論是否指定最大距離) 表示詞彙之間的邏輯距離,而非詞彙之間的絕對距離。 例如,在某個段落中,不同片語或句子內的詞彙會比相同片語或句子內的詞彙被視為距離較遠,不論其實際距離為何都一樣,不過前提是它們都互不相關。 同樣地,不同段落中的詞彙則被視為距離更遠。 如果某個符合項目跨越句子、段落或章節的結尾,用於排列文件等級的間距會分別增加 8、128 或 1024。

  • 相近詞彙對於 CONTAINSTABLE 函數排列等級的影響

    在 CONTAINSTABLE 函數中使用 NEAR 時,文件的叫用次數相對於其長度以及每次叫用中第一個和最後一個搜尋字詞之間的距離就會影響每份文件的等級。 對於泛型相近詞彙而言,如果符合的搜尋字詞距離 >50 個邏輯詞彙,針對文件傳回的等級就是 0。 若為沒有指定整數做為最大距離的自訂相近詞彙,只包含間距 >100 個邏輯詞彙之叫用的文件將收到的等級為 0。 如需自訂鄰近搜尋等級的詳細資訊,請參閱限制 RANK 的搜尋結果

  • [轉換非搜尋字] 伺服器選項

    如果您在鄰近搜尋中指定停用字詞,則 [轉換非搜尋字] 的值會影響 SQL Server 處理停用字詞的方式。 如需詳細資訊,請參閱 轉換非搜尋字伺服器組態選項

另請參閱

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
使用全文檢索搜尋查詢