전체 텍스트 조건자 및 함수 개요
전체 텍스트 쿼리는 전체 텍스트 조건자(CONTAINS 및 FREETEXT) 및 함수(CONTAINSTABLE 및 FREETEXTTABLE)를 사용합니다. 이러한 조건자와 함수는 다양한 형태의 쿼리 용어를 지원하는 많은 Transact-SQL 구문을 지원합니다. 전체 텍스트 쿼리를 작성하려면 이러한 조건자와 함수를 사용하는 시기와 방법을 알아야 합니다. 이 항목에서는 이러한 조건자와 함수에 대해 간략하게 설명하고 CONTAINS 조건자와 CONTAINSTABLE 함수 간의 공통점에 대해 설명합니다.
전체 텍스트 조건자(CONTAINS 및 FREETEXT) 개요
CONTAINS 및 FREETEXT는 SELECT 문의 WHERE 또는 HAVING 절에 지정됩니다. CONTAINS 및 FREETEXT는 LIKE와 BETWEEN 등의 다른 Transact-SQL 조건자와 결합할 수 있습니다.
CONTAINS 및 FREETEXT 조건자는 TRUE 또는 FALSE 값을 반환합니다. 이러한 조건자는 지정된 행이 전체 텍스트 쿼리와 일치하는지 여부를 확인하는 선택 조건을 지정하는 데에만 사용할 수 있습니다. 일치하는 행은 결과 집합에 반환됩니다.
CONTAINS 또는 FREETEXT를 사용하면 검색할 테이블의 단일 열, 열 목록 또는 모든 열을 지정할 수 있으며, 경우에 따라 단어 분리, 형태소 분석, 동의어 사전 조회 및 의미 없는 단어 제거를 위해 지정된 전체 텍스트 쿼리에서 사용할 리소스의 언어를 지정할 수도 있습니다.
CONTAINS 및 FREETEXT는 다음과 같은 다양한 유형의 일치에 유용합니다.
CONTAINS(또는 CONTAINSTABLE)를 사용하여 특정 단어나 구와 정확히 일치하거나 비슷하게 일치하는 단어를 검색하거나, 서로 근접한 단어를 검색하거나, 가중치 검색을 수행합니다. CONTAINS를 사용할 경우 검색할 텍스트를 지정하는 하나 이상의 검색 조건과 일치 여부를 결정하는 조건을 지정해야 합니다.
검색 조건 사이에 논리적 연산을 사용할 수 있습니다. 자세한 내용은 이 항목의 뒷부분에 나오는 CONTAINS 및 CONTAINSTABLE에 부울 연산자 AND, OR, AND NOT 사용을 참조하십시오.
FREETEXT(또는 FREETEXTTABLE)를 사용하여 지정된 단어, 구 또는 문장(freetext 문자열)의 정확한 단어가 아닌 의미를 일치시킵니다. 지정된 열의 모든 용어나 용어 형태가 전체 텍스트 인덱스에 있으면 일치하는 항목이 생성됩니다.
연결된 서버에 대해 쿼리를 실행하려면 CONTAINS 또는 FREETEXT에 네 부분으로 된 이름을 사용하면 됩니다. 자세한 내용은 연결된 서버 쿼리(전체 텍스트 검색)를 참조하십시오.
이러한 조건자의 구문 및 인수에 대한 자세한 내용은 CONTAINS(Transact-SQL) 및 FREETEXT(Transact-SQL)를 참조하십시오.
[!참고]
데이터베이스 호환성 수준이 100으로 설정된 경우에는 OUTPUT 절에 전체 텍스트 조건자가 허용되지 않습니다.
예
1. <simple_term>에 CONTAINS 사용
다음 예에서는 가격이 $80.99이고 "Mountain"이라는 단어가 포함된 모든 제품을 검색합니다.
USE AdventureWorks2008R2;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS(Name, 'Mountain');
GO
2. FREETEXT를 사용하여 지정된 문자 값을 포함하는 단어 검색
다음 예에서는 vital, safety, components와 관련된 단어를 포함하는 문서를 모두 검색합니다.
USE AdventureWorks2008R2;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
전체 텍스트 함수(CONTAINSTABLE 및 FREETEXTTABLE) 개요
CONTAINSTABLE 및 FREETEXTTABLE 함수는 일반 테이블 이름처럼 SELECT 문의 FROM 절에서 참조될 수 있습니다. 이러한 함수는 전체 텍스트 쿼리와 일치하는 행이 0개, 1개 또는 그 이상 있는 테이블을 반환합니다. 반환된 테이블에는 함수의 전체 텍스트 검색 조건에 지정된 선택 조건과 일치하는 기본 테이블의 행만 포함됩니다.
이러한 함수 중 하나를 사용하는 쿼리는 다음과 같이 각 행에 대해 적절한 순위 값(RANK) 및 전체 텍스트 키(KEY)를 반환합니다.
KEY 열
KEY 열은 반환된 행의 고유 값을 반환하며, 선택 조건을 지정하는 데 사용할 수 있습니다.
RANK 열
RANK 열은 각 행이 선택 조건과 일치하는 정도를 나타내는 순위 값을 반환합니다. 행의 텍스트 또는 문서 순위 값이 높을수록 지정된 전체 텍스트 쿼리에 대한 행의 관련성이 큽니다. 또한 여러 행에 동일한 순위가 지정될 수도 있습니다. 선택적 top_n_by_rank 매개 변수를 지정하면 반환될 일치 항목 수를 제한할 수 있습니다. 자세한 내용은 순위 결과 집합 제한(전체 텍스트 검색) 및 검색 쿼리 결과의 순위를 지정하는 방법(전체 텍스트 검색)를 참조하십시오.
이러한 함수 중 하나를 사용할 경우 전체 텍스트를 검색할 기본 테이블을 지정해야 합니다. 조건자와 마찬가지로 검색할 테이블의 단일 열, 열 목록 또는 모든 열을 지정할 수 있으며, 경우에 따라 전체 텍스트 쿼리에서 사용할 리소스의 언어를 지정할 수도 있습니다.
CONTAINSTABLE은 CONTAINS와 같은 유형의 일치에 유용하고 FREETEXTTABLE은 FREETEXT와 같은 유형의 일치에 유용합니다. 자세한 내용은 이 항목 앞부분의 전체 텍스트 조건자(CONTAINS 및 FREETEXT) 개요를 참조하십시오. CONTAINSTABLE 및 FREETEXTTABLE 함수를 사용하는 쿼리를 실행할 경우 반환되는 행을 SQL Server 기본 테이블의 행과 명시적으로 조인해야 합니다.
이러한 함수의 구문 및 인수에 대한 자세한 내용은 CONTAINSTABLE(Transact-SQL) 및 FREETEXTTABLE(Transact-SQL)을 참조하십시오.
예
1. CONTAINSTABLE 사용
다음 예에서는 Description 열에 "sauces" 또는 "candies"와 근접한 "sweet and savory" 단어가 포함된 모든 식품 범주 이름과 설명이 반환됩니다. 범주 이름이 "Seafood"인 행은 모두 제외되며 등급 값이 2 이상인 행만 반환됩니다.
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
2. FREETEXTTABLE 사용
다음 예에서는 순위가 높은 행을 먼저 반환하고 SELECT 목록에 각 행의 순위를 추가하도록 FREETEXTTABLE 쿼리를 확장합니다. 쿼리를 지정하려면 CategoryID가 Categories 테이블의 고유 키 열임을 알아야 합니다.
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
CONTAINS 및 CONTAINSTABLE에 부울 연산자 AND, OR, AND NOT 사용
CONTAINS 조건자와 CONTAINSTABLE 함수는 동일한 검색 조건을 사용하며, 둘 다 논리적 연산을 수행하는 부울 연산자 AND, OR, AND NOT을 사용하여 여러 검색 단어를 결합하는 것을 지원합니다. 예를 들어 AND를 사용하여 "latte"와 "New York-style bagel"이 둘 다 포함된 행을 찾거나 AND NOT을 사용하여 "bagel"은 포함되지만 "cream cheese"는 포함되지 않은 행을 찾을 수 있습니다.
[!참고]
반면에 FREETEXT 및 FREETEXTTABLE은 부울 단어를 검색할 단어로 취급합니다.
CONTAINS를 논리 연산자 AND, OR 및 NOT을 사용하는 다른 조건자와 결합하는 방법은 검색 조건(Transact-SQL)을 참조하십시오.
예
다음 예에서는 AdventureWorks2008R2 데이터베이스의 ProductDescription 테이블을 사용합니다. 이 쿼리에서는 CONTAINS 조건자를 사용하여 설명 ID가 5가 아니고 "Aluminum"과 "spindle"이라는 단어가 둘 다 포함된 설명을 검색합니다. 검색 조건에는 AND 부울 연산자가 사용됩니다.
USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
CONTAINS(Description, ' Aluminum AND spindle');
GO
기타 고려 사항
전체 텍스트를 사용하도록 설정된 테이블에는 해당 테이블에 고유 행을 강제 적용하는 데 사용되는 열(고유키 열)이 있습니다. CONTAINSTABLE 또는 FREETEXTTABLE 유형의 전체 텍스트 쿼리를 작성할 경우 고유 키 열의 이름을 알아야 합니다. 자세한 내용은 방법: 전체 텍스트 키 열 조회(Transact-SQL)를 참조하십시오.
많은 쿼리 용어는 단어 분리기 동작에 크게 의존합니다. 올바른 단어 분리기(및 형태소 분석기)를 사용하고 있는지 확인하려면 LANGUAGE 인수를 지정하는 것이 좋습니다. 자세한 내용은 전체 텍스트 인덱스 생성 시 언어 선택을 위한 최선의 방법를 참조하십시오.
전체 텍스트 쿼리를 정의할 때 전체 텍스트 엔진은 검색 조건에서 중지 단어(의미 없는 단어라고도 함)를 삭제합니다. 중지 단어란 "a", "and", "is", "the" 등과 같이 자주 사용되지만 일반적으로 특정 텍스트 검색에는 도움이 되지 않는 단어입니다. 중지 단어는 중지 목록에 나열됩니다. 인덱싱할 때 쿼리 또는 인덱스에서 생략된 중지 단어를 확인할 수 있도록 각 전체 텍스트 인덱스는 특정 중지 목록과 연결됩니다. 자세한 내용은 중지 단어 및 중지 목록을 참조하십시오.
동의어 사전 검색은 기본적으로 FORMSOF THESAURUS 절을 지정하는 CONTAINS 및 CONTAINSTABLE Transact-SQL 쿼리와 FREETEXT 및 FREETEXTABLE 쿼리에 대해 수행됩니다.
참고 항목