Búsqueda de texto completoFull-Text Search

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

La búsqueda de texto completo en SQL ServerSQL Server y Base de datos SQL de AzureAzure SQL Database permite a los usuarios y aplicaciones ejecutar consultas de texto completo en datos basados en caracteres en las tablas de SQL ServerSQL Server .Full-Text Search in SQL ServerSQL Server and Base de datos SQL de AzureAzure SQL Database lets users and applications run full-text queries against character-based data in SQL ServerSQL Server tables.

Tareas básicasBasic tasks

En este tema se proporciona información general sobre la búsqueda de texto completo y se describe su arquitectura y sus componentes.This topic provides an overview of Full-Text Search and describes its components and its architecture. Si prefiere comenzar inmediatamente, estas son las tareas básicas.If you prefer to get started right away, here are the basic tasks.

Nota

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. Si no ha seleccionado la búsqueda de texto completo al instalar SQL Server, ejecute de nuevo el programa de instalación de SQL Server para agregarla.If you didn't select Full-Text Search when you installed SQL Server, run SQL Server Setup again to add it.

Información generalOverview

Los índices de texto completo incluyen una o varias columnas basadas en caracteres en una tabla.A full-text index includes one or more character-based columns in a table. Estas columnas pueden tener cualquier de los siguientes tipos de datos: char, varchar, nchar, nvarchar, text, ntext, image, xml o varbinary(max) y FILESTREAM.These columns can have any of the following data types: char, varchar, nchar, nvarchar, text, ntext, image, xml, or varbinary(max) and FILESTREAM. Cada índice de texto completo indiza una o varias columnas de la tabla base y cada columna puede usar un idioma concreto.Each full-text index indexes one or more columns from the table, and each column can use a specific language.

Las consultas de texto completo realizan las búsquedas lingüísticas en los datos de texto de los índices de texto completo sobre palabras y frases basándose en las reglas de un idioma determinado, como inglés o japonés.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. Las consultas de texto completo pueden contener palabras y frases sencillas, o formas diversas de una palabra o frase.Full-text queries can include simple words and phrases or multiple forms of a word or phrase. Una consulta de texto completo devuelve todos los documentos que contienen por lo menos una coincidencia (también se conoce como acierto).A full-text query returns any documents that contain at least one match (also known as a hit). Se produce una coincidencia cuando un documento de destino contiene todas las condiciones especificadas en la consulta de texto completo y cumple cualquier otra condición de búsqueda, como la distancia entre los términos que coinciden.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.

Consultas de búsqueda de texto completoFull-Text Search queries

Una vez agregadas las columnas a un índice de texto completo, los usuarios y aplicaciones pueden ejecutar las consultas de texto completo en el texto de las columnas.After columns have been added to a full-text index, users and applications can run full-text queries on the text in the columns. Estas consultas pueden buscar cualquiera de lo siguiente:These queries can search for any of the following:

  • Una o varias palabras o frases específicas (término simple)One or more specific words or phrases (simple term)

  • Una palabra o frase cuyas palabras empiezan por un texto determinado (término de prefijo)A word or a phrase where the words begin with specified text (prefix term)

  • Formas con inflexión de una palabra determinada (término de generación)Inflectional forms of a specific word (generation term)

  • Una palabra o frase que esté cerca de otra palabra o frase (término de proximidad)A word or phrase close to another word or phrase (proximity term)

  • Formas sinónimas de una palabra determinada (diccionario de sinónimos)Synonymous forms of a specific word (thesaurus)

  • Palabras o frases que usan valores ponderados (término ponderado)Words or phrases using weighted values (weighted term)

Las consultas de texto completo no distinguen entre mayúsculas y minúsculas.Full-text queries are not case-sensitive. Por ejemplo, la búsqueda de "Aluminio" o "aluminio" devuelve los mismos resultados.For example, searching for "Aluminum" or "aluminum" returns the same results.

Las consultas de texto completo usan un pequeño conjunto de predicados Transact-SQLTransact-SQL (CONTAINS y FREETEXT) y funciones (CONTAINSTABLE y FREETEXTTABLE).Full-text queries use a small set of Transact-SQLTransact-SQL predicates (CONTAINS and FREETEXT) and functions (CONTAINSTABLE and FREETEXTTABLE). Sin embargo, los objetivos de la búsqueda en un escenario empresarial determinado influyen en la estructura de las consultas de texto completo.However, the search goals of a given business scenario influence the structure of the full-text queries. Por ejemplo:For example:

  • e-business: búsqueda de un producto en un sitio web: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 ;  
    
  • Escenario de contratación de empleados: búsqueda de candidatos para un puesto de trabajo que tengan experiencia en 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;  
    

Para obtener más información, vea Consultar con búsqueda de texto completo.For more information, see Query with Full-Text Search.

Comparar las consultas de búsqueda de texto completo en el predicado LIKECompare Full-Text Search queries to the LIKE predicate

A diferencia de la búsqueda de texto completo, el predicado LIKE de Transact-SQLTransact-SQL funciona solamente en patrones de caracteres.In contrast to full-text search, the LIKE Transact-SQLTransact-SQL predicate works on character patterns only. Además, no es posible utilizar el predicado de LIKE para consultar datos binarios con formato.Also, you cannot use the LIKE predicate to query formatted binary data. Por otro lado, una consulta LIKE contra una cantidad grande de datos de texto no estructurados es mucho más lenta que una consulta de texto completo equivalente contra los mismos datos.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. Una consulta LIKE realizada en millones de filas de datos de texto puede tardar minutos en devolver resultados, mientras que una consulta de texto completo en los mismos datos puede tardar únicamente segundos, en función del número de filas que se devuelvan.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.

Arquitectura de la búsqueda de texto completoFull-Text Search architecture

La arquitectura de búsqueda de texto completo consta de los procesos siguientes:Full-text search architecture consists of the following processes:

  • Proceso de SQL ServerSQL Server (sqlserver.exe).The SQL ServerSQL Server process (sqlservr.exe).

  • Proceso de host de demonio de filtro (fdhost.exe).The filter daemon host process (fdhost.exe).

    Por razones de seguridad, los filtros se cargan mediante procesos independientes denominados hosts de demonio de filtro.For security reasons, filters are loaded by separate processes called the filter daemon hosts. El servicio iniciador de FDHOST (MSSQLFDLauncher) crea los procesos de fdhost.exe, que se ejecutan con las credenciales de seguridad de la cuenta de servicio del iniciador de FDHOST.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. Por consiguiente, el servicio iniciador de FDHOST debe estar en ejecución para que la indización de texto completo y la consulta de texto completo funcionen.Therefore, the FDHOST launcher service must be running for full-text indexing and full-text querying to work. Para obtener más información sobre cómo configurar la cuenta de servicio para este servicio, vea Establecer la cuenta del servicio para el selector del demonio de filtro completo.For information about setting the service account for this service, see Set the Service Account for the Full-text Filter Daemon Launcher.

Estos dos procesos contienen los componentes de la arquitectura de búsqueda de texto completo.These two processes contain the components of the full-text search architecture. Estos componentes y sus relaciones se resumen en la ilustración siguiente.These components and their relationships are summarized in the following illustration. Los componentes se describen después de la ilustración.The components are described after the illustration.

arquitectura de búsqueda de texto completofull-text search architecture

Proceso de SQL ServerSQL Server process

El proceso de SQL ServerSQL Server usa los componentes siguientes para la búsqueda de texto completo:The SQL ServerSQL Server process uses the following components for full-text search:

  • Tablas de usuario.User tables. Esta tablas contienen los datos cuyo texto completo se indizará.These tables contain the data to be full-text indexed.

  • Recopilador de texto completo.Full-text gatherer. El recopilador de texto completo trabaja con los subprocesos de rastreo de texto completo (rellenado).The full-text gatherer works with the full-text crawl threads. Es responsable de programar y dirigir el rellenado de índices de texto completo, y también de supervisar los catálogos de texto completo.It is responsible for scheduling and driving the population of full-text indexes, and also for monitoring full-text catalogs.

  • Archivos de sinónimos.Thesaurus files. Estos archivos contienen sinónimos de los términos de búsqueda.These files contain synonyms of search terms. Para obtener más información, vea Configurar y administrar archivos de sinónimos para búsquedas de texto completo.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Objetos de listas de palabras irrelevantes.Stoplist objects. Los objetos de listas de palabras irrelevantes contienen una lista de palabras comunes que no son útiles para la búsqueda.Stoplist objects contain a list of common words that are not useful for the search. Para obtener más información, vea Configurar y administrar palabras irrelevantes y listas de palabras irrelevantes para la búsqueda de texto completo.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • SQL ServerSQL Server procesador de consultas.SQL ServerSQL Server query processor. El procesador de consultas compila y ejecuta consultas SQL.The query processor compiles and executes SQL queries. Si una consulta SQL incluye una consulta de búsqueda de texto completo, la consulta se envía al motor de texto completo, durante la compilación y durante la ejecución.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. El resultado de la consulta se hace coincidir con el índice de texto completo.The query result is matched against the full-text index.

  • Motor de búsqueda de texto completo.Full-Text Engine. El motor de texto completo de SQL ServerSQL Server se integra ahora totalmente con el procesador de consultas.The Full-Text Engine in SQL ServerSQL Server is fully integrated with the query processor. El motor de texto completo compila y ejecuta consultas de texto completo.The Full-Text Engine compiles and executes full-text queries. Como parte de la ejecución de consultas, el motor de texto completo puede recibir entradas del diccionario de sinónimos y de la lista de palabras irrelevantes.As part of query execution, the Full-Text Engine might receive input from the thesaurus and stoplist.

    Nota

    En SQL Server 2008SQL Server 2008 y versiones posteriores, el motor de texto completo reside en el proceso de SQL ServerSQL Server , en lugar de en un servicio independiente.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. Al integrar el motor de texto completo en el motor de base de datos, se mejoró la capacidad de administración de texto completo, la optimización de consultas mixtas y el rendimiento total.Integrating the Full-Text Engine into the Database Engine improved full-text manageability, optimization of mixed query, and overall performance.

  • Escritor de índices (indizador).Index writer (indexer). El escritor de índices genera la estructura que se utiliza para almacenar los tokens indizados.The index writer builds the structure that is used to store the indexed tokens.

  • Administrador del demonio de filtro.Filter daemon manager. El administrador del demonio de filtro es responsable de supervisar el estado del host de demonio de filtro del motor de texto completo.The filter daemon manager is responsible for monitoring the status of the Full-Text Engine filter daemon host.

Filter Daemon Host processFilter Daemon Host process

El host de demonio de filtro es un proceso iniciado por el motor de texto completo.The filter daemon host is a process that is started by the Full-Text Engine. Ejecuta los componentes de búsqueda de texto completo siguientes, que son responsables de obtener acceso a los datos de las tablas, filtrarlos y separar las palabras de esos datos, así como de separar las palabras y lematizar la entrada de la consulta.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.

Los componentes del proceso de host de demonio de filtro son los siguientes:The components of the filter daemon host are as follows:

  • Controlador de protocolo.Protocol handler. Este componente extrae los datos de la memoria para su posterior procesamiento y tiene acceso a los datos de una tabla de usuario de una base de datos especificada.This component pulls the data from memory for further processing and accesses data from a user table in a specified database. Una de sus responsabilidades es recopilar los datos de las columnas con indización de texto completo y pasarlos al host de demonio de filtro, que aplicará el filtrado y la separación de palabras cuando sea necesario.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.

  • Filtros.Filters. Algunos tipos de datos requieren un filtrado para que los datos de un documento puedan indexarse con texto completo, incluso los datos de las columnas varbinary, varbinary(max), imageo xml columns.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. El filtro utilizado para un documento determinado depende de su tipo de documento.The filter used for a given document depends on its document type. Por ejemplo, se utilizan filtros diferentes para los documentos de Microsoft Word (.doc), de Microsoft Excel (.xls) y XML (.xml).For example, different filters are used for Microsoft Word (.doc) documents, Microsoft Excel (.xls) documents, and XML (.xml) documents. A continuación, el filtro extrae fragmentos de texto del documento, mientras quita el formato incrustado y conserva el texto y, potencialmente, la información sobre la posición del mismo.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. El resultado es un flujo de información de texto.The result is a stream of textual information. Para obtener más información, vea Configurar y administrar filtros para búsquedas.For more information, see Configure and Manage Filters for Search.

  • Separadores de palabras y lematizadores.Word breakers and stemmers. Un separador de palabras es un componente específico del idioma que busca los límites de palabras según las reglas léxicas de un idioma determinado (separación de palabras).A word breaker is a language-specific component that finds word boundaries based on the lexical rules of a given language (word breaking). Cada separador de palabras está asociado a un componente de lematizador específico del idioma que conjuga los verbos y realiza las expansiones flexionales.Each word breaker is associated with a language-specific stemmer component that conjugates verbs and performs inflectional expansions. Al realizar la indización, el host de demonio de filtro utiliza un separador de palabras y un lematizador para realizar el análisis lingüístico de los datos de texto de una columna de la tabla determinada.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. El lenguaje asociado a una columna de la tabla en el índice de texto completo determina qué separador de palabras y lematizador se utilizan para indizar la columna.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. Para obtener más información, vea Configurar y administrar separadores de palabras y lematizadores para la búsqueda.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

Proceso de búsqueda de texto completoFull-Text Search processing

La búsqueda de texto completo se realiza gracias al motor de texto completo.Full-text search is powered by the Full-Text Engine. El motor de texto completo desempeña dos roles: la indización y las consultas.The Full-Text Engine has two roles: indexing support and querying support.

Proceso de indización de texto completoFull-Text indexing process

Cuando se inicia un rellenado de texto completo (también conocido como rastreo), el motor de texto completo inserta lotes grandes de datos en la memoria y lo notifica al host de demonio de filtro.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. El host filtra y establece separaciones de palabras en los datos, y convierte los datos convertidos en las listas de palabras invertidas.The host filters and word breaks the data and converts the converted data into inverted word lists. A continuación, la búsqueda de texto completo extrae los datos convertidos de las listas de palabras, procesa los datos para quitar las palabras irrelevantes y conserva las listas de palabras para un lote en uno o varios índices invertidos.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.

Al indexar datos almacenados en una columna varbinary(max) o image , el filtro, que implementa la interfaz IFilter , extrae texto basándose en el formato de archivo especificado para los datos (por ejemplo, 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). En algunos casos, los componentes de filtro requieren que los datos de tipo varbinary(max) o image se escriban en la carpeta de filtro de datos, en lugar de insertarse en la memoria.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.

Como parte del procesamiento, los datos de texto recopilados se pasan a través de un separador de palabras para dividir el texto en tokens o palabras clave individuales.As part of processing, the gathered text data is passed through a word breaker to separate the text into individual tokens, or keywords. El idioma que se usa para la tokenización se especifica en el nivel de columna o bien se identifica en los datos varbinary(max), imageo xml por medio del componente de filtro.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.

Puede llevarse a cabo un procesamiento adicional para quitar las palabras irrelevantes y normalizar los tokens antes de que se almacenen en el índice de texto completo o en un fragmento de índice.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.

Cuando se completa un rellenado, se desencadena un proceso de combinación final que combina los fragmentos de índice en un solo índice de texto completo maestro.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Esto permite mejorar el rendimiento de las consultas, ya que únicamente es necesario realizar consultas en el índice maestro, en lugar de hacerlo en varios fragmentos de índice, y se pueden utilizar mejores estadísticas de puntuación para obtener la clasificación por relevancia.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.

Proceso de consultas de texto completoFull-Text querying process

El procesador de consultas pasa las partes de texto completo de una consulta al Motor de búsqueda de texto completo para procesarlas.The query processor passes the full-text portions of a query to the Full-Text Engine for processing. El motor de búsqueda de texto completo realiza la separación de palabras y, opcionalmente, expansiones del diccionario de sinónimos, lematización y procesamiento de las palabras irrelevantes.The Full-Text Engine performs word breaking and, optionally, thesaurus expansions, stemming, and stopword (noise-word) processing. A continuación, las partes de texto completo de la consulta se representan en forma de operadores de SQL, principalmente como funciones con valores de tabla de transmisión por secuencias (STVF).Then the full-text portions of the query are represented in the form of SQL operators, primarily as streaming table-valued functions (STVFs). Durante la ejecución de la consulta, las STVF tienen acceso al índice invertido para recuperar los resultados correctos.During query execution, these STVFs access the inverted index to retrieve the correct results. Los resultados se devuelven en este punto al cliente o se siguen procesando antes de devolverse al cliente.The results are either returned to the client at this point, or they are further processed before being returned to the client.

Arquitectura de los índices de texto completoFull-text index architecture

El motor de búsqueda de texto completo utiliza la información de los índices de texto completo para compilar las consultas de texto completo que pueden buscar rápidamente en una tabla palabras o combinaciones de palabras determinadas.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. Un índice de texto completo almacena información sobre las palabras relevantes y su ubicación en una o varias columnas de la tabla de una base de datos.A full-text index stores information about significant words and their location within one or more columns of a database table. Un índice de texto completo es un tipo especial de índice funcional basado en token que el motor de texto completo genera y mantiene para 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. El proceso de creación de un índice de texto completo difiere de la creación de otros tipos de índice.The process of building a full-text index differs from building other types of indexes. En lugar de crear una estructura de árbol B basada en un valor almacenado en una fila determinada, el motor de texto completo genera una estructura de índice invertida, apilada y comprimida que se basa en tokens individuales del texto que se indiza.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. El tamaño de un índice de texto completo solo está limitado por los recursos de memoria disponibles del equipo en el que se ejecuta la instancia de 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.

A partir de SQL Server 2008SQL Server 2008, los índices de texto completo se integran con el motor de base de datos, en lugar de residir en el sistema de archivos como en versiones anteriores de 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. Para una base de datos nueva, el catálogo de texto completo es ahora un objeto virtual que no pertenece a ningún grupo de archivos; es simplemente un concepto lógico que hace referencia al grupo de índices de texto completo.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. Debe tener en cuenta que, durante la actualización de una base de datos de SQL Server 2005 (9.x)SQL Server 2005 (9.x) , para cualquier catálogo de texto completo que contenga archivos de datos, se crea un nuevo grupo de archivos. Para obtener más información, vea Actualizar la búsqueda de texto completo.Note, however, that during upgrade of a SQL Server 2005 (9.x)SQL Server 2005 (9.x) database, any full-text catalog that contains data files, a new filegroup is created; for more information, see Upgrade Full-Text Search.

Solo se permite un índice de texto completo por cada tabla.Only one full-text index is allowed per table. Para crear un índice de texto completo en una tabla, ésta debe tener una única columna que no contenga valores NULL.For a full-text index to be created on a table, the table must have a single, unique nonnull column. Puede crear un índice de texto completo en columnas de tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinaryy varbinary(max) , que se pueden indexar para efectuar una búsqueda de texto completo.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. Si se crea un índice de texto completo en una columna cuyo tipo de datos es varbinary, varbinary(max), imageo xml , deberá especificar una columna de tipo.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. Una columna de tipo es una columna de tabla en la que se almacena la extensión de archivo (.doc, .pdf, .xls, etc.) del documento en cada fila.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.

Estructura de los índices de texto completoFull-text index structure

Para comprender el funcionamiento del motor de texto completo, es necesario entender la estructura de un índice de texto completo.A good understanding of the structure of a full-text index will help you understand how the Full-Text Engine works. En este tema se utiliza el extracto siguiente de la tabla Document de Adventure WorksAdventure Works como tabla de ejemplo.This topic uses the following excerpt of the Document table in Adventure WorksAdventure Works as an example table. Este extracto muestra solo dos columnas, DocumentID y Title , y tres filas de la tabla.This excerpt shows only two columns, the DocumentID column and the Title column, and three rows from the table.

En este ejemplo se presupone que se ha creado un índice de texto completo en la columna 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

Por ejemplo, en la tabla siguiente, en la que se muestra el fragmento 1, aparece el contenido del índice de texto completo creado en la columna Title de la tabla Document .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. Los índices de texto completo contienen más información que la que se presenta en esta tabla.Full-text indexes contain more information than is presented in this table. La tabla es una representación lógica de un índice de texto completo y se proporciona solo como demostración.The table is a logical representation of a full-text index and is provided for demonstration purposes only. Las filas están almacenadas en un formato comprimido para optimizar el uso del disco.The rows are stored in a compressed format to optimize disk usage.

Observe que los datos se han invertido en comparación con los documentos originales.Notice that the data has been inverted from the original documents. La inversión se produce porque las palabras clave se asignan a los identificadores del documento.Inversion occurs because the keywords are mapped to the document IDs. Por esta razón, se suele hacer referencia a un índice de texto completo como índice invertido.For this reason, a full-text index is often referred to as an inverted index.

Observe también que la palabra clave "y" se ha quitado del índice de texto completo.Also notice that the keyword "and" has been removed from the full-text index. Se hace esto porque "y" es una palabra irrelevante y quitar las palabras irrelevantes de un índice de texto completo puede conllevar un ahorro sustancial en el espacio en disco y mejorar por tanto el rendimiento de las consultas.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. Para obtener más información sobre las palabras irrelevantes, vea Configurar y administrar palabras irrelevantes y listas de palabras irrelevantes para la búsqueda de texto completo.For more information about stopwords, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

Fragmento 1Fragment 1

Palabra claveKeyword ColIdColId DocIdDocId RepeticiónOccurrence
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
MantenimientoMaintenance 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
EnsambladoAssembly 11 22 66
33 11 22 77
InstallationInstallation 11 33 44

La columna Keyword contiene una representación de un solo token extraído durante la indización.The Keyword column contains a representation of a single token extracted at indexing time. Los separadores de palabras determinan en qué consiste un token.Word breakers determine what makes up a token.

La columna ColId contiene un valor correspondiente a una determinada tabla y columna indexada de texto completo.The ColId column contains a value that corresponds to a particular column that is full-text indexed.

La columna DocId contiene valores de un entero de ocho bytes que se asigna a un determinado valor de clave de texto completo en una tabla indexada de texto completo.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. Esta asignación es necesaria cuando la clave de texto completo no es de un tipo de datos enteros.This mapping is necessary when the full-text key is not an integer data type. En casos como este, las asignaciones entre los valores de clave de texto completo y los valores de DocId se mantienen en una tabla independiente denominada tabla de asignación de DocId.In such cases, mappings between full-text key values and DocId values are maintained in a separate table called the DocId Mapping table. Para consultar estas asignaciones, use el procedimiento almacenado del sistema sp_fulltext_keymappings .To query for these mappings use the sp_fulltext_keymappings system stored procedure. Para satisfacer una condición de búsqueda, los valores de DocId de la tabla anterior tienen que combinarse con la tabla de asignaciones de DocId para recuperar las filas de la tabla base que se consulta.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. Si el valor de la clave de texto completo de la tabla base es de un tipo entero, el valor actúa directamente como DocId y no se necesita ninguna asignación.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. Por consiguiente, utilizar valores de clave de texto completo enteros puede ayudar a optimizar las consultas de texto completo.Therefore, using integer full-text key values can help optimize full-text queries.

La columna Occurrence contiene un valor entero.The Occurrence column contains an integer value. Para cada valor de DocId hay una lista de valores de repetición correspondientes a las posiciones relativas de una palabra clave determinada en 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. Los valores de repetición son útiles para determinar las coincidencias de frases o de proximidad, por ejemplo, frases que tienen valores de repetición adyacentes.Occurrence values are useful in determining phrase or proximity matches, for example, phrases have numerically adjacent occurrence values. También son útiles para calcular las puntuaciones de importancia; por ejemplo, el número de repeticiones de una palabra clave en una columna DocId se puede utilizar para determinar la puntuación.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.

Fragmentos de índices de texto completoFull-text index fragments

El índice de texto completo lógico normalmente se divide entre varias tablas internas.The logical full-text index is usually split across multiple internal tables. Cada tabla interna se conoce como un fragmento del índice de texto completo.Each internal table is called a full-text index fragment. Algunos de estos fragmentos podrían contener datos más recientes que otros.Some of these fragments might contain newer data than others. Por ejemplo, si un usuario actualiza la fila siguiente cuyo DocId es 3 y la tabla se somete automáticamente a seguimiento de los cambios, se crea un fragmento nuevo.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

En el ejemplo siguiente, que muestra el fragmento 2, el fragmento contiene los datos más recientes sobre el DocId 3 comparados con el fragmento 1.In the following example, which shows Fragment 2, the fragment contains newer data about DocId 3 compared to Fragment 1. Por consiguiente, cuando el usuario consulta "Rear Reflector", se usan los datos del fragmento 2 correspondientes a DocId 3.Therefore, when the user queries for "Rear Reflector" the data from Fragment 2 is used for DocId 3. Cada fragmento se marca con una marca de tiempo de creación que se puede consultar usando la vista de catálogo 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.

Fragmento 2Fragment 2

Palabra claveKeyword ColIdColId DocIdDocId OccOcc
RearRear 11 33 11
ReflectorReflector 11 33 22

Como se puede ver en el fragmento 2, las consultas de texto completo tienen que consultar cada fragmento internamente y descartar las entradas más antiguas.As can be seen from Fragment 2, full-text queries need to query each fragment internally and discard older entries. Por consiguiente, demasiados fragmentos del índice de texto completo pueden conducir a una degradación sustancial del rendimiento de las consultas.Therefore, too many full-text index fragments in the full-text index can lead to substantial degradation in query performance. Para reducir el número de fragmentos, reorganice el catálogo de texto completo mediante la opción REORGANIZE de la instrucción ALTER FULLTEXT CATALOGTransact-SQLTransact-SQL .To reduce the number of fragments, reorganize the fulltext catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOGTransact-SQLTransact-SQL statement. Esta instrucción lleva a cabo una combinación maestra, que combina todos los fragmentos en un único fragmento mayor y quita todas las entradas obsoletas del índice de texto completo.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.

Después de la reorganización, el índice del ejemplo contendría las filas siguientes:After being reorganized, the example index would contain the following rows:

Palabra claveKeyword ColIdColId DocIdDocId OccOcc
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
MantenimientoMaintenance 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
EnsambladoAssembly 11 22 66
33 11 22 77

Diferencias entre los índices de texto completo y los índices normales de SQL Server:Differences between full-text indexes and regular SQL Server indexes:.

Índices de texto completoFull-text indexes Índices normales de SQL ServerRegular SQL Server indexes
Solo se permite un índice de texto completo por cada tabla.Only one full-text index allowed per table. Se permiten varios índices normales por cada tabla.Several regular indexes allowed per table.
La adición de datos a los índices de texto completo, operación que recibe el nombre de rellenado, puede solicitarse mediante una programación o una solicitud específica, o bien realizarse automáticamente al agregar nuevos datos.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. Se actualizan automáticamente cuando se insertan, actualizan o eliminan los datos en los que están basados.Updated automatically when the data upon which they are based is inserted, updated, or deleted.
Se agrupan en la misma base de datos en uno o más catálogos de texto completo.Grouped within the same database into one or more full-text catalogs. No se agrupan.Not grouped.

Compatibilidad con idiomas y componentes lingüísticos de la búsqueda de texto completoFull-Text search linguistic components and language support

La búsqueda de texto completo admite casi 50 idiomas distintos, como inglés, español, chino, japonés, árabe, bengalí e hindi.Full-text search supports almost 50 diverse languages, such as English, Spanish, Chinese, Japanese, Arabic, Bengali, and Hindi. Para obtener una lista completa de los idiomas de texto completo compatibles, vea sys.fulltext_languages (Transact-SQL).For a complete list of the supported full-text languages, see sys.fulltext_languages (Transact-SQL). Cada una de las columnas incluidas en el índice de texto completo está asociada a un identificador de configuración regional (LCID) de Microsoft Windows que se corresponde con un idioma compatible con la búsqueda de texto completo.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. Por ejemplo, el LCID 1033 corresponde al inglés de Estados Unido y el LCID 2057 corresponde al inglés de Reino Unido.For example, LCID 1033 equates to U.S English, and LCID 2057 equates to British English. Para cada idioma de texto completo compatible, SQL ServerSQL Server proporciona componentes lingüísticos que permiten indizar y consultar los datos de texto completo almacenados en ese idioma.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.

Entre los componentes específicos del idioma se incluyen los siguientes:Language-specific components include the following:

  • Separadores de palabras y lematizadores.Word breakers and stemmers. Un separador de palabras busca los límites de palabra en función de las reglas léxicas de un idioma concreto (separación de palabras).A word breaker finds word boundaries based on the lexical rules of a given language (word breaking). Cada separador de palabras está asociado a un lematizador que conjuga los verbos para dicho idioma.Each word breaker is associated with a stemmer that conjugates verbs for the same language. Para obtener más información, vea Configurar y administrar separadores de palabras y lematizadores para la búsqueda.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

  • Listas de palabras irrelevantes.Stoplists. Se proporciona una lista de palabras irrelevantes del sistema que contiene un conjunto básico de palabras irrelevantes (denominadas también palabras vacías).A system stoplist is provided that contains a basic set stopwords (also known as noise words). Una palabra irrelevante es una palabra que no aporta nada a la búsqueda y que se omite en las consultas de texto completo.A stopword is a word that does not help the search and is ignored by full-text queries. Por ejemplo, en la configuración regional en inglés, las palabras como "a", "and", "is" y "the" se consideran palabras irrelevantes.For example, for the English locale words such as "a", "and", "is", and "the" are considered stopwords. Normalmente, tendrá que configurar uno o varios archivos de diccionario de sinónimos y listas de palabras irrelevantes.Typically, you will need to configure one or more thesaurus files and stoplists. Para obtener más información, vea Configurar y administrar palabras irrelevantes y listas de palabras irrelevantes para la búsqueda de texto completo.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • Archivos de sinónimos.Thesaurus files. SQL ServerSQL Server instala también un archivo de diccionario de sinónimos para cada idioma de texto completo, además de un archivo de diccionario de sinónimos global.also installs a thesaurus file for each full-text language, as well as a global thesaurus file. Los archivos de diccionario de sinónimos instalados son básicamente archivos vacíos, pero puede modificarlos para definir los sinónimos de un determinado idioma o escenario empresarial.The installed thesaurus files are essentially empty, but you can edit them to define synonyms for a specific language or business scenario. Al desarrollar un diccionario de sinónimos personalizado para los datos de texto completo, puede ampliar de forma eficaz el ámbito de las consultas de texto completo en esos datos.By developing a thesaurus tailored to your full-text data, you can effectively broaden the scope of full-text queries on that data. Para obtener más información, vea Configurar y administrar archivos de sinónimos para búsquedas de texto completo.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Filtros (iFilters).Filters (iFilters). La indexación de un documento en una columna de tipo de datos varbinary(max), imageo xml requiere un filtro que realice el procesamiento adicional.Indexing a document in a varbinary(max), image, or xml data type column requires a filter to perform extra processing. El filtro debe ser específico del tipo de documento (.doc, .pdf, .xls, .xml, etc.).The filter must be specific to the document type (.doc, .pdf, .xls, .xml, and so forth). Para obtener más información, vea Configurar y administrar filtros para búsquedas.For more information, see Configure and Manage Filters for Search.

Los separadores de palabras (y lematizadores) y los filtros se ejecutan en el proceso de host de demonio de filtro (fdhost.exe).Word breakers (and stemmers) and filters run in the filter daemon host process (fdhost.exe).

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse