全文檢索 contains函數

CONTAINS

是一個述語,用來搜尋包含字元資料型別的資料行中精確或模糊 (比較不精確) 符合單字或片語,與文字在特定距離內的文字或加權匹配。CONTAINS 可以搜尋︰

單字或片語。

單字或片語的字首。

接近另一個字的單字。

由另一個字變化而來的單字 (例如,單字 drive 可變化出 drives、drove、driving 與 driven)。

比另一個字的指定加權還高的單字。

您可以使用 CONTAINS 述詞 (Predicate) 來搜尋資料庫中的特定片語。當然,這樣的查詢也可以寫成 LIKE 述詞。不過,許多 CONTAINS 形式提供的文字查詢功能遠比 LIKE 來得多。此外,與使用 LIKE 述詞不同的是,CONTAINS 搜尋一定不區分大小寫。

附註  對於有必要區分大小的語言 (大部分拉丁語系),全文檢索搜尋查詢才會以不區分大小寫的方式運作。但在日文裏,有多重發音拼字法,它的拼音正規化概念就類似不區分大小寫 (例如,kana = insensitivity)。這類拼字法正規化並未支援。

假設要在 Northwind 資料庫中搜尋 "bean curd" 這個片語。若您使用 CONTAINS 述詞,這將是非常簡單的查詢。

USE Northwind 
GO
SELECT Description
FROM Categories
WHERE Description LIKE '%bean curd%'
GO

 

或者,使用 CONTAINS:

USE Northwind
GO
SELECT Description
FROM Categories
WHERE CONTAINS(Description, ' "bean curd" ')
GO

CONTAINS 述詞使用函數表示法,把第一個參數作為搜尋資料行的名稱,第二個參數做為全文檢索搜尋的條件。搜尋條件 (這裏是 "bean curd") 有時候相當複雜,並由多個詞彙組成,這將在稍後描述。

CONTAINS 述詞支援複雜的語法,可在字元資料行中搜尋:

  • 一個或多個特定的字組和/或片語 (簡單項)。
       

    字組是指沒有空白或標點的一或多個字元。有效片語可包含多個字組與空白,其中可能有也可能沒有標點。例如,croissant 是一個字組,而 café au lait 則是一個片語。這類字組與片語稱為簡單詞彙。  
       

  • 特定字組的字形變化 (衍生項)。
       

    例如,搜尋 drive 這個字的字形變化如果資料表的資料列中有 drive、drives、drove、driving 與 driven,就都會出現在結果集中,因為這都是由 drive 這個字產生的字形變化
       

  • 以指定文字開始的字組或片語 (前置項目)。
       

    對於片語,片語中的每個字組都是一個前置詞。例如,auto tran* 這一項符合自動傳輸 (automatic transmission) 與汽車能量轉換器 (automobile transducer)。
       

  • 使用加權值的字組或片語 (加權項)。
       

    例如,若要尋找指定加權高於其他字組的字組。它會傳回分級的查詢結果。


       
  • 鄰近另一個字組或片語的字組或片語 (相近詞)。
       

    例如,可以尋找 ice 這個字在 hockey 字附近的資料列,或 ice skating 片語在 ice hockey 片語附近的資料列.

CONTAINS 述詞可以使用 AND 與 OR,結合數個這類項目,例如,在同一個啟用全文檢索資料庫資料行中尋找內含 latte 與 New York-style bagel 的資料列。此外,使用 AND NOT 可以取消某些項,例如包含 bagel 但不包含 cream cheese。

使用 CONTAINS 時請記住,SQL Server 會丟棄搜尋條件中的干擾字組。干擾字組是指 a、and、is 或 the 等,這類字經常出現,但對於搜尋特定文字卻沒有實質幫助。

語法

CONTAINS
    ( { column | * } , '< contains_search_condition >'
    )

< contains_search_condition > ::=
        
{ < simple_term >
        | < prefix_term >
        | < generation_term >
        | < proximity_term >
        |  < weighted_term >
        }
        | { ( < contains_search_condition > )
        { AND | AND NOT | OR } < contains_search_condition > [ ...n ]
        }

< simple_term > ::=
    word | " phrase "

< prefix term > ::=
    { "word * " | "phrase * " }

< generation_term > ::=
    FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] )

< proximity_term > ::=
    { < simple_term > | < prefix_term > }
    { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]

< weighted_term > ::=
    ISABOUT
        ( { {
                < simple_term >
                | < prefix_term >
                | < generation_term >
                | < proximity_term >
                }
            [ WEIGHT ( weight_value ) ]
            [ ,...n ]
        )

引數

column

為註冊全文搜尋的資料行名稱。字元字串資料型別的資料行是有效的全文搜尋資料行。

*

指定資料表中登錄為全文檢索的所有資料行都用來搜尋包含搜尋條件。如果 FROM 子句中有多個資料表,則 * 必須用資料表名稱來驗證。

指定 column 中要搜尋的部份文字。無法在搜尋條件中使用變數。

word

是無空格或標點符號的字元字串。

phrase

是每個字之間有空格的一個或多個字。

附註  部份語言 (例如亞洲語言) 的片語中可以包含一個或多個字,且其間沒有空格。

 

< simple_term >

指定符合正確的字 (在單位元組語言中無空格或標點符號的一個或多個字元) 或片語 (在單位元組語言中以空格或標點符號隔開的一個或多個連續字)。有效的簡單辭彙如 "blue berry"、blueberry 與 "Microsoft SQL Server"。片語應以雙引號 ("") 括住。片語中的字必須依照 中指定在資料庫資料行顯示的次序來顯示。搜尋單字或片語中的字元是不分大小寫的。全文檢索資料行中的冠詞 (例如 a、and 或 the) 不會儲存在全文檢索中。如果在單字搜尋中使用冠詞,SQL Server 會傳回指出冠詞只能出現在查詢中的錯誤訊息。 SQL Server在 /Mssql/Ftdata/Sqlserver/Config 目錄中含有標準的冠詞清單。

標點符號會予以忽略。因此,CONTAINS(testing, "computer failure") 會找出資料列中相符的值:"Where is my computer?Failure to find it would be expensive."。

指定符合以指定文字為開頭的單字或片語。 以雙引號 ("") 括住前置詞,並且在結尾的雙引號之前加入星號 (*),這樣,以星號之前所指定簡單字詞為開頭的所有文字都會符合。 此子句應該指定如下:星號可符合 (根字或單字或片語的) 零個、一或多個字元。 如果未使用雙引號分隔文字及星號,例如:CONTAINS (column, 'text*'),則全文檢索會將星號視為字元,並且將搜尋完全符合 text* 的資料。

當片語中有 時,包含在片語中的每個字都會當作個別字首來看待。因此,指定字首辭彙 "local wine *" 的查詢可符合具有文字 "local winery"、"locally wined and dined" 等等的任何資料列。

指定所含的簡單辭彙包含要搜尋的原始單字的變化時要符合該字。

INFLECTIONAL
指定複數與單數,以及名詞、動詞、及形容詞的性別與中性形式必須相符。 動詞的各種時態也應該相符。

指定 並不會符合名詞和動詞。

指定要符合的單字或片語必須接近另一個字。 的操作類似於 AND 運算子:兩者都要求所搜尋的資料行中要存在多個字或片語。當 的愈接近時,就能符合得更好。

NEAR | ~
指出 NEAR 或 ~ 運算子左邊的單字或片語應該約略近似 NEAR 或 ~ 運算子右邊的單字或片語。多個相似辭彙可以鏈結,例如:
a NEAR b NEAR c 

這表示單字或片語 a 應該近似單字或片語 b,而 b 應該近似單字或片語 c。

Microsoft® SQL Server™ 排列左邊與右邊文字或片語的距離的順序。低順序值 (例如 0) 表示兩個字相差太遠。如果指定的單字或片語相差太遠,則可考慮滿足查詢,但查詢的順序值很低 (0)。不過,如果 只包含一個或多個 NEAR 近似辭彙,SQL Server 並不會傳回具有低順序值 0 的資料列。如需有關順序的詳細資訊,請參閱 CONTAINSTABLE。

指定符合的資料列 (由查詢傳回) 符合單字或片語清單,選擇性地各指定加權值。

ISABOUT
指定 關鍵字。
WEIGHT (weight_value )
指定介於 0.0 至 1.0 之間的加權值。 中的各元件可能包含 weight_valueweight_value 是變更查詢的各部份如何影響指派至符合查詢的各資料列的順序值的方法。加權會強制以不同方式量測順序值,因為 的所有元件可搭配使用以決定是否符合。如果符合任何 ISABOUT 參數之一,則傳回資料列,不論是否指派加權值。若要決定指出傳回的資料列符合程度的各傳回的資料列的順序值,請參閱 CONTAINSTABLE。

AND | AND NOT | OR

指定兩個包含搜尋條件之間的邏輯運算。當 包含括住的群組時,會先評估這些括住的群組。在評估括住的群組之後,在搭配邏輯運算子使用包含搜尋條件時,可以套用下列規則:

  • NOT 套用於 AND 之前。

  • NOT 只發生於 AND 之後,例如 AND NOT。不可使用 OR NOT 運算子。在第一個辭彙之前不可指定 NOT (例如 CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' )。

  • AND 套用於 OR 之前。

  • 相同型別的 (AND, OR) 的布林運算子有關連,因此可依任何次序套用。

n

是指出可在其中指定多個包含搜尋條件和辭彙的替代符號。

備註

如果相容層級低於 70,不會將 CONTAINS 當作關鍵字。如需詳細資訊,請參閱 sp_dbcmptlevel。

範例
A. 使用有 的 CONTAINS

這一範例會找出價格為 $15.00 且包含單字 "bottles" 的所有產品。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
   AND CONTAINS(QuantityPerUnit, 'bottles')
GO
B. 使用 CONTAINS 和 中的片語

這一範例會傳回包含片語 "sasquatch ale" 或 "steeleye stout" 的所有產品。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ')
GO
C. 使用有 的 CONTAINS

這一範例會傳回 ProductName 資料行中至少有一個字以字首 chos 開頭的所有產品的名稱。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')
GO
D. 使用 CONTAINS 和有 的 OR

這一範例會傳回包含字串 " sea" 或 "bread" 的所有類別描述。

USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO
E. 使用有 的 CONTAINS

這一範例會傳回具有近似 "spread" 的單字 "Boysenberry" 的所有產品的名稱。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO
F. 使用有 的 CONTAINS

這一範例會搜尋具有單字 dry 的各種形式的所有產品:dried、drying 等等。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO
G. 使用有 的 CONTAINS

這一範例會搜尋包含單字 "spread"、" sauces" 或 "relishes" 的所有產品的名稱,每個字有不同的加權。

USE Northwind
GO
SELECT CategoryName, Description
FROM Categories
WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8), 
   sauces weight (.4), relishes weight (.2) )' )
GO
H. 使用含有變數的 CONTAINS

本範例將使用變數取代特定的搜尋字詞。

USE pubs
GO
DECLARE @SearchWord varchar(30)
SET @SearchWord ='Moon'
SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)
 
 

你可能感兴趣的:(全文檢索 contains函數)