CONTAINS(Transact-SQL)

문자 기반 데이터 형식이 포함된 열에서 특정 단어나 구와 정확히 일치하거나 비슷하게 일치하는 단어를 검색하거나, 서로 근접한 단어를 검색하거나, 가중치 검색을 수행하기 위해 WHERE 절에 사용되는 조건자입니다.

SQL Server에서는 CONTAINS 또는 FREETEXT 전체 텍스트 조건자에 네 부분으로 된 이름을 사용하여 연결된 서버에 대한 쿼리를 실행할 수 있습니다.

CONTAINS는 다음을 검색할 수 있습니다.

  • 단어나 구

  • 단어나 구의 접두사

  • 다른 단어에 근접한 단어

  • 다른 단어에서 어미를 변화하여 생성된 단어(예: drive라는 단어는 drives, drove, driving, driven의 어간임)

  • 동의어 사전을 사용할 때 다른 단어의 동의어인 단어(예: metal이라는 단어에는 aluminum 및 steel 같은 동의어가 있을 수 있음)

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

CONTAINS
      ( { column_name | ( column_list ) | * } 
          , '<contains_search_condition>'     
   [ , LANGUAGE language_term ]
      ) 

<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 | THESAURUS } , <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 ] 
        ) 

<AND> ::= 
     { AND | & }

<AND NOT> ::= 
     { AND NOT | &! }

<OR> ::= 
     { OR | | }

인수

  • column_name
    FROM 절에 지정된 테이블에 대한 전체 텍스트 인덱싱된 열의 이름입니다. 열은 char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary 또는 varbinary(max) 형식일 수 있습니다.

  • column_list
    쉼표로 구분된 두 개 이상의 열을 지정합니다. column_list는 괄호로 묶어야 합니다. language_term을 지정하지 않을 경우 column_list의 모든 열에 대한 언어가 같아야 합니다.

  • *
    지정한 검색 조건에 대해 쿼리가 FROM 절에 지정된 테이블에 대한 모든 전체 텍스트 인덱싱된 열을 검색하도록 지정합니다. CONTAINS 절의 열은 전체 텍스트 인덱스가 있는 단일 테이블에서 가져와야 합니다. language_term을 지정하지 않을 경우 테이블의 모든 열에 대한 언어가 같아야 합니다.

  • LANGUAGE language_term
    단어 분리, 형태소 분석, 동의어 사전 확장 및 대체, 의미 없는 단어 또는 중지 단어 제거를 위해 쿼리의 일부로 사용할 언어입니다. 이 매개 변수는 선택 사항입니다.

    언어가 다른 문서가 단일 열에 BLOB(Binary Large Object)으로 함께 저장된 경우 지정된 문서의 LCID(로캘 ID)에 따라 해당 내용을 인덱싱하는 데 사용할 언어가 결정됩니다. 이러한 열을 쿼리할 때 LANGUAGE language_term을 지정하면 검색 확률을 높일 수 있습니다.

    language_term은 특정 언어의 LCID에 해당하는 문자열, 정수 또는 16진수 값으로 지정할 수 있습니다. language_term을 지정하면 해당 언어가 검색 조건의 모든 요소에 적용됩니다. 값을 지정하지 않으면 열의 전체 텍스트 언어가 사용됩니다.

    문자열로 지정하는 경우 language_term은 sys.syslanguages(Transact-SQL) 호환성 뷰의 alias 열 값에 해당합니다. 문자열은 'language_term'과 같이 작은따옴표로 묶어야 합니다. 정수로 지정하는 경우 language_term은 언어를 식별하는 실제 LCID입니다. 16진수 값으로 지정하는 경우 language_term은 0x로 시작하는 LCID의 16진수 값입니다. 16진수 값은 선행 0을 포함하여 8자리 수를 초과할 수 없습니다.

    값이 DBCS(더블바이트 문자 집합) 형식인 경우 SQL Server는 값을 유니코드로 변환합니다.

    지정된 언어가 잘못되었거나 해당 언어에 해당하는 리소스가 설치되지 않은 경우 SQL Server는 오류를 반환합니다. 중립 언어 리소스를 사용하려면 language_term을 0x0으로 지정하십시오.

  • <contains_search_condition>
    column_name에서 검색할 텍스트와 일치 조건을 지정합니다.

    <contains_search_condition>nvarchar은 입니다. 암시적 변환은 다른 문자 데이터 형식이 입력으로 사용될 때 발생합니다. 다음 예에서는 varchar(30)로 정의된 @SearchWord 변수로 인해 CONTAINS 조건자에서 암시적 변환이 발생합니다.

    USE AdventureWorks;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    변환 시 "매개 변수 스니핑"이 작동하지 않으므로 성능을 향상시키려면 nvarchar를 사용합니다. 이 예에서는 @SearchWord 를 nvarchar(30)로 선언합니다.

    USE AdventureWorks;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    최적화되지 않은 계획이 생성되는 경우 OPTIMIZE FOR 쿼리 힌트를 사용할 수도 있습니다.

  • word
    공백이나 문장 부호가 포함되지 않은 문자열입니다.

  • phrase
    각 단어 사이에 공백이 포함된 하나 이상의 단어입니다.

    [!참고]

    일부 아시아 지역의 언어로 작성된 경우처럼 어떤 언어에는 각 단어 사이에 공백이 없는 하나 이상의 단어로 구성된 구가 있을 수 있습니다.

  • <simple_term>
    정확하게 단어나 구가 일치하는 항목을 지정합니다. 유효한 단순 용어의 예로는 "blue berry", blueberry, "Microsoft SQL Server" 등이 있습니다. 구는 큰따옴표("")로 묶어야 합니다. 구에 포함된 단어는 <contains_search_condition>에 지정된 것과 같은 순서로 데이터베이스 열에 나타나야 합니다. 단어나 구의 문자 검색은 대/소문자를 구분하지 않습니다. 전체 텍스트 인덱싱된 열에서 의미 없는 단어 또는 중지 단어(예: a, and, the 등)는 전체 텍스트 인덱스에 저장되지 않습니다. 단일 단어 검색에서 의미 없는 단어가 사용되는 경우 SQL Server에서는 쿼리에 의미 없는 단어만 포함되어 있다는 오류 메시지를 반환합니다. SQL Server에는 각 SQL Server 인스턴스의 \Mssql\Binn\FTERef 디렉터리에 의미 없는 단어의 표준 목록이 포함되어 있습니다.

    문장 부호는 무시됩니다. 따라서 CONTAINS(testing, "computer failure")는 "Where is my computer? Failure to find it would be expensive."라는 값을 가진 행을 검색합니다. 단어 분리기 기능에 대한 자세한 내용은 단어 분리기 및 형태소 분석기를 참조하십시오.

  • <prefix_term>
    지정한 텍스트로 시작하는 단어나 구를 검색하도록 지정합니다. 접두사 용어를 큰따옴표("")로 묶고 뒤에 있는 따옴표 앞에 별표(*)를 추가하여 별표 앞에 지정된 단순 용어로 시작하는 일치하는 모든 텍스트를 찾으십시오. 절은 CONTAINS (column, '"text*"'). 별표는 단어나 구에 포함된 어근의 문자 개수에 관계없이 검색합니다. 텍스트와 별표가 큰따옴표로 구분되지 않은 경우 조건자는 CONTAINS (column, 'text*')를 읽고 전체 텍스트 검색은 별표를 문자로 간주하여 text*와 정확하게 일치하는 텍스트를 검색합니다. 일반적으로 단어 분리기는 별표(*) 문자가 있는 단어를 무시하므로 전체 텍스트 엔진은 이러한 단어를 검색하지 않습니다.

    <prefix_term>이 구일 경우 구에 포함된 각 단어는 별도의 접두사로 간주됩니다. 따라서 "local wine *"의 접두사를 지정하는 쿼리는 "local winery", "locally wined and dined" 등의 텍스트가 포함된 모든 행을 검색합니다.

  • <generation_term>
    여기에 포함된 원래 단순 용어에서 파생된 단어를 검색하도록 지정합니다.

  • INFLECTIONAL
    지정된 단순 용어에 언어별 형태소 분석기를 사용하도록 지정합니다. 형태소 분석기 동작은 각 언어의 형태소 분석 규칙에 따라 정의됩니다. 중립 언어에는 관련 형태소 분석기가 없습니다. 쿼리할 열의 열 언어는 원하는 형태소 분석기를 참조하는 데 사용됩니다. language_term을 지정하면 해당 언어에 대한 형태소 분석기가 사용됩니다.

    <generation_term> 내에 지정된 <simple_term>은 명사와 동사 중 하나만 검색합니다.

  • THESAURUS
    전체 텍스트 언어 열 또는 쿼리에 지정된 언어에 해당하는 동의어 사전이 사용되도록 지정합니다. <simple_term>에서 가장 긴 패턴에 대해 동의어 사전에서 대응되는 단어를 찾고 원래 패턴을 확장하거나 대체하도록 추가 용어가 생성됩니다. <simple_term>의 전체 또는 일부에 일치하는 항목을 찾을 수 없으면 일치하지 않는 부분이 simple_term으로 처리됩니다. 전체 텍스트 검색 동의어 사전에 대한 자세한 내용은 동의어 사전 구성을 참조하십시오.

  • <proximity_term>
    검색하는 문서에 있어야 하는 단어나 구를 지정합니다. <proximity_term>의 경우 AND 연산자와 같이 검색하는 문서에 두 검색 단어가 모두 있어야 합니다.

    • NEAR | ~
      일치 항목이 반환되려면 NEAR 또는 ~ 연산자의 양쪽에 있는 단어나 구가 문서에 나타나야 함을 나타냅니다. a NEAR b NEAR c 또는 a ~ b ~ c에서와 같이 근접한 단어를 여러 개 연결할 수 있습니다. 일치 항목이 반환되려면 연결된 근접한 단어가 모두 해당 문서에 있어야 합니다.

      CONTAINSTABLE 함수에 사용될 경우 검색 단어와 일치하는 정도에 따라 각 문서의 순위가 달라집니다. 즉, 문서에 있는 단어가 검색 단어와 보다 근접하게 일치할수록 해당 문서의 순위가 높아집니다. 일치하는 검색 단어가 51개 단어 이상 떨어져 있으면 문서에 반환되는 순위는 0입니다.

      예를 들어 CONTAINS (column_name, 'fox NEAR chicken')와 CONTAINSTABLE (table_name, column_name, 'fox ~ chicken')은 모두 지정된 열에서 "fox"와 "chicken"을 포함하는 문서를 반환합니다. 또한 CONTAINSTABLE은 "fox" 및 "chicken"과 비슷하게 일치하는 단어를 기반으로 각 문서의 순위를 반환합니다. 예를 들어 문서에 "The fox ate the chicken"이라는 문장이 포함된 경우 순위가 높아집니다.

      NEAR는 단어 사이의 절대 거리가 아닌 논리적 거리를 나타냅니다. 예를 들어, 다른 구에 있는 단어나 다른 단락에 있는 문장은 동일한 구나 문장에 있는 단어보다 관련도가 높더라도 실제 일치하는 정도와 상관없이 멀리 떨어져 있는 것으로 간주됩니다. 마찬가지로 다른 단락에 있는 단어는 더 많이 떨어져 있는 것으로 간주됩니다.

  • <weighted_term>
    쿼리에서 반환된 결과 행이 단어 및 구 목록과 일치하고 선택적으로 가중치 값이 지정되도록 합니다.

  • ISABOUT
    <weighted_term> 키워드를 지정합니다.

    • WEIGHT(weight_value)
      0.0에서 1.0 사이의 숫자로 가중치를 지정합니다. <weighted_term>의 각 구성 요소는 weight_value를 포함할 수 있습니다. weight_value를 사용하여 쿼리의 각 부분이 쿼리와 일치하는 각 행에 할당되는 등급 값에 영향을 주는 방법을 변경할 수 있습니다. WEIGHT는 CONTAINS 쿼리 결과에는 영향을 주지 않지만 CONTAINSTABLE 쿼리의 순위에는 영향을 줍니다.

      [!참고]

      소수 구분 기호는 운영 체제 로캘과 상관없이 항상 마침표입니다.

  • { AND | & } | { AND NOT | &! } | { OR | | }
    두 개의 포함 검색 조건 간의 논리 연산을 지정합니다.

    • AND | &
      두 개의 포함 검색 조건이 모두 충족되어야 일치합니다. AND 키워드 대신 앰퍼샌드 기호(&)를 사용하여 AND 연산자를 나타낼 수 있습니다.

    • AND NOT | &!
      두 번째 검색 조건이 일치하지 않아야 한다는 의미입니다. AND NOT 키워드 대신 앰퍼샌드 다음에 느낌표 기호(&!)를 사용하여 AND NOT 연산자를 나타낼 수 있습니다.

    • OR | |
      두 개의 포함 검색 조건 중 하나가 충족되어야 일치합니다. OR 키워드 대신 막대 기호(|)를 사용하여 OR 연산자를 나타낼 수 있습니다.

      <contains_search_condition>에 괄호로 묶은 그룹이 포함되면 이 괄호로 묶은 그룹이 먼저 평가됩니다. 괄호로 묶인 그룹을 평가한 후 포함 검색 조건에 논리 연산자를 사용할 때 다음 규칙이 적용됩니다.

      • AND보다 NOT이 먼저 적용됩니다.

      • NOT은 AND 다음에만 올 수 있으며(예: AND NOT) OR NOT 연산자는 허용되지 않습니다. NOT은 첫 번째 단어 앞에 지정할 수 없습니다. 예를 들어 CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' )는 유효하지 않습니다.

      • OR보다 AND가 먼저 적용됩니다.

      • 동일한 유형의 부울 연산자(AND, OR)는 결합성을 가지므로 어떤 순서로든 적용할 수 있습니다.

      • n
        여러 CONTAINS 검색 조건과 용어를 지정할 수 있음을 나타내는 자리 표시자입니다.

주의

전체 텍스트 조건자와 함수는 단일 테이블에서 작동합니다. 이 사실은 FROM 조건자에 표시됩니다. 여러 테이블을 검색하려면 FROM 절에 조인된 테이블을 사용하여 두 개 이상의 테이블을 합한 결과 집합을 대상으로 검색 작업을 수행합니다.

호환성 수준이 70 미만일 경우 CONTAINS는 키워드로 인식되지 않습니다. 자세한 내용은 sp_dbcmptlevel(Transact-SQL)을 참조하십시오.

데이터베이스 호환성 수준이 100으로 설정된 경우에는 OUTPUT 절에 전체 텍스트 조건자가 허용되지 않습니다.

LIKE와 전체 텍스트 검색 비교

전체 텍스트 검색과 달리 LIKETransact-SQL 조건자는 문자 패턴에 대해서만 적용됩니다. 또한 LIKE 조건자는 서식 있는 이진 데이터를 쿼리하는 데 사용할 수도 없습니다. 특히 구조화되지 않은 많은 텍스트 데이터에 대한 LIKE 쿼리는 동일한 데이터에 대한 전체 텍스트 쿼리보다 훨씬 느립니다. 수백만 개의 텍스트 데이터 행에 대한 LIKE 쿼리는 결과가 반환되기까지 몇 분이 걸릴 수 있지만 동일한 데이터에 대한 전체 텍스트 쿼리는 반환되는 행 수에 따라 몇 초 내에 완료됩니다.

1. <simple_term>에 CONTAINS 사용

다음 예에서는 가격이 $80.99이고 "Mountain"이라는 단어가 포함된 모든 제품을 검색합니다.

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

2. <simple_term>에 CONTAINS와 구 사용

다음 예에서는 "Mountain"이나 "Road"라는 구가 포함된 모든 제품을 반환합니다.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

3. <prefix_term>에 CONTAINS 사용

다음 예에서는 Name 열에 접두사 chain으로 시작하는 단어가 하나 이상인 모든 제품 이름을 반환합니다.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

4. <prefix_term>에 CONTAINS와 OR 사용

다음 예에서는 접두사가 "chain" 또는 "full"인 문자열을 포함하는 모든 범주 설명을 반환합니다.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO

5. <proximity_term>에 CONTAINS 사용

다음 예에서는 bike와 performance라는 단어가 서로 근접해 있는 제품 이름을 모두 반환합니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO

6. <generation_term>에 CONTAINS 사용

다음 예에서는 riding, ridden 등 ride에서 파생된 단어가 있는 모든 제품을 검색합니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO

7. <weighted_term>에 CONTAINS 사용

다음 예에서는 performance, comfortable 또는 smooth 단어가 포함된 모든 제품 이름을 검색하며 각 단어에는 다른 가중치가 지정됩니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), 
comfortable weight (.4), smooth weight (.2) )' );
GO

8. 변수에 CONTAINS 사용

다음 예에서는 특정 검색 용어 대신 변수를 사용합니다.

USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'Performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);
GO

9. 논리 연산자(AND)와 함께 CONTAINS 사용

다음 예에서는 AdventureWorks 데이터베이스의 ProductDescription 테이블을 사용합니다. 이 쿼리에서는 CONTAINS 조건자를 사용하여 설명 ID가 5가 아니고 설명에 "Aluminum"과 "spindle"이라는 단어가 둘 다 포함된 설명을 검색합니다. 검색 조건에는 AND 부울 연산자가 사용됩니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
   CONTAINS(Description, ' Aluminum AND spindle');
GO

10. CONTAINS를 사용하여 행 삽입 확인

다음 예에서는 SELECT 하위 쿼리 내에 CONTAINS를 사용합니다. 이 쿼리는 AdventureWorks 데이터베이스를 사용하여 특정 주기에 대한 ProductReview 테이블의 모든 설명 값을 얻습니다. 검색 조건에는 AND 부울 연산자가 사용됩니다.

USE AdventureWorks;
GO
INSERT INTO Production.ProductReview 
(ProductID, ReviewerName, EmailAddress, Rating, Comments) 
VALUES
(780, 'John Smith', 'john@fourthcoffee.com', 5, 
'The Mountain-200 Silver from AdventureWorks Cycles meets and exceeds expectations. I enjoyed the smooth ride down the roads of Redmond')
 
-- Given the full-text catalog for these tables is Adv_ft_ctlg, 
-- with change_tracking on so that the full-text indexes are updated automatically.
WAITFOR DELAY '00:00:30'   
-- Wait 30 seconds to make sure that the full-text index gets updated.
 
SELECT r.Comments, p.Name
FROM Production.ProductReview r
JOIN Production.Product p 
ON
 r.ProductID = p.ProductID
 
AND r.ProductID = (SELECT ProductID
                  FROM Production.ProductReview
                  WHERE CONTAINS (Comments, 
                                 ' AdventureWorks AND 
                                   Redmond AND 
                                   "Mountain-200 Silver" '))

GO