다음을 통해 공유


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

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

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

  • 단어와 구를 일치시키려면 CONTAINSCONTAINSTABLE을 사용하세요.
  • 정확한 표현은 아니지만 의미와 일치하려면 FREETEXTFREETEXTTABLE을 사용합니다.

각 조건자 및 함수의 예

다음 예에서는 모두 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" 단어 근처에 "aluminum"이라는 단어가 포함된 모든 제품에 대한 설명 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/CONTAINSTABLEFREETEXT/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를 참조하세요.

행 집합 함수 CONTAINSTABLE 및 FREETEXTTABLE

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

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

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

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

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

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

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

특정 유형의 검색

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

CONTAINS, CONTAINSTABLE, FREETEXT 또는 FREETEXTTABLE을 사용하여 테이블에서 특정 단어 또는 구를 검색할 수 있습니다. 예를 들어 AdventureWorks2022 데이터베이스의 PRODUCT 테이블을 검색하여 "learning curve"라는 구가 포함된 제품 설명을 모두 찾으려면 CONTAINS 조건자를 다음과 같이 사용합니다.

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

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

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

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

예를 들어 "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*')와 같이 텍스트와 별표가 큰따옴표로 구분되지 않은 경우, 전체 텍스트 검색에서는 별표를 와일드카드로 간주하지 않습니다.

접두사 용어가 구문인 경우, 구문을 구성하는 각 토큰은 별도의 접두사 용어로 간주됩니다. 접두사 용어로 시작하는 단어가 있는 모든 행이 반환됩니다. 예를 들어 접두사 단어가 "light bread"이면 "light breaded", "lightly breaded", "light bread" 등의 텍스트가 포함된 행이 검색되지만 "lightly toasted bread"는 반환되지 않습니다.

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

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

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

  • 구의 경우 구에 포함된 각 단어가 접두사 단어로 간주됩니다. 예를 들어 "auto tran*"은 "automatic transmission" 및 "automobile transducer"와 일치하지만 "automatic motor transmission"과는 일치하지 않습니다.

접두사 검색은 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"라는 단어의 굴절형을 검색합니다. 테이블의 다양한 행에 "drive", "drives", "drove", "driving", "driven"이라는 단어가 포함된 경우 각 행이 단어 drive에서 굴절형으로 생성될 수 있기 때문에 모든 행이 결과 집합에 포함됩니다.

FREETEXTFREETEXTTABLE 은 기본적으로 지정된 모든 단어의 굴절형을 검색합니다. CONTAINSCONTAINSTABLE은 선택적 INFLECTIONAL 인수를 지원합니다.

특정 단어의 동의어 검색

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

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

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

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

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

예를 들어, "ice" 단어가 "hockey" 단어와 인접한 행을 찾거나 "ice skating" 구문이 "ice hockey" 구문과 인접한 행을 찾으려고할 수 있습니다.

CONTAINSCONTAINSTABLE

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

가중치를 사용하는 단어 또는 구(가중치 용어) 검색

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를 사용하여 "latte"와 "New York-style bagel"이 모두 포함된 행을 찾을 수 있습니다. 예를 들어 AND NOT을 사용하여 "bagel"을 포함하지만 "cream cheese"를 포함하지 않는 행을 찾을 수 있습니다.

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

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

예시

다음 예에서는 CONTAINS 조건자를 사용하여 설명 ID가 5가 아니고 설명에 "aluminum"이라는 단어와 "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)
전체 텍스트 쿼리 성능 향상