전체 텍스트 검색Full-Text Search

SQL ServerSQL ServerAzure SQL 데이터베이스Azure SQL Database 의 전체 텍스트 검색을 사용하면 사용자와 응용 프로그램이 SQL ServerSQL Server 테이블의 문자 기반 데이터에 대해 전체 텍스트 쿼리를 실행할 수 있습니다.Full-Text Search in SQL ServerSQL Server and Azure SQL 데이터베이스Azure SQL Database lets users and applications run full-text queries against character-based data in SQL ServerSQL Server tables.

기본 태스크Basic tasks

이 항목에서는 전체 텍스트 검색의 개요를 제공하고 해당 구성 요소 및 아키텍처에 대해 설명합니다.This topic provides an overview of Full-Text Search and describes its components and its architecture. 지금 바로 시작하려면 기본 태스크는 다음과 같습니다.If you prefer to get started right away, here are the basic tasks.

참고

Full-Text Search is an optional component of the SQL ServerSQL Server 데이터베이스 엔진의 선택적 구성 요소입니다.Full-Text Search is an optional component of the SQL ServerSQL Server Database Engine. SQL Server를 설치할 때 전체 텍스트 검색을 선택하지 않은 경우 SQL Server 설치 프로그램을 다시 실행하여 검색을 추가합니다.If you didn't select Full-Text Search when you installed SQL Server, run SQL Server Setup again to add it.

개요Overview

전체 텍스트 인덱스에는 테이블에 있는 하나 이상의 문자 기반 열이 포함됩니다.A full-text index includes one or more character-based columns in a table. 이러한 열의 데이터 형식은 char, varchar, nchar, nvarchar, text, ntext, image, xml 또는 varbinary(max)FILESTREAM 중 하나일 수 있습니다.These columns can have any of the following data types: char, varchar, nchar, nvarchar, text, ntext, image, xml, or varbinary(max) and FILESTREAM. 각 전체 텍스트 인덱스는 테이블의 열을 하나 이상 인덱싱하며, 각 열은 특정 언어를 사용할 수 있습니다.Each full-text index indexes one or more columns from the table, and each column can use a specific language.

전체 텍스트 쿼리는 영어와 일본어 같은 특정 언어의 규칙을 기준으로 단어와 구에 적용되어 전체 텍스트 인덱스의 텍스트 데이터에 대해 언어 검색을 수행합니다.Full-text queries perform linguistic searches against text data in full-text indexes by operating on words and phrases based on the rules of a particular language such as English or Japanese. 전체 텍스트 쿼리에는 간단한 단어와 구 또는 여러 형식의 단어나 구가 포함될 수 있습니다.Full-text queries can include simple words and phrases or multiple forms of a word or phrase. 전체 텍스트 쿼리는 일치 항목( 적중이라고도 함)이 하나 이상 있는 문서를 모두 반환합니다.A full-text query returns any documents that contain at least one match (also known as a hit). 대상 문서가 전체 텍스트 쿼리에 지정된 모든 용어를 포함하며 일치하는 용어 사이의 거리와 같이 다른 모든 검색 조건과 일치할 때 일치 항목이 발생합니다.A match occurs when a target document contains all the terms specified in the full-text query, and meets any other search conditions, such as the distance between the matching terms.

전체 텍스트 검색 쿼리 Full-Text Search queries

전체 텍스트 인덱스에 열을 추가한 후에는 사용자와 응용 프로그램이 해당 열의 텍스트에 대해 전체 텍스트 쿼리를 실행할 수 있습니다.After columns have been added to a full-text index, users and applications can run full-text queries on the text in the columns. 이러한 쿼리는 다음 중 하나를 검색할 수 있습니다.These queries can search for any of the following:

  • 하나 이상의 특정 단어 또는 구(단순 단어)One or more specific words or phrases (simple term)

  • 특정 텍스트로 시작하는 단어 또는 그러한 단어를 포함하는 구(접두사 단어)A word or a phrase where the words begin with specified text (prefix term)

  • 특정 단어의 굴절형(생성 단어)Inflectional forms of a specific word (generation term)

  • 다른 단어나 구와 근접한 단어나 구(근접 단어)A word or phrase close to another word or phrase (proximity term)

  • 특정 단어의 동의어 형태(동의어 사전)Synonymous forms of a specific word (thesaurus)

  • 가중치를 사용하는 단어나 구(가중치 단어)Words or phrases using weighted values (weighted term)

    전체 텍스트 쿼리는 대/소문자를 구분하지 않습니다.Full-text queries are not case-sensitive. 예를 들어 "Aluminum" 또는 "aluminum"을 검색하면 동일한 결과가 반환됩니다.For example, searching for "Aluminum" or "aluminum" returns the same results.

    전체 텍스트 쿼리는 일부 Transact-SQLTransact-SQL 조건자(CONTAINS 및 FREETEXT) 및 함수(CONTAINSTABLE 및 FREETEXTTABLE) 집합을 사용합니다.Full-text queries use a small set of Transact-SQLTransact-SQL predicates (CONTAINS and FREETEXT) and functions (CONTAINSTABLE and FREETEXTTABLE). 그러나 전체 텍스트 쿼리의 구조는 지정된 비즈니스 시나리오의 검색 목표에 따라 달라집니다.However, the search goals of a given business scenario influence the structure of the full-text queries. 예를 들어For example:

  • e-비즈니스 - 웹 사이트에서 제품 검색:e-business—searching for a product on a website:

    SELECT product_id   
    FROM products   
    WHERE CONTAINS(product_description, ”Snap Happy 100EZ” OR FORMSOF(THESAURUS,’Snap Happy’) OR ‘100EZ’)   
    AND product_cost < 200 ;  
    
  • 채용 시나리오 - SQL ServerSQL Server를 사용하여 작업한 경험이 있는 지원자 검색:Recruitment scenario—searching for job candidates that have experience working with SQL ServerSQL Server:

    SELECT candidate_name,SSN   
    FROM candidates   
    WHERE CONTAINS(candidate_resume,”SQL Server”) AND candidate_division =DBA;  
    

    자세한 내용은 전체 텍스트 검색을 사용한 쿼리를 참조하세요.For more information, see Query with Full-Text Search.

LIKE 조건자와 전체 텍스트 검색 쿼리 비교 Compare Full-Text Search queries to the LIKE predicate

전체 텍스트 검색과 달리 LIKE Transact-SQLTransact-SQL 조건자는 문자 패턴에 대해서만 적용됩니다.In contrast to full-text search, the LIKE Transact-SQLTransact-SQL predicate works on character patterns only. 또한 LIKE 조건자는 서식 있는 이진 데이터를 쿼리하는 데 사용할 수도 없습니다.Also, you cannot use the LIKE predicate to query formatted binary data. 특히 구조화되지 않은 많은 텍스트 데이터에 대한 LIKE 쿼리는 동일한 데이터에 대한 전체 텍스트 쿼리보다 훨씬 느립니다.Furthermore, a LIKE query against a large amount of unstructured text data is much slower than an equivalent full-text query against the same data. 수백만 개의 텍스트 데이터 행에 대해 LIKE 쿼리를 실행하면 결과가 반환되기까지 몇 분이 걸릴 수 있지만 같은 데이터에 대해 전체 텍스트 쿼리를 실행하면 반환되는 행 수에 따라 몇 초 내에 완료됩니다.A LIKE query against millions of rows of text data can take minutes to return; whereas a full-text query can take only seconds or less against the same data, depending on the number of rows that are returned.

전체 텍스트 검색 아키텍처 Full-Text Search architecture

전체 텍스트 검색 아키텍처는 다음과 같은 프로세스로 구성됩니다.Full-text search architecture consists of the following processes:

  • SQL ServerSQL Server 프로세스(sqlservr.exe).The SQL ServerSQL Server process (sqlservr.exe).

  • 필터 데몬 호스트 프로세스(fdhost.exe).The filter daemon host process (fdhost.exe).

    보안상의 이유로 필터가 필터 데몬 호스트라는 개별 프로세스에 의해 로드됩니다.For security reasons, filters are loaded by separate processes called the filter daemon hosts. fdhost.exe 프로세스는 FDHOST Launcher 서비스(MSSQLFDLauncher)에 의해 만들어지고 FDHOST Launcher 서버 계정의 보안 자격 증명을 사용하여 실행됩니다.The fdhost.exe processes are created by an FDHOST launcher service (MSSQLFDLauncher), and they run under the security credentials of the FDHOST launcher service account. 따라서 전체 텍스트 인덱싱과 전체 텍스트 쿼리를 수행하려면 FDHOST Launcher 서비스를 실행해야 합니다.Therefore, the FDHOST launcher service must be running for full-text indexing and full-text querying to work. 이 서비스에 대한 서비스 계정을 설정하는 방법은 전체 텍스트 필터 데몬 시작 관리자 서비스 계정 설정을 참조하세요.For information about setting the service account for this service, see Set the Service Account for the Full-text Filter Daemon Launcher.

    이러한 두 프로세스에는 전체 텍스트 검색 아키텍처의 구성 요소가 포함됩니다.These two processes contain the components of the full-text search architecture. 이러한 구성 요소 및 이들의 관계는 다음 그림에 요약되어 있습니다.These components and their relationships are summarized in the following illustration. 구성 요소는 이 그림 다음에 설명되어 있습니다.The components are described after the illustration.

    전체 텍스트 검색 아키텍처full-text search architecture

SQL Server 프로세스 SQL Server process

SQL ServerSQL Server 프로세스는 전체 텍스트 검색에 다음 구성 요소를 사용합니다.The SQL ServerSQL Server process uses the following components for full-text search:

  • 사용자 테이블.User tables. 이 테이블은 전체 텍스트 인덱싱할 데이터를 포함합니다.These tables contain the data to be full-text indexed.

  • 전체 텍스트 Gatherer.Full-text gatherer. 전체 텍스트 Gatherer는 전체 텍스트 탐색 스레드와 함께 작동합니다.The full-text gatherer works with the full-text crawl threads. 이 구성 요소는 전체 텍스트 카탈로그를 모니터링하고 전체 텍스트 인덱스 채우기를 예약 및 수행합니다.It is responsible for scheduling and driving the population of full-text indexes, and also for monitoring full-text catalogs.

  • 동의어 사전 파일.Thesaurus files. 이 파일은 검색어의 동의어를 포함합니다.These files contain synonyms of search terms. 자세한 내용은 전체 텍스트 검색에 사용할 동의어 사전 파일 구성 및 관리를 참조하세요.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • 중지 목록 개체.Stoplist objects. Stoplist 개체는 검색에 유용하지 않은 일반적인 단어의 목록을 포함합니다.Stoplist objects contain a list of common words that are not useful for the search. 자세한 내용은 전체 텍스트 검색에 사용할 중지 단어와 중지 목록 구성 및 관리를 참조하세요.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • SQL ServerSQL Server 쿼리 프로세서. SQL ServerSQL Server query processor. 쿼리 프로세서는 SQL 쿼리를 컴파일하고 실행합니다.The query processor compiles and executes SQL queries. SQL 쿼리에 전체 텍스트 검색 쿼리가 포함된 경우 해당 쿼리는 컴파일 및 실행 중에 전체 텍스트 엔진으로 전송됩니다.If a SQL query includes a full-text search query, the query is sent to the Full-Text Engine, both during compilation and during execution. 쿼리 결과는 전체 텍스트 인덱스와 일치합니다.The query result is matched against the full-text index.

  • 전체 텍스트 엔진.Full-Text Engine. SQL ServerSQL Server 의 전체 텍스트 엔진은 쿼리 프로세서와 완전히 통합됩니다.The Full-Text Engine in SQL ServerSQL Server is fully integrated with the query processor. 전체 텍스트 엔진은 전체 텍스트 쿼리를 컴파일하고 실행합니다.The Full-Text Engine compiles and executes full-text queries. 쿼리 실행의 일부로 전체 텍스트 엔진은 동의어 사전 및 중지 목록에서 입력을 받을 수 있습니다.As part of query execution, the Full-Text Engine might receive input from the thesaurus and stoplist.

    참고

    SQL Server 2008SQL Server 2008 이상 버전에서는 전체 텍스트 엔진이 별도의 서비스가 아닌 SQL ServerSQL Server 프로세스에 있습니다.In SQL Server 2008SQL Server 2008 and later versions, the Full-Text Engine resides in the SQL ServerSQL Server process, rather than in a separate service. 전체 텍스트 엔진을 데이터베이스 엔진에 통합하면 전체 텍스트 관리 효율성, 혼합 쿼리의 최적화 및 전체 성능이 향상됩니다.Integrating the Full-Text Engine into the Database Engine improved full-text manageability, optimization of mixed query, and overall performance.

  • 인덱스 기록기(인덱서).Index writer (indexer). 인덱스 기록기는 인덱싱된 토큰을 저장하는 데 사용되는 구조를 만듭니다.The index writer builds the structure that is used to store the indexed tokens.

  • 필터 데몬 관리자.Filter daemon manager. 필터 데몬 관리자는 전체 텍스트 엔진 필터 데몬 호스트의 상태를 모니터링합니다.The filter daemon manager is responsible for monitoring the status of the Full-Text Engine filter daemon host.

Filter Daemon Host process Filter Daemon Host process

필터 데몬 호스트는 전체 텍스트 엔진에 의해 시작되는 프로세스로,The filter daemon host is a process that is started by the Full-Text Engine. 테이블 데이터의 액세스, 필터링 및 단어 분리, 그리고 쿼리 입력의 단어 분리 및 형태소 분석을 담당하는 다음과 같은 전체 텍스트 검색 구성 요소를 실행합니다.It runs the following full-text search components, which are responsible for accessing, filtering, and word breaking data from tables, as well as for word breaking and stemming the query input.

필터 데몬 호스트의 구성 요소는 다음과 같습니다.The components of the filter daemon host are as follows:

  • 프로토콜 처리기.Protocol handler. 이 구성 요소는 부가적인 처리를 위해 메모리에서 데이터를 가져오며 지정된 데이터베이스의 사용자 테이블에 있는 데이터에 액세스합니다.This component pulls the data from memory for further processing and accesses data from a user table in a specified database. 프로토콜 처리기가 수행해야 하는 기능 중 하나는 전체 텍스트 인덱싱되는 열에서 데이터를 수집하고 필요에 따라 필터링과 단어 분리기를 적용하는 필터 데몬 호스트에 이 데이터를 전달하는 것입니다.One of its responsibilities is to gather data from the columns being full-text indexed and pass it to the filter daemon host, which will apply filtering and word breaker as required.

  • 필터.Filters. 일부 데이터 형식은 필터링을 적용해야 varbinary, varbinary(max), image또는 xml 열의 데이터를 포함하여 문서의 데이터를 전체 텍스트 인덱싱할 수 있습니다.Some data types require filtering before the data in a document can be full-text indexed, including data in varbinary, varbinary(max), image, or xml columns. 지정된 문서에 사용되는 필터는 해당 문서 유형에 따라 다릅니다.The filter used for a given document depends on its document type. 예를 들어 Microsoft Word(.doc) 문서, Microsoft Excel(.xls) 문서 및 XML(.xml) 문서에는 서로 다른 필터가 사용됩니다.For example, different filters are used for Microsoft Word (.doc) documents, Microsoft Excel (.xls) documents, and XML (.xml) documents. 그러면 필터는 포함된 서식을 제거하고 텍스트와 텍스트 위치에 대한 정보를 유지하여 문서에서 텍스트 청크를 추출합니다.Then the filter extracts chunks of text from the document, removing embedded formatting and retaining the text and, potentially, information about the position of the text. 결과는 텍스트 정보의 스트림입니다.The result is a stream of textual information. 자세한 내용은 고급 분석 확장 구성 및 관리를 참조하세요.For more information, see Configure and Manage Filters for Search.

  • 단어 분리기 및 형태소 분석기.Word breakers and stemmers. 단어 분리기는 지정된 언어의 어휘 규칙을 기준으로 단어 경계(단어 분리)를 찾는 언어별 구성 요소입니다.A word breaker is a language-specific component that finds word boundaries based on the lexical rules of a given language (word breaking). 각 단어 분리기는 동사를 변화시키고 활용 형태상의 확장을 수행하는 언어별 형태소 분석기 구성 요소와 연결됩니다.Each word breaker is associated with a language-specific stemmer component that conjugates verbs and performs inflectional expansions. 인덱싱할 때 필터 데몬 호스트는 단어 분리기와 형태소 분석기를 사용하여 지정된 테이블 열의 텍스트 데이터에 대해 언어 분석을 수행합니다.At indexing time, the filter daemon host uses a word breaker and stemmer to perform linguistic analysis on the textual data from a given table column. 전체 텍스트 인덱스의 테이블 열과 연결된 언어에 따라 열을 인덱싱하는 데 사용되는 단어 분리기와 형태소 분석기가 결정됩니다.The language that is associated with a table column in the full-text index determines which word breaker and stemmer are used for indexing the column. 자세한 내용은 검색을 위해 단어 분리기와 형태소 분석기 구성 및 관리를 참조하세요.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

전체 텍스트 검색 처리 Full-Text Search processing

전체 텍스트 검색은 전체 텍스트 엔진을 통해 수행됩니다.Full-text search is powered by the Full-Text Engine. 전체 텍스트 엔진은 인덱싱 지원과 쿼리 지원의 두 가지 역할을 수행합니다.The Full-Text Engine has two roles: indexing support and querying support.

전체 텍스트 인덱싱 프로세스 Full-Text indexing process

탐색이라고도 하는 전체 텍스트 채우기가 시작되면 전체 텍스트 엔진은 대용량 데이터 일괄 처리를 메모리에 밀어 넣고 필터 데몬 호스트에 알립니다.When a full-text population (also known as a crawl) is initiated, the Full-Text Engine pushes large batches of data into memory and notifies the filter daemon host. 호스트가 데이터를 필터링하고 데이터의 단어를 분리하며 변환된 데이터를 반전된 단어 목록으로 변환합니다.The host filters and word breaks the data and converts the converted data into inverted word lists. 그런 다음 전체 텍스트 검색은 변환된 데이터를 단어 목록에서 끌어오고 데이터를 처리하여 중지 단어를 제거하며 하나의 일괄 처리에 대한 단어 목록을 하나 이상의 반전된 인덱스를 통해 유지합니다.The full-text search then pulls the converted data from the word lists, processes the data to remove stopwords, and persists the word lists for a batch into one or more inverted indexes.

인덱싱 데이터가 varbinary(max) 또는 image 열에 저장되어 있으면 IFilter 인터페이스를 구현하는 필터는 해당 데이터에 지정된 파일 형식(예: MicrosoftMicrosoft Word)을 기준으로 텍스트를 추출합니다.When indexing data stored in a varbinary(max) or image column, the filter, which implements the IFilter interface, extracts text based on the specified file format for that data (for example, MicrosoftMicrosoft Word). 필터 구성 요소에서 varbinary(max)또는 image 데이터를 메모리에 밀어넣는 대신 filterdata 폴더에 기록해야 하는 경우도 있습니다.In some cases, the filter components require the varbinary(max), or image data to be written out to the filterdata folder, instead of being pushed into memory.

수집된 텍스트 데이터는 처리 중에 단어 분리기를 통과하여 텍스트가 개별 토큰 또는 키워드로 분리됩니다.As part of processing, the gathered text data is passed through a word breaker to separate the text into individual tokens, or keywords. 토큰화에 사용되는 언어는 열 수준에서 지정되거나 필터 구성 요소로 varbinary(max), image또는 xml 데이터 내에서 식별할 수 있습니다.The language used for tokenization is specified at the column level, or can be identified within varbinary(max), image, or xml data by the filter component.

추가 처리를 수행하여 중지 단어를 제거하고 전체 텍스트 인덱스나 인덱스 조각에 저장되기 전에 토큰을 정규화할 수도 있습니다.Additional processing may be performed to remove stopwords, and to normalize tokens before they are stored in the full-text index or an index fragment.

채우기가 완료되면 인덱스 조각을 하나의 마스터 전체 텍스트 인덱스로 병합하는 최종 병합 프로세스가 실행됩니다.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. 이렇게 하면 많은 인덱스 조각 대신 마스터 인덱스만 쿼리하면 되기 때문에 쿼리 성능이 향상되며 개선된 평가 통계를 사용하여 관련성 등급을 지정할 수 있습니다.This results in improved query performance since only the master index needs to be queried rather than a number of index fragments, and better scoring statistics may be used for relevance ranking.

전체 텍스트 쿼리 프로세스 Full-Text querying process

쿼리 프로세서는 쿼리의 전체 텍스트 부분을 처리하기 위해 전체 텍스트 엔진에 전달합니다.The query processor passes the full-text portions of a query to the Full-Text Engine for processing. 전체 텍스트 엔진은 단어 분리를 수행하고 필요에 따라 동의어 사전 확장, 형태소 분석 및 중지 단어(의미 없는 단어) 처리도 수행합니다.The Full-Text Engine performs word breaking and, optionally, thesaurus expansions, stemming, and stopword (noise-word) processing. 그러면 쿼리의 전체 텍스트 부분은 SQL 연산자 형식, 주로 STVF(스트리밍 테이블 반환 함수)로 표시됩니다.Then the full-text portions of the query are represented in the form of SQL operators, primarily as streaming table-valued functions (STVFs). 쿼리를 실행하는 동안 이러한 STVF는 반전된 인덱스에 액세스하여 올바른 결과를 검색합니다.During query execution, these STVFs access the inverted index to retrieve the correct results. 결과는 이 시점에서 클라이언트에 반환되거나 추가로 처리된 후 클라이언트에 반환됩니다.The results are either returned to the client at this point, or they are further processed before being returned to the client.

전체 텍스트 인덱스 아키텍처Full-text index architecture

전체 텍스트 인덱스의 정보는 전체 텍스트 엔진이 테이블에서 특정 단어나 단어 조합을 빠르게 검색할 수 있는 전체 텍스트 쿼리를 컴파일하는 데 사용됩니다.The information in full-text indexes is used by the Full-Text Engine to compile full-text queries that can quickly search a table for particular words or combinations of words. 전체 텍스트 인덱스는 하나 이상의 데이터베이스 테이블 열에 중요한 단어와 그 위치에 대한 정보를 저장합니다.A full-text index stores information about significant words and their location within one or more columns of a database table. 전체 텍스트 인덱스는 SQL ServerSQL Server용 전체 텍스트 엔진이 작성하고 유지 관리하는 특수한 유형의 토큰 기반 인덱스입니다.A full-text index is a special type of token-based functional index that is built and maintained by the Full-Text Engine for SQL ServerSQL Server. 전체 텍스트 인덱스의 작성 과정은 다른 유형의 인덱스를 작성하는 것과 다릅니다.The process of building a full-text index differs from building other types of indexes. 특정 행에 저장된 값을 기준으로 B-트리 구조를 생성하는 대신 전체 텍스트 엔진은 인덱싱되는 텍스트의 개별 토큰을 기준으로 반전된 누적 압축 인덱스 구조를 작성합니다.Instead of constructing a B-tree structure based on a value stored in a particular row, the Full-Text Engine builds an inverted, stacked, compressed index structure based on individual tokens from the text being indexed. 전체 텍스트 인덱스 크기는 SQL ServerSQL Server 인스턴스가 실행되는 컴퓨터의 사용 가능한 메모리 리소스에 의해서만 제한됩니다.The size of a full-text index is limited only by the available memory resources of the computer on which the instance of SQL ServerSQL Server is running.

전체 텍스트 인덱스는 이전 버전의 SQL Server 2008SQL Server 2008에서 파일 시스템에 있었던 것과는 달리 SQL ServerSQL Server부터는 데이터베이스 엔진과 통합됩니다.Beginning in SQL Server 2008SQL Server 2008, the full-text indexes are integrated with the Database Engine, instead of residing in the file system as in previous versions of SQL ServerSQL Server. 새 데이터베이스에서 전체 텍스트 카탈로그는 어떤 파일 그룹에도 속하지 않는 가상 개체이며, 전체 텍스트 인덱스의 그룹을 나타내는 논리적인 개념일 뿐입니다.For a new database, the full-text catalog is now a virtual object that does not belong to any filegroup; it is merely a logical concept that refers to a group of the full-text indexes. 그러나 데이터 파일이 들어 있는 전체 텍스트 카탈로그인 SQL Server 2005SQL Server 2005 데이터베이스를 업그레이드하는 동안에는 새 파일 그룹이 만들어집니다. 자세한 내용은 전체 텍스트 검색 업그레이드를 참조하세요.Note, however, that during upgrade of a SQL Server 2005SQL Server 2005 database, any full-text catalog that contains data files, a new filegroup is created; for more information, see Upgrade Full-Text Search.

테이블당 한 개의 전체 텍스트 인덱스만 허용합니다.Only one full-text index is allowed per table. 테이블에 대한 전체 텍스트 인덱스를 만들려면 해당 테이블에 Null이 아닌 고유한 단일 열이 있어야 합니다.For a full-text index to be created on a table, the table must have a single, unique nonnull column. char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary형식의 열에 대해 전체 텍스트 인덱스를 만들 수 있으며 varbinary(max) 를 전체 텍스트 검색의 인덱스로 사용할 수도 있습니다.You can build a full-text index on columns of type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary, and varbinary(max) can be indexed for full-text search. 데이터 형식이 varbinary, varbinary(max), image또는 xml 인 열에 대한 전체 텍스트 인덱스를 만들려면 유형 열을 지정해야 합니다.Creating a full-text index on a column whose data type is varbinary, varbinary(max), image, or xml requires that you specify a type column. 유형 열 은 각 행에 있는 문서의 파일 확장명(.doc, .pdf, .xls 등)이 저장되는 테이블 열입니다.A type column is a table column in which you store the file extension (.doc, .pdf, .xls, and so forth) of the document in each row.

전체 텍스트 인덱스 구조 Full-text index structure

전체 텍스트 인덱스의 구조를 잘 알게 되면 전체 텍스트 엔진의 작동 원리를 이해하는 데 도움이 됩니다.A good understanding of the structure of a full-text index will help you understand how the Full-Text Engine works. 이 항목에서 예제 테이블로 사용하는 테이블은 Document Adventure WorksAdventure Works 테이블에서 발췌한 것입니다.This topic uses the following excerpt of the Document table in Adventure WorksAdventure Works as an example table. 이 테이블에는 DocumentID 열 및 Title 열의 2개 열과 테이블의 3개 행만 표시됩니다.This excerpt shows only two columns, the DocumentID column and the Title column, and three rows from the table.

이 예에서는 Title 열에 대해 전체 텍스트 인덱스를 만들었다고 가정합니다.For this example, we will assume that a full-text index has been created on the Title column.

DocumentIDDocumentID TitleTitle
11 Crank Arm and Tire MaintenanceCrank Arm and Tire Maintenance
22 Front Reflector Bracket and Reflector Assembly 3Front Reflector Bracket and Reflector Assembly 3
33 Front Reflector Bracket InstallationFront Reflector Bracket Installation

예를 들어 조각 1을 보여 주는 아래 표에서는 Document 테이블의 Title 열에 생성된 전체 텍스트 인덱스의 내용을 설명합니다.For example, the following table, which shows Fragment 1, depicts the contents of the full-text index created on the Title column of the Document table. 전체 텍스트 인덱스에는 이 표에 표시되어 있는 것보다 많은 정보가 포함되어 있습니다.Full-text indexes contain more information than is presented in this table. 이 표는 전체 텍스트 인덱스를 논리적으로 표현한 것이며 설명 목적으로만 제공됩니다.The table is a logical representation of a full-text index and is provided for demonstration purposes only. 행은 디스크 사용률을 최적화하기 위해 압축된 형식으로 저장됩니다.The rows are stored in a compressed format to optimize disk usage.

데이터는 원래 문서와 다르게 반전되었습니다.Notice that the data has been inverted from the original documents. 왜냐하면 키워드가 문서 ID로 매핑되기 때문입니다.Inversion occurs because the keywords are mapped to the document IDs. 따라서 전체 텍스트 인덱스를 반전된 인덱스라고 부르기도 합니다.For this reason, a full-text index is often referred to as an inverted index.

또한 전체 텍스트 인덱스에서 "and" 키워드가 제거되었습니다.Also notice that the keyword "and" has been removed from the full-text index. 왜냐하면 "and"가 중지 단어이고 전체 텍스트 인덱스에서 중지 단어를 제거하면 디스크 공간이 크게 절약되어 쿼리 성능을 높일 수 있기 때문입니다.This is done because "and" is a stopword, and removing stopwords from a full-text index can lead to substantial savings in disk space thereby improving query performance. 중지 단어에 대한 자세한 내용은 전체 텍스트 검색에 사용할 중지 단어와 중지 목록 구성 및 관리를 참조하세요.For more information about stopwords, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

조각 1Fragment 1

키워드Keyword ColIdColId DocIdDocId 발생 빈도Occurrence
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
유지 관리Maintenance 11 11 55
FrontFront 11 22 11
FrontFront 11 33 11
ReflectorReflector 11 22 22
ReflectorReflector 11 22 55
ReflectorReflector 11 33 22
BracketBracket 11 22 33
BracketBracket 11 33 33
어셈블리Assembly 11 22 66
33 11 22 77
설치Installation 11 33 44

Keyword 열에는 인덱싱할 때 추출한 단일 토큰이 표시됩니다.The Keyword column contains a representation of a single token extracted at indexing time. 토큰을 구성하는 요소는 단어 분리기에 의해 결정됩니다.Word breakers determine what makes up a token.

ColId 열에는 전체 텍스트 인덱싱된 특정 열에 해당하는 값이 포함됩니다.The ColId column contains a value that corresponds to a particular column that is full-text indexed.

Docld 열에는 전체 텍스트 인덱싱된 테이블의 특정 전체 텍스트 키 값으로 매핑되는 8바이트 정수 값이 포함됩니다.The DocId column contains values for an eight-byte integer that maps to a particular full-text key value in a full-text indexed table. 이 매핑은 전체 텍스트 키가 정수 데이터 형식이 아닌 경우에만 필요합니다.This mapping is necessary when the full-text key is not an integer data type. 이러한 경우 전체 텍스트 키 값과 Docld 값 사이의 매핑은 DocId Mapping 테이블이라는 개별 테이블에서 유지됩니다.In such cases, mappings between full-text key values and DocId values are maintained in a separate table called the DocId Mapping table. 이러한 매핑을 쿼리하려면 sp_fulltext_keymappings 시스템 저장 프로시저를 사용합니다.To query for these mappings use the sp_fulltext_keymappings system stored procedure. 검색 조건을 충족하려면 위 테이블의 DocId 값이 쿼리 중인 기본 테이블에서 행을 검색할 수 있도록 DocId Mapping 테이블과 조인되어야 합니다.To satisfy a search condition, DocId values from the above table need to be joined with the DocId Mapping table to retrieve rows from the base table being queried. 기본 테이블의 전체 텍스트 키 값이 정수 형식인 경우 값은 DocId로 직접 사용되며 매핑이 필요하지 않습니다.If the full-text key value of the base table is an integer type, the value directly serves as the DocId and no mapping is necessary. 따라서 정수 전체 텍스트 키 값을 사용하면 전체 텍스트 쿼리 최적화에 도움이 될 수 있습니다.Therefore, using integer full-text key values can help optimize full-text queries.

Occurrence 열에는 정수 값이 포함됩니다.The Occurrence column contains an integer value. 각 DocId 값에는 해당 DocId 내의 특정 키워드에 대한 상대적 단어 오프셋에 해당하는 발생 빈도 값의 목록이 있습니다.For each DocId value, there is a list of occurrence values that correspond to the relative word offsets of the particular keyword within that DocId. 발행 빈도 값은 구 또는 근접 단어 일치를 확인하는 데 유용합니다. 예를 들어 구는 발생 빈도 값의 숫자가 서로 인접해 있습니다.Occurrence values are useful in determining phrase or proximity matches, for example, phrases have numerically adjacent occurrence values. 발생 빈도 값은 관련성을 평가하는 데에도 유용합니다. 예를 들어 DocId의 키워드 발생 빈도를 평가 시 사용할 수 있습니다.They are also useful in computing relevance scores; for example, the number of occurrences of a keyword in a DocId may be used in scoring.

전체 텍스트 인덱스 조각 Full-text index fragments

논리적 전체 텍스트 인덱스는 일반적으로 여러 개의 내부 테이블로 분할됩니다.The logical full-text index is usually split across multiple internal tables. 이러한 각 내부 테이블을 전체 텍스트 인덱스 조각이라고 부릅니다.Each internal table is called a full-text index fragment. 이러한 조각 중 일부는 비교적 최신의 데이터를 포함할 수도 있습니다.Some of these fragments might contain newer data than others. 예를 들어 사용자가 DocId가 3인 다음 행을 업데이트하고 테이블에서 자동으로 변경 내용이 추적되는 경우 새로운 조각이 만들어집니다.For example, if a user updates the following row whose DocId is 3 and the table is auto change-tracked, a new fragment is created.

DocumentIDDocumentID TitleTitle
33 Rear ReflectorRear Reflector

다음 예제에서 조각 2에 포함된 DocId 3 관련 데이터는 조각 1에 포함된 데이터에 비해 새로운 데이터입니다.In the following example, which shows Fragment 2, the fragment contains newer data about DocId 3 compared to Fragment 1. 따라서 사용자가 "Rear Reflector"를 쿼리하면 조각 2의 데이터가 DocId 3에 대해 사용됩니다.Therefore, when the user queries for "Rear Reflector" the data from Fragment 2 is used for DocId 3. 각 조각은 생성 타임스탬프로 구분되며 이 타임스탬프는 sys.fulltext_index_fragments 카탈로그 뷰를 사용하여 쿼리할 수 있습니다.Each fragment is marked with a creation timestamp that can be queried by using the sys.fulltext_index_fragments catalog view.

조각 2Fragment 2

키워드Keyword ColIdColId DocIdDocId OccOcc
RearRear 11 33 11
ReflectorReflector 11 33 22

조각 2에서 볼 수 있듯이 전체 텍스트 쿼리에서는 각 조각을 내부적으로 쿼리하고 이전 항목을 무시해야 합니다.As can be seen from Fragment 2, full-text queries need to query each fragment internally and discard older entries. 따라서 전체 텍스트 인덱스에 전체 텍스트 인덱스 조각이 너무 많으면 쿼리 성능이 크게 저하될 수 있습니다.Therefore, too many full-text index fragments in the full-text index can lead to substantial degradation in query performance. 조각 수를 줄이려면 ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL 문의 REORGANIZE 옵션을 사용하여 전체 텍스트 카탈로그를 다시 구성합니다.To reduce the number of fragments, reorganize the fulltext catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL statement. 이 문은 마스터 병합을 수행하고 이 병합에서는 여러 조각을 하나의 큰 조각으로 병합하고 전체 텍스트 인덱스에서 사용되지 않는 항목을 모두 제거합니다.This statement performs a master merge, which merges the fragments into a single larger fragment and removes all obsolete entries from the full-text index.

다시 구성 작업 후 예제 인덱스에는 다음과 같은 행이 포함됩니다.After being reorganized, the example index would contain the following rows:

키워드Keyword ColIdColId DocIdDocId OccOcc
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
유지 관리Maintenance 11 11 55
FrontFront 11 22 11
RearRear 11 33 11
ReflectorReflector 11 22 22
ReflectorReflector 11 22 55
ReflectorReflector 11 33 22
BracketBracket 11 22 33
어셈블리Assembly 11 22 66
33 11 22 77

전체 텍스트 인덱스와 일반 SQL Server 인덱스 간의 차이점:Differences between full-text indexes and regular SQL Server indexes:.

전체 텍스트 인덱스Full-text indexes 일반 SQL Server 인덱스Regular SQL Server indexes
테이블당 한 개의 전체 텍스트 인덱스만 허용합니다.Only one full-text index allowed per table. 테이블당 여러 개의 일반 인덱스를 허용합니다.Several regular indexes allowed per table.
전체 텍스트 인덱스에 데이터를 추가하는 채우기는 일정 예약 또는 특정 요청을 통해 수행할 수 있으며 새 데이터를 추가하면 자동으로 수행됩니다.The addition of data to full-text indexes, called a population, can be requested through either a schedule or a specific request, or can occur automatically with the addition of new data. 인덱스의 기초가 되는 데이터가 삽입, 업데이트 또는 삭제되면 인덱스도 자동으로 업데이트됩니다.Updated automatically when the data upon which they are based is inserted, updated, or deleted.
같은 데이터베이스 내에서 하나 이상의 전체 텍스트 카탈로그로 그룹화됩니다.Grouped within the same database into one or more full-text catalogs. 그룹화되지 않습니다.Not grouped.

전체 텍스트 검색의 언어 구성 요소 및 언어 지원 Full-Text search linguistic components and language support

전체 텍스트 검색에서 영어, 스페인어, 중국어, 일본어, 아랍어, 벵골어 및 힌디어를 포함하여 거의 50개의 언어를 지원합니다.Full-text search supports almost 50 diverse languages, such as English, Spanish, Chinese, Japanese, Arabic, Bengali, and Hindi. 지원되는 전체 텍스트 언어의 전체 목록은 sys.fulltext_languages(Transact-SQL)를 참조하세요.For a complete list of the supported full-text languages, see sys.fulltext_languages (Transact-SQL). 전체 텍스트 인덱스에 있는 각 열은 전체 텍스트 검색에서 지원하는 언어에 해당하는 Windows LCID(로캘 ID)와 연결됩니다.Each of the columns contained in the full-text index is associated with a Microsoft Windows locale identifier (LCID) that equates to a language that is supported by full-text search. 예를 들어 LCID 1033은 영어(미국)에 해당하고 LCID 2057은 영어(영국)에 해당합니다.For example, LCID 1033 equates to U.S English, and LCID 2057 equates to British English. 지원되는 각 전체 텍스트 언어에 대해 SQL ServerSQL Server 는 해당 언어로 저장되는 전체 텍스트 데이터의 인덱싱 및 쿼리를 지원하는 언어 구성 요소를 제공합니다.For each supported full-text language, SQL ServerSQL Server provides linguistic components that support indexing and querying full-text data that is stored in that language.

다음과 같은 언어별 구성 요소가 있습니다.Language-specific components include the following:

  • 단어 분리기 및 형태소 분석기.Word breakers and stemmers. 단어 분리기는 지정된 언어의 어휘 규칙을 기준으로 단어 경계(단어 분리)를 찾습니다.A word breaker finds word boundaries based on the lexical rules of a given language (word breaking). 각 단어 분리기는 동일한 언어의 동사를 변화시키는 형태소 분석기와 연결됩니다.Each word breaker is associated with a stemmer that conjugates verbs for the same language. 자세한 내용은 검색을 위해 단어 분리기와 형태소 분석기 구성 및 관리를 참조하세요.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

  • 중지 목록.Stoplists. 중지 단어(의미 없는 단어라고도 함)의 기본 집합이 포함된 시스템 중지 목록이 제공됩니다.A system stoplist is provided that contains a basic set stopwords (also known as noise words). 중지 단어 는 검색에 도움이 되지 않고 전체 텍스트 쿼리에서 무시되는 단어입니다.A stopword is a word that does not help the search and is ignored by full-text queries. 예를 들어 영어 로캘의 경우 "a", "and", "is" 및 "the"와 같은 단어는 중지 단어로 간주됩니다.For example, for the English locale words such as "a", "and", "is", and "the" are considered stopwords. 일반적으로 하나 이상의 동의어 사전 파일과 중지 목록을 구성해야 합니다.Typically, you will need to configure one or more thesaurus files and stoplists. 자세한 내용은 전체 텍스트 검색에 사용할 중지 단어와 중지 목록 구성 및 관리를 참조하세요.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • 동의어 사전 파일.Thesaurus files. SQL ServerSQL Server 는 또한 각 전체 텍스트 언어에 대한 동의어 사전 파일뿐 아니라 전역 동의어 사전 파일도 설치합니다. also installs a thesaurus file for each full-text language, as well as a global thesaurus file. 설치된 동의어 사전 파일은 기본적으로 비어 있지만 이러한 동의어 사전 파일을 편집하여 특정 언어 또는 비즈니스 시나리오에 대한 동의어를 정의할 수 있습니다.The installed thesaurus files are essentially empty, but you can edit them to define synonyms for a specific language or business scenario. 전체 텍스트 데이터에 맞게 동의어 사전을 개발하면 해당 데이터에 대한 전체 텍스트 쿼리의 범위를 효과적으로 넓힐 수 있습니다.By developing a thesaurus tailored to your full-text data, you can effectively broaden the scope of full-text queries on that data. 자세한 내용은 전체 텍스트 검색에 사용할 동의어 사전 파일 구성 및 관리를 참조하세요.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • 필터(iFilters).Filters (iFilters). varbinary(max), image또는 xml 데이터 형식 열의 문서를 인덱싱하려면 추가 처리를 수행하는 필터가 필요합니다.Indexing a document in a varbinary(max), image, or xml data type column requires a filter to perform extra processing. 필터는 문서 유형(.doc, .pdf, .xls, .xml 등)에 따라 달라야 합니다.The filter must be specific to the document type (.doc, .pdf, .xls, .xml, and so forth). 자세한 내용은 고급 분석 확장 구성 및 관리를 참조하세요.For more information, see Configure and Manage Filters for Search.

    단어 분리기(및 형태소 분석기)와 필터는 필터 데몬 호스트 프로세스(fdhost.exe)에서 실행됩니다.Word breakers (and stemmers) and filters run in the filter daemon host process (fdhost.exe).

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse