다음을 통해 공유


전체 텍스트 함수 및 전체 텍스트 조건자 비교

CONTAINSTABLE 및 FREETEXTTABLE 함수는 각 행의 상관 등급을 반환하는 전체 텍스트 쿼리를 지정하는 데 사용됩니다. 이러한 함수는 전체 텍스트 조건자인 CONTAINS 및 FREETEXT와 비슷하지만 다르게 사용됩니다.

전체 텍스트 조건자와 전체 텍스트 함수는 모두 전체 텍스트 쿼리에 사용되고 조건자와 함수에서 전체 텍스트 검색 조건을 지정하는 구문도 동일하지만 사용 방법에는 분명한 차이가 있습니다. 다음에서는 중요한 일부 유사점과 차이점을 나열합니다.

  • CONTAINS 및 FREETEXT는 모두 TRUE 또는 FALSE 값을 반환하므로 SELECT 문의 WHERE 또는 HAVING 절에 지정됩니다.
  • CONTAINSTABLE 및 FREETEXTTABLE은 모두 0개 이상의 행이 포함된 테이블을 반환하므로 항상 FROM 절에 지정해야 합니다.
  • CONTAINS 및 FREETEXT는 Microsoft SQL Server에서 결과 집합의 멤버 자격을 확인하기 위해 선택 조건을 지정할 때만 사용할 수 있습니다.
  • CONTAINSTABLE 및 FREETEXTTABLE도 선택 조건을 지정할 때 사용됩니다. 반환된 테이블에는 전체 텍스트 키 값이 포함된 KEY 열이 있으며 모든 전체 텍스트 등록 테이블에는 고유한 값을 갖는 열이 하나씩 있습니다. CONTAINSTABLE 또는 FREETEXTTABLE의 KEY 열에 반환된 값은 전체 텍스트 등록 테이블에서 전체 텍스트 검색 조건에 지정된 선택 조건과 일치하는 행의 고유한 값입니다.

또한 CONTAINSTABLE 및 FREETEXTTABLE에 의해 생성된 테이블에는 0부터 1000까지의 값이 포함된 RANK라는 열이 있습니다. 값이 작을수록 관련이 없는 것입니다. 이러한 값은 반환된 행이 선택 조건에 얼마나 일치하는지에 따라 순위를 매기는 데 사용됩니다.

[!참고] 순위 값은 결과 집합에 포함된 행의 관련성을 나타내는 상대적 순서일 뿐입니다. 실제 값은 중요하지 않으며 쿼리를 실행할 때마다 동일한 것도 아닙니다. 순위에 대한 자세한 내용은 순위 이해를 참조하십시오.

CONTAINS 및 FREETEXT 쿼리는 순위 값을 반환하지 않습니다.

CONTAINSTABLE 및 FREETEXTTABLE 함수를 사용하는 쿼리를 실행할 경우 반환된 한정하는 행을 원래 SQL Server 테이블의 행과 명시적으로 조인해야 합니다.

다음 예에서는 Description 열에 "sauces" 또는 "candies"와 근접한 "sweet and savory" 단어가 포함된 모든 식품 범주 이름과 설명이 반환됩니다. 범주 이름이 "Seafood"인 행은 모두 제외되며 등급 값이 2 이상인 행만 반환됩니다.

[!참고] 이 항목의 일부 예를 실행하려면 Northwind 데이터베이스를 설치해야 합니다. Northwind 데이터베이스를 설치하는 방법은 Northwind 및 pubs 예제 데이터베이스 다운로드를 참조하십시오.

USE Northwind;
GO
SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

CONTAINSTABLE 및 CONTAINS 비교

CONTAINSTABLE 함수와 CONTAINS 조건자는 비슷한 검색 조건을 사용합니다.

그러나 CONTAINSTABLE에서는 전체 텍스트를 검색할 테이블과 검색할 테이블의 열(또는 모든 열), 검색 조건을 지정합니다. 사용자가 반환될 최대 행 수를 선택적으로 지정할 수 있는 매개 변수도 있습니다. 자세한 내용은 이 항목의 "결과 집합 제한" 섹션을 참조하십시오.

CONTAINSTABLE은 RANK 열이 포함된 테이블을 반환합니다. RANK 열에는 각 행이 선택 조건과 일치하는 정도를 나타내는 값이 포함됩니다. 행의 순위 값이 높을수록 지정한 전체 텍스트 쿼리에 대한 행의 관련성이 큽니다.

FREETEXTTABLE 및 FREETEXT 비교

다음 쿼리에서는 등급이 높은 행을 먼저 반환하고 SELECT 목록에 각 행의 등급을 추가하도록 FREETEXTTABLE 쿼리를 확장합니다. 쿼리를 지정하려면 CategoryIDCategories 테이블의 고유 키 열임을 알아야 합니다.

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL 
     INNER JOIN
     FREETEXTTABLE(Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

다음 쿼리에서는 등급 값이 10 이상인 행만 반환하도록 같은 쿼리를 확장합니다.

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL 
     INNER JOIN
     FREETEXTTABLE (Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

고유 키 열 이름 확인

행 집합 반환 함수를 사용하는 쿼리를 작성하는 경우 고유 키 열의 이름을 알아야 합니다. 전체 텍스트를 사용할 수 있는 모든 테이블에는 테이블에 고유 행을 강제 적용하기 위해 선택된 열의 ID가 포함된 TableFulltextKeyColumn 속성이 있습니다. 이 예에서는 프로그래밍 방식으로 키 열의 이름을 얻는 방법을 보여 줍니다.

USE AdventureWorks;
GO
DECLARE @key_column sysname
SET @key_column = Col_Name(Object_Id('Production.Document'),
ObjectProperty(Object_id('Production.Document'),
'TableFulltextKeyColumn') 
)
SELECT @key_column AS 'Unique Key Column';
GO

결과 집합을 제한하여 가장 관련된 결과 반환

대부분의 전체 텍스트 쿼리에서 검색 조건과 일치하는 항목 수는 매우 많습니다. 쿼리가 반환하는 결과 항목의 수를 줄이려면 CONTAINSTABLE 및 FREETEXTTABLE에 선택적 인수인 top_n_by_rank를 사용하여 순위에 따라 반환될 항목 수를 지정합니다.

[!참고] top_n_by_rank 인수를 사용하면 전체 텍스트 쿼리를 만족하는 행의 하위 집합이 반환됩니다. top_n_by_rank를 다른 조건자와 함께 사용하면 실제로 모든 조건자와 일치하는 행 수보다 적은 수의 행이 반환될 수 있습니다.

Microsoft SQL Server는 이 정보를 사용하여 일치하는 항목을 순위별로 정렬하고 지정한 개수만 반환합니다. 이 방법을 사용하면 성능이 크게 향상됩니다. 예를 들어 백만 개의 행이 있는 테이블에서 100,000개의 행을 반환하는 쿼리에 대해 상위 100개의 행만 요청하면 쿼리가 훨씬 빨리 처리됩니다.

CONTAINSTABLE을 사용한 위의 예에서 상위 3개의 행만 반환되게 하려면 다음 쿼리를 사용합니다.

USE Northwind;
GO
SELECT   K.RANK, CompanyName, ContactName, Address
FROM      Customers AS C
         INNER JOIN
         CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
            Rue WEIGHT(0.5),
            Bouchers WEIGHT(0.9))', 3) AS K
         ON C.CustomerID = K.[KEY];
GO

결과 집합은 다음과 같습니다.

RANK CompanyName          ContactName       address            
---- ------------         -----------       -------            
123  Bon app'             Laurence Lebihan  12, rue des Bouchers 
65   Du monde entier      Janine Labrune    67, rue des Cinquante Otages 
15   France restauration  Carine Schmitt    54, rue Royale     

이 예에서는 Description 열에 "sauces" 또는 "candies"와 근접한 "sweet and savory" 단어가 포함된 상위 10개의 식품 범주 이름과 설명이 반환됩니다.

SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
      , 10
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO

참고 항목

관련 자료

CONTAINSTABLE(Transact-SQL)
FREETEXTTABLE(Transact-SQL)

도움말 및 정보

SQL Server 2005 지원 받기