전체 텍스트 검색을 사용한 쿼리

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SELECT 문과 함께 CONTAINS 및 FREETEXT 조건자 행 집합 반환 함수 CONTAINSTABLEFREETEXTTABLE을 사용하여 전체 텍스트 쿼리를작성합니다. 이 문서에서는 각 조건자 및 함수의 예제를 제공하여 최적의 사용 방법을 선택할 수 있습니다.

  • 단어와 구를 일치하려면 CONTAINS 및 CONTAINSTABLE을 사용합니다.
  • 정확한 표현은 아니지만 의미와 일치하려면 FREETEXT 및 FREETEXTTABLE을 사용합니다.

각 조건자 및 함수의 예

다음 예제에서는 AdventureWorks 샘플 데이터베이스를 사용합니다. AdventureWorks의 최종 릴리스는 SQL Server 2016 CTP3용 AdventureWorks 데이터베이스 및 스크립트를 참조하세요. 예제 쿼리를 실행하기 위해 전체 텍스트 검색을 설정할 수도 있습니다. 자세한 내용은 전체 텍스트 검색 시작을 참조하세요.

예 - CONTAINS

다음 예제에서는 해당 값 $80.99 이 포함된 "Mountain"모든 제품을 찾습니다.

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

예제 - FREETEXT

다음 예제에서는 vital safety components와 관련된 단어를 포함하는 문서를 모두 검색합니다.

USE AdventureWorks2022  
GO  
  
SELECT Title  
FROM Production.Document  
WHERE FREETEXT (Document, 'vital safety components')  
GO  

예제 - CONTAINSTABLE

다음 예제에서는 설명 열에 "light" 또는 "lightweight" 단어 근처에 "알루미늄"이라는 단어가 포함된 모든 제품에 대한 설명 ID와 설명을 반환합니다. 순위가 2 이상인 행만 반환됩니다.

USE AdventureWorks2022  
GO  
  
SELECT FT_TBL.ProductDescriptionID,  
   FT_TBL.Description,   
   KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL INNER JOIN  
   CONTAINSTABLE (Production.ProductDescription,  
      Description,   
      '(light NEAR aluminum) OR  
      (lightweight NEAR aluminum)'  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 2  
ORDER BY KEY_TBL.RANK DESC;  
GO  

예제 - FREETEXTTABLE

다음 예제에서는 FREETEXTTABLE 쿼리를 확장하여 가장 높은 순위 행을 먼저 반환하고 각 행의 순위를 선택 목록에 추가합니다. 비슷한 쿼리를 작성하려면 ProductDescriptionIDProductDescription 테이블의 고유 키 열임을 알아야 합니다.

USE AdventureWorks2022  
GO  
  
SELECT KEY_TBL.RANK, FT_TBL.Description  
FROM Production.ProductDescription AS FT_TBL   
     INNER JOIN  
     FREETEXTTABLE(Production.ProductDescription, Description,  
                    'perfect all-around bike') AS KEY_TBL  
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC  
GO  

순위가 10 이상인 행만 반환하도록 동일한 쿼리를 확장하면 다음과 같습니다.

USE AdventureWorks2022  
GO  
  
SELECT KEY_TBL.RANK, FT_TBL.Description  
FROM Production.ProductDescription AS FT_TBL   
     INNER JOIN  
     FREETEXTTABLE(Production.ProductDescription, Description,  
                    'perfect all-around bike') AS KEY_TBL  
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK >= 10  
ORDER BY KEY_TBL.RANK DESC  
GO  

단어 또는 일치 의미 일치

CONTAINS/CONTAINSTABLE 다양한 FREETEXT/FREETEXTTABLE 종류의 일치에 유용합니다. 다음 정보는 쿼리에 가장 적합한 조건자 또는 함수를 선택하는 데 도움이 됩니다.

CONTAINS/CONTAINSTABLE

  • 단일 단어와 구를 정확하거나 유사하지 않은(덜 정밀한) 일치로 찾습니다.
  • 다음 작업을 수행할 수도 있습니다.
    • 서로의 특정 거리 내에 있는 단어의 근접성을 지정합니다.
    • 가중치 일치 항목을 반환합니다.
    • 논리 연산자와 검색 조건을 결합합니다. 자세한 내용은 이 문서의 뒷부분에 나오는 부울 연산자 사용(AND, OR 및 NOT)을 참조하세요.

FREETEXT/FREETEXTTABLE

  • 지정된 단어, 구 또는 문장(자유 텍스트 문자열)의 의미는 일치하지만 정확한 단어는 일치하지 않습니다.
  • 지정된 열의 전체 텍스트 인덱스에서 용어 또는 형식이 있으면 일치 항목이 생성됩니다.

조건자와 함수 비교

조건자 CONTAINS/FREETEXT 및 행 집합 반환 함수 CONTAINSTABLE/FREETEXTTABLE은 구문 및 옵션이 다릅니다. 다음 정보는 쿼리에 가장 적합한 조건자 또는 함수를 선택하는 데 도움이 됩니다.

조건자 CONTAINS 및 FREETEXT

사용 현황 SELECT 문의 WHERE 또는 HAVING 절에서 전체 텍스트 조건자 CONTAINS 및 FREETEXT를 사용합니다.

결과 CONTAINS 및 FREETEXT 조건자는 지정된 행이 전체 텍스트 쿼리와 일치하는지 여부를 나타내는 TRUE 또는 FALSE 값을 반환합니다. 일치하는 행이 결과 집합에 반환됩니다.

추가 옵션. 조건자를 LIKE 및 BETWEEN과 같은 다른 Transact-SQL 조건자와 결합할 수 있습니다.

검색할 테이블의 단일 열, 열 목록 또는 모든 열을 지정할 수 있으며,

필요에 따라 단어 분리 및 형태소 분석, 동의어 사전 조회 및 노이즈 단어 제거를 위해 전체 텍스트 쿼리에서 리소스를 사용하는 언어를 지정할 수 있습니다.

CONTAINS 또는 FREETEXT 조건자에 네 부분으로 된 이름을 사용하여 연결된 서버의 대상 테이블에 대한 전체 텍스트 인덱싱된 열을 쿼리할 수 있습니다. 원격 서버에서 전체 텍스트 쿼리를 받도록 준비하려면 원격 서버의 대상 테이블 및 열에 대한 전체 텍스트 인덱스를 만든 다음 원격 서버를 연결된 서버로 추가합니다.

자세한 정보. 이러한 조건자의 구문 및 인수에 대한 자세한 내용은 CONTAINSFREETEXT를 참조하세요.

ROWSET 값 함수 CONTAINSTABLE 및 FREETEXTTABLE

사용 현황 SELECT 문의 FROM 절에서 일반 테이블 이름과 같은 CONTAINSTABLE 및 FREETEXTTABLE 함수 전체 텍스트 함수를 사용합니다.

이러한 함수 중 하나를 사용할 때 검색할 기본 테이블을 지정해야 합니다. 조건자와 마찬가지로 검색할 테이블의 단일 열, 열 목록 또는 모든 열을 지정할 수 있으며, 경우에 따라 전체 텍스트 쿼리에서 사용할 리소스의 언어를 지정할 수도 있습니다.

일반적으로 CONTAINSTABLE 또는 FREETEXTTABLE의 결과를 기본 테이블과 조인해야 합니다. 표를 조인하려면 고유 키 열 이름을 알아야 합니다. 모든 전체 텍스트 사용 테이블에서 발생하는 이 열은 테이블에 고유한 행( unique**key 열)을 적용하는 데 사용됩니다. 키 열에 대한 자세한 내용은 전체 텍스트 인덱스 만들기 및 관리를 참조 하세요.

결과 이러한 함수는 전체 텍스트 쿼리와 일치하는 0개, 하나 이상의 행 테이블을 반환합니다. 반환된 테이블에는 함수의 전체 텍스트 검색 조건에 지정된 선택 조건과 일치하는 기본 테이블의 행만 포함됩니다.

또한 이러한 함수 중 하나를 사용하는 쿼리는 다음과 같이 각 행에 대해 관련성 순위 값(RANK) 및 전체 텍스트 키(KEY)를 반환합니다.

  • KEY 열입니다. KEY 열은 반환된 행의 고유 값을 반환합니다. KEY 열을 사용하여 선택 조건을 지정할 수 있습니다.
  • RANK 열입니다. RANK 열은 각 행이 선택 조건과 일치하는 정도를 나타내는 순위 값 을 반환합니다. 행에 있는 텍스트 또는 문서의 순위 값이 높을수록 지정된 전체 텍스트 쿼리에 대한 행의 관련성이 높아집니다. 서로 다른 행의 순위를 동일하게 지정할 수 있습니다. 선택적 top_n_by_rank 매개 변수를 지정하여 반환할 일치 항목 수를 제한할 수 있습니다. 자세한 내용은 RANK를 사용하여 검색 결과 제한을 참조 하세요.

자세한 정보. 이러한 함수의 구문 및 인수에 대한 자세한 내용은 CONTAINSTABLEFREETEXTTABLE을 참조하세요.

특정 유형의 검색

특정 단어 또는 구 검색(단순 용어)

CONTAINS, CONTAINSTABLE, FREETEXT 또는 FREETEXTTABLE을 사용하여 테이블에서 특정 단어 또는 구를 검색할 수 있습니다. 예를 들어 데이터베이스의 AdventureWorks2022 ProductReview 테이블을 검색하여 "학습 곡선"이라는 문구가 있는 제품에 대한 모든 주석을 찾으려는 경우 다음과 같이 CONTAINS 조건자를 사용할 수 있습니다.

USE AdventureWorks2022  
GO  
  
SELECT Comments  
FROM Production.ProductReview  
WHERE CONTAINS(Comments, '"learning curve"')  
GO  

검색 조건(이 경우 "학습 곡선")은 복잡할 수 있으며 하나 이상의 용어로 구성될 수 있습니다.

간단한 단어 검색에 대한 자세한 정보

전체 텍스트 검색 에서 단어 (또는 토큰)는 지정된 언어의 언어 규칙에 따라 적절한 단어 분리기에 의해 경계가 식별되는 문자열입니다. 유효한 는 문장 부호가 있거나 없는 여러 단어로 구성됩니다.

예를 들어 "croissant"는 단어이고 "café au lait"는 구입니다. 이와 같은 단어와 구를 간단한 용어라고 합니다.

CONTAINSCONTAINSTABLE 은 구와 정확히 일치하는 항목을 찾습니다. FREETEXTFREETEXTTABLE 은 구를 별도의 단어로 구분합니다.

접두사를 사용하여 단어 검색(접두사 용어)

CONTAINS 또는 CONTAINSTABLE을 사용하여 지정된 접두사를 사용하여 단어 또는 구를 검색할 수 있습니다. 지정된 접두사로 시작하는 텍스트를 포함하는 열의 모든 항목이 반환됩니다. 예를 들어 top, top``pletop``ping에서와 같이 top- 접두사가 포함된 모든 행을 검색하려면 쿼리는 다음 예제와 같습니다.

USE AdventureWorks2022  
GO  
  
SELECT Description, ProductDescriptionID  
FROM Production.ProductDescription  
WHERE CONTAINS (Description, '"top*"' )  
GO  

별표(*)가 반환되기 전에 지정한 텍스트와 일치하는 모든 텍스트입니다. 텍스트와 별표가 큰따옴표로 구분되지 않은 경우 전체 텍스트 검색에서는 CONTAINS (DESCRIPTION, 'top*')별표를 와일드카드로 간주하지 않습니다.

접두사 용어가 구인 경우 구를 구성하는 각 토큰은 별도의 접두사 용어로 간주됩니다. 접두사 용어로 시작하는 단어가 있는 모든 행이 반환됩니다. 예를 들어 접두사 용어 "밝은 빵*"은 "가벼운 빵", "가볍게 빵" 또는 "가벼운 빵"이라는 텍스트가 있는 행을 찾을 수 있지만 "가볍게 구운 빵"은 반환되지 않습니다.

접두사 검색에 대한 자세한 정보

접두사 용어는 파생 단어 또는 굴절된 형식을 생성하기 위해 단어 앞에 부착된 문자열을 나타냅니다.

  • 단일 접두사 용어의 경우 지정된 용어로 시작하는 모든 단어가 결과 집합의 일부가 됩니다. 예를 들어 "auto*" 단어를 사용하면 "automatic", "automobile" 등이 검색됩니다.

  • 구의 경우 구에 포함된 각 단어가 접두사 단어로 간주됩니다. 예를 들어 "auto tran*"이라는 용어는 "자동 변속기" 및 "자동차 트랜스듀서"와 일치하지만 "자동 모터 변속기"와 일치하지 않습니다.

접두사 검색은 CONTAINSCONTAINSTABLE에서 지원됩니다.

특정 단어의 변곡 형식 검색(생성 용어)

CONTAINS, CONTAINSTABLE, FREETEXT 또는 FREETEXTTABLE을 사용하여 동사의 모든 다른 시제 및 컨듀션을 검색하거나 명사의 단수 및 복수 형태(변곡 검색) 또는 특정 단어의 동의어 형식(동의어 사전 검색)을 검색할 수 있습니다.

다음 예제에서는 AdventureWorks 데이터베이스의 ProductReview 테이블에 있는 Comments 열에서 "foot"의 모든 형태("foot", "feet" 등)를 검색합니다.

USE AdventureWorks2022  
GO  
  
SELECT Comments, ReviewerName  
FROM Production.ProductReview  
WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')  
GO  

전체 텍스트 검색은 형태소 분석기를 사용하여 동사의 다양한 시제와 컨듀션 또는 명사의 단수 및 복수 형식을 모두 검색할 수 있습니다. 형태소 분석기에 대한 자세한 내용은 검색을 위해 단어 분리기 및 형태소 분석기 구성 및 관리를 참조하세요.

생성 단어 검색에 대한 자세한 정보

굴절형은 동사의 여러 시제 및 변화와 명사의 단수형 및 복수형을 의미합니다.

예를 들어 "drive"라는 단어의 변곡 형식을 검색합니다. 테이블의 다양한 행에 "드라이브", "드라이브", "운전", "운전", "구동"이라는 단어가 포함된 경우 각 행이 단어 드라이브에서 변곡으로 생성될 수 있기 때문에 모든 행이 결과 집합에 포함됩니다.

FREETEXTFREETEXTTABLE 은 기본적으로 지정된 모든 단어의 변곡 용어를 찾습니다. CONTAINSCONTAINSTABLE은 선택적 INFLECTIONAL 인수를 지원합니다.

특정 단어의 동의어 검색

동의어 사전은 단어에 대한 사용자 지정 동의어를 정의합니다. 동의어 사전 파일에 대한 자세한 내용은 전체 텍스트 검색을 위한 동의어 사전 파일 구성 및 관리를 참조하세요.

예를 들어 동의어 사전에서 "{car, automobile, truck, van}"이라는 항목이 추가되면 "car"라는 단어의 동의어 사전 형식을 검색할 수 있습니다. "자동차", "트럭", "밴" 또는 "자동차"라는 단어를 포함하는 쿼리된 테이블의 모든 행은 각 단어가 "car"라는 단어를 포함하는 동의어 확장 집합에 속하기 때문에 결과 집합에 표시됩니다.

FREETEXTFREETEXTTABLE 에는 기본적으로 동의어 사전이 사용됩니다. CONTAINSCONTAINSTABLE은 선택적 THESAURUS 인수를 지원합니다.

다른 단어에 근접한 단어 검색

근접 용어서로 가까운 단어 또는 구를 나타냅니다. 첫 번째 및 마지막 검색어를 구분하는 비 검색어의 최대 개수를 지정할 수도 있습니다. 또한 임의의 순서나 지정한 순서로 단어 또는 구를 검색할 수 있습니다.

예를 들어 "ice"라는 단어가 "hockey"라는 단어 근처에 있거나 "아이스 스케이팅"이라는 문구가 "아이스하키"라는 문구 근처에 있는 행을 찾으려고 합니다.

CONTAINSCONTAINSTABLE

근접 검색에 대한 자세한 내용은 NEAR를 사용하여 다른 Word에 가까운 단어 검색을 참조 하세요.

가중치 값을 사용하여 단어 또는 구 검색(가중 용어)

CONTAINSTABLE 을 사용하여 단어나 구를 검색하고 가중치를 지정할 수 있습니다. 가중치는 0.0에서 1.0 사이의 숫자로 측정되며 단어와 구 집합에서 각 단어와 구의 중요도를 나타냅니다. 0.0의 가중치는 가장 낮고 무게는 1.0이 가장 높습니다.

다음 예제에서는 "Bay" 문자열로 시작하는 텍스트에 "Street" 또는 "View"가 있는 가중치를 사용하여 모든 고객 주소를 검색하는 쿼리를 보여 줍니다. 결과는 지정된 단어를 더 많이 포함하는 행에 더 높은 순위를 부여합니다.

USE AdventureWorks2022  
GO  
  
SELECT AddressLine1, KEY_TBL.RANK   
FROM Person.Address AS Address INNER JOIN  
CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*",   
         Street WEIGHT(0.9),   
         View WEIGHT(0.1)  
         ) ' ) AS KEY_TBL  
ON Address.AddressID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC  
GO  

가중 용어는 간단한 용어, 접두사 용어, 생성 용어 또는 근접 용어와 함께 사용할 수 있습니다.

가중 용어 검색에 대한 자세한 정보

가중 용어 검색 에서 가중치 값 은 단어 및 구 집합 내의 각 단어와 구에 대한 중요도를 나타냅니다. 가중치는 0.0이 가장 낮고 1.0이 가장 높습니다.

예를 들어 여러 용어를 검색하는 쿼리에서 각 검색 단어에 검색 조건의 다른 단어에 상대적인 중요도를 나타내는 가중치 값을 할당할 수 있습니다. 이러한 쿼리 유형의 결과에서는 검색 단어에 지정한 상대적 가중치에 따라 관련성이 가장 높은 행이 먼저 반환됩니다. 결과 집합에는 지정된 단어(또는 단어 사이의 내용) 중 적어도 하나를 포함하는 문서 또는 행이 반환되지만 일부 결과는 검색된 여러 개의 단어와 관련된 가중치의 차이 때문에 다른 결과보다 관련이 높은 것으로 간주됩니다.

가중 용어 검색은 CONTAINSTABLE에서 지원됩니다.

AND, OR 및 NOT 사용(부울 연산자)

CONTAINS 조건자와 CONTAINSTABLE 함수는 동일한 검색 조건을 사용하며, 둘 다 논리적 연산을 수행하는 부울 연산자 AND, OR, NOT을 사용하여 여러 검색 단어를 결합할 수 있습니다. 예를 들어 AND를 사용하여 "라떼"와 "뉴욕 스타일 베이글"이 모두 포함된 행을 찾을 수 있습니다. 예를 들어 AND NOT을 사용하여 "베이글"을 포함하지만 "크림 치즈"를 포함하지 않는 행을 찾을 수 있습니다.

반면에 FREETEXT 및 FREETEXTTABLE은 부울 단어를 검색할 단어로 취급합니다.

논리 연산자 AND, OR 및 NOT을 사용하는 다른 조건자와 CONTAINS를 결합하는 방법에 대한 자세한 내용은 검색 조건(Transact-SQL)을 참조하세요.

다음 예제에서는 CONTAINS 조건자를 사용하여 설명 ID가 5와 같지 않고 설명에 "알루미늄"이라는 단어와 "spindle"이라는 단어가 모두 포함된 설명을 검색합니다. 검색 조건은 AND 부울 연산자를 사용합니다. 이 예제에서는 AdventureWorks2022 데이터베이스의 ProductDescription 테이블을 사용합니다.

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

대/소문자, 중지 단어, 언어 및 동의어 사전

전체 텍스트 쿼리를 작성할 때 다음 옵션을 지정할 수도 있습니다.

  • 대/소문자 구분 전체 텍스트 검색 쿼리는 대/소문자를 구분하지 않습니다. 그러나 일본어에는 정형 정규화 개념이 대/소문자 구분(예: kana = 무감각)과 비슷한 여러 윗주 정형학이 있습니다. 이러한 철자 표준화는 지원되지 않습니다.

  • 중지 단어. 전체 텍스트 쿼리를 정의할 때 전체 텍스트 엔진은 검색 조건의 중지 단어(노이즈 단어라고도 함)를 삭제합니다. 중지 단어는 자주 발생할 수 있지만 일반적으로 특정 텍스트를 검색할 때는 도움이 되지 않는 "a", "and" "is" 또는 "the"와 같은 단어입니다. 중지 단어는 중지 목록에 나열됩니다. 각 전체 텍스트 인덱스는 인덱싱 시 쿼리 또는 인덱스에서 생략되는 중지 단어를 결정하는 특정 중지 목록과 연결됩니다. 자세한 내용은 전체 텍스트 검색에 대한 중지 단어 및 중지 목록 구성 및 관리를 참조하세요.

  • LANGUAGE 옵션이 있는 언어입니다. 많은 쿼리 용어는 단어 분리기 동작에 크게 의존합니다. 올바른 단어 분리기(및 형태소 분석기) 및 동의어 사전 파일을 사용하려면 LANGUAGE 옵션을 지정하는 것이 좋습니다. 자세한 내용은 전체 텍스트 인덱스 만들기 시 언어 선택을 참조하세요.

  • 동의어 사전. FREETEXT 및 FREETEXTTABLE 쿼리는 기본적으로 동의어 사전을 사용합니다. CONTAINS 및 CONTAINSTABLE 은 선택적 THESAURUS 인수를 지원합니다. 자세한 내용은 전체 텍스트 검색을 위한 동의어 사전 파일 구성 및 관리를 참조하세요.

토큰화 결과 확인

쿼리에서 지정된 단어 분리기, 동의어 사전 및 중지 목록 조합을 적용한 후 sys.dm_fts_parser 동적 관리 뷰를 사용하여 전체 텍스트 검색에서 결과를 토큰화하는 방법을 확인할 수 있습니다. 자세한 내용은 sys.dm_fts_parser(Transact-SQL)를 참조 하세요.

참고 항목

CONTAINS(Transact-SQL)
CONTAINSTABLE(Transact-SQL)
FREETEXT(Transact-SQL)
FREETEXTTABLE(Transact-SQL)
전체 텍스트 검색 쿼리 만들기(Visual Database Tools)
전체 텍스트 쿼리의 성능 향상