Recherche en texte intégralFull-Text Search

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

La recherche en texte intégral dans SQL ServerSQL Server et Azure SQL DatabaseAzure SQL Database permet aux utilisateurs et aux applications d’exécuter des requêtes de texte intégral sur des données caractères dans des tables SQL ServerSQL Server .Full-Text Search in SQL ServerSQL Server and Azure SQL DatabaseAzure SQL Database lets users and applications run full-text queries against character-based data in SQL ServerSQL Server tables.

Tâches de baseBasic tasks

Cette rubrique présente une vue d’ensemble de la recherche en texte intégral et décrit son architecture ainsi que ses composants.This topic provides an overview of Full-Text Search and describes its components and its architecture. Si vous préférez commencer tout de suite, voici les tâches de base qui vous intéresse.If you prefer to get started right away, here are the basic tasks.

Notes

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 vous n’avez pas sélectionné la recherche en texte intégral lorsque vous avez installé SQL Server, exécutez de nouveau le programme d’installation de SQL Server pour l’ajouter.If you didn't select Full-Text Search when you installed SQL Server, run SQL Server Setup again to add it.

Vue d’ensembleOverview

Un index de recherche en texte intégral comporte une ou plusieurs colonnes de caractères dans une table.A full-text index includes one or more character-based columns in a table. Les types de données de ces colonnes peuvent être char, varchar, nchar, nvarchar, text, ntext, image, xml ou varbinary(max) et FILESTREAM.These columns can have any of the following data types: char, varchar, nchar, nvarchar, text, ntext, image, xml, or varbinary(max) and FILESTREAM. Chaque index de recherche en texte intégral indexe une ou plusieurs colonnes de la table, et chaque colonne peut utiliser une langue spécifique.Each full-text index indexes one or more columns from the table, and each column can use a specific language.

Les requêtes de texte intégral effectuent des recherches linguistiques sur des données texte dans des index de recherche en texte intégral ; pour cela, elles traitent les mots et les expressions à partir des règles d’une langue spécifique, telle que l’anglais ou le japonais.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. Les requêtes de texte intégral peuvent inclure des mots et des expressions simples ou plusieurs formes d'un mot ou d'une expression.Full-text queries can include simple words and phrases or multiple forms of a word or phrase. Une requête de texte intégral retourne tous les documents qui contiennent au moins une correspondance (ce que l’on appelle aussi résultat).A full-text query returns any documents that contain at least one match (also known as a hit). Une correspondance se produit lorsqu'un document cible contient tous les termes spécifiés dans la requête de texte intégral et satisfait toutes les autres conditions de recherche, telles que la distance entre les correspondances.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.

Requêtes de recherche en texte intégralFull-Text Search queries

Une fois que des colonnes ont été ajoutées à un index de recherche en texte intégral, les utilisateurs et les applications peuvent exécuter des requêtes de texte intégral sur le texte contenu dans ces colonnes.After columns have been added to a full-text index, users and applications can run full-text queries on the text in the columns. Ces requêtes peuvent être utilisées pour rechercher les éléments suivants :These queries can search for any of the following:

  • Un ou plusieurs mots ou expressions spécifiques (terme simple)One or more specific words or phrases (simple term)

  • Un mot ou une expression commençant par un texte spécifié (préfixe)A word or a phrase where the words begin with specified text (prefix term)

  • Les formes flexionnelles d’un mot spécifique (forme canonique)Inflectional forms of a specific word (generation term)

  • Un mot ou une expression proches d’un autre mot ou d’une autre expression (terme de proximité)A word or phrase close to another word or phrase (proximity term)

  • Les formes synonymes d’un mot spécifique (dictionnaire des synonymes)Synonymous forms of a specific word (thesaurus)

  • Mots ou expressions utilisant des valeurs pondérées (termes pondérés)Words or phrases using weighted values (weighted term)

Les requêtes de texte intégral ne respectent pas la casse.Full-text queries are not case-sensitive. Par exemple, la recherche du terme « Aluminium » ou « aluminium » retourne les mêmes résultats.For example, searching for "Aluminum" or "aluminum" returns the same results.

Les requêtes de texte intégral utilisent un ensemble réduit de prédicats Transact-SQLTransact-SQL (CONTAINS et FREETEXT) et de fonctions (CONTAINSTABLE et FREETEXTTABLE).Full-text queries use a small set of Transact-SQLTransact-SQL predicates (CONTAINS and FREETEXT) and functions (CONTAINSTABLE and FREETEXTTABLE). Toutefois, les objectifs de la recherche pour un scénario d'entreprise donné influencent la structure des requêtes de texte intégral.However, the search goals of a given business scenario influence the structure of the full-text queries. Exemple :For example:

  • Entreprise e-business : rechercher un produit sur un site 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 ;  
    
  • Scénario de recrutement : rechercher des postulants à un emploi qui connaissent bien 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;  
    

Pour plus d’informations, consultez Exécuter une requête avec une recherche en texte intégral.For more information, see Query with Full-Text Search.

Comparaison des requêtes de recherche en texte intégral avec le prédicat LIKECompare Full-Text Search queries to the LIKE predicate

Contrairement à la recherche en texte intégral, le prédicat LIKE Transact-SQLTransact-SQL fonctionne uniquement sur les modèles de caractères.In contrast to full-text search, the LIKE Transact-SQLTransact-SQL predicate works on character patterns only. En outre, vous ne pouvez pas utiliser le prédicat LIKE pour interroger des données binaires mises en forme.Also, you cannot use the LIKE predicate to query formatted binary data. De plus, une requête LIKE portant sur un important volume de données de texte non structurées est beaucoup plus lente qu'une requête de texte intégral équivalente exécutée sur les mêmes données.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. Une requête LIKE portant sur des millions de lignes de données de texte peut prendre plusieurs minutes pour retourner un résultat alors qu'une requête de texte intégral retourne en quelques secondes à peine le même résultat, en fonction du nombre de lignes retournées.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.

Architecture de la recherche en texte intégralFull-Text Search architecture

L'architecture de la recherche en texte intégral est constituée des processus suivants :Full-text search architecture consists of the following processes:

  • Processus SQL ServerSQL Server (sqlservr.exe).The SQL ServerSQL Server process (sqlservr.exe).

  • Processus hôte de démon de filtre (fdhost.exe).The filter daemon host process (fdhost.exe).

    Pour des raisons de sécurité, les filtres sont chargés par des processus distincts appelés hôtes de démon de filtre.For security reasons, filters are loaded by separate processes called the filter daemon hosts. Les processus fdhost.exe sont créés par un service du lanceur FDHOST (MSSQLFDLauncher) et s'exécutent avec les informations d'identification de sécurité du compte du service du lanceur 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. Par conséquent, le service du lanceur FDHOST doit être en cours d'exécution pour que l'indexation de texte intégral et l'exécution de requêtes de texte intégral puissent fonctionner.Therefore, the FDHOST launcher service must be running for full-text indexing and full-text querying to work. Pour plus d’informations sur le compte de service pour ce service, consultez Définir le compte du service du Lanceur de démon de filtre de texte intégral.For information about setting the service account for this service, see Set the Service Account for the Full-text Filter Daemon Launcher.

Ces deux processus contiennent les composants de l'architecture de recherche en texte intégral.These two processes contain the components of the full-text search architecture. Ces composants et leurs relations sont résumés dans l'illustration ci-dessous.These components and their relationships are summarized in the following illustration. Les composants sont décrits après l'illustration.The components are described after the illustration.

architecture de recherche en texte intégralfull-text search architecture

Processus SQL ServerSQL Server process

Le processus SQL ServerSQL Server utilisent les composants suivants pour la recherche en texte intégral :The SQL ServerSQL Server process uses the following components for full-text search:

  • Tables utilisateur.User tables. Ces tables contiennent les données à indexer en texte intégral.These tables contain the data to be full-text indexed.

  • Outil d'extraction de texte intégral.Full-text gatherer. L'outil d'extraction de texte intégral fonctionne avec les threads d'analyse de texte intégral.The full-text gatherer works with the full-text crawl threads. Il est responsable de la planification et du pilotage du remplissage des index de texte intégral, ainsi que de la surveillance des catalogues de texte intégral.It is responsible for scheduling and driving the population of full-text indexes, and also for monitoring full-text catalogs.

  • Fichiers du dictionnaire des synonymes.Thesaurus files. Ces fichiers contiennent des synonymes de termes de recherche.These files contain synonyms of search terms. Pour plus d’informations, consultez Configurer et gérer les fichiers de dictionnaire des synonymes pour la recherche en texte intégral.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Objets de la liste de mots vides.Stoplist objects. Les objets de la liste de mots vides contiennent une liste de mots courants qui ne sont pas utiles pour la recherche.Stoplist objects contain a list of common words that are not useful for the search. Pour plus d’informations, consultez Configurer et gérer les mots vides et listes de mots vides pour la recherche en texte intégral.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • SQL ServerSQL Server Processeur de requêtes.SQL ServerSQL Server query processor. Le processeur de requêtes compile et exécute des requêtes SQL.The query processor compiles and executes SQL queries. Si une requête SQL inclut une requête de recherche en texte intégral, la requête est envoyée au Moteur d'indexation et de recherche en texte intégral, à la fois pendant la compilation et pendant l'exécution.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. Le résultat de la requête est opposé à l'index de texte intégral.The query result is matched against the full-text index.

  • Moteur d'indexation et de recherche en texte intégral.Full-Text Engine. Le Moteur d’indexation et de recherche en texte intégral de SQL ServerSQL Server est entièrement intégré au processeur de requêtes.The Full-Text Engine in SQL ServerSQL Server is fully integrated with the query processor. Le Moteur d'indexation et de recherche en texte intégral compile et exécute les requêtes de texte intégral.The Full-Text Engine compiles and executes full-text queries. Dans le cadre de l'exécution de la requête, le Moteur d'indexation et de recherche en texte intégral peut recevoir des entrées provenant du dictionnaire des synonymes et de la liste de mots vides.As part of query execution, the Full-Text Engine might receive input from the thesaurus and stoplist.

    Notes

    Dans SQL Server 2008SQL Server 2008 et les versions ultérieures, le moteur d'indexation et de recherche en texte intégral réside dans le processus SQL ServerSQL Server , plutôt que dans un service séparé.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. L’intégration du moteur d’indexation et de recherche en texte intégral au moteur de base de données a permis l’amélioration de la gestion du texte intégral ainsi que l’optimisation des requêtes mixtes et des performances globales.Integrating the Full-Text Engine into the Database Engine improved full-text manageability, optimization of mixed query, and overall performance.

  • Générateur d'index (indexeur).Index writer (indexer). Le générateur d'index crée la structure utilisée pour stocker les jetons indexés.The index writer builds the structure that is used to store the indexed tokens.

  • Gestionnaire du démon de filtre.Filter daemon manager. Le gestionnaire du démon de filtre est responsable de la surveillance de l'état du processus du démon du filtre du Moteur d'indexation et de recherche en texte intégral.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

L'hôte de démon de filtre est un processus démarré par le Moteur d'indexation et de recherche en texte intégral.The filter daemon host is a process that is started by the Full-Text Engine. Il exécute les composants de recherche en texte intégral ci-dessous, chargés d'accéder aux données des tables, de les filtrer et d'en effectuer l'analyse lexicale, ainsi que d'effectuer l'analyse lexicale et d'identifier la racine des mots de l'entrée de requête.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.

Les composants de l'hôte de démon de filtre sont les suivants :The components of the filter daemon host are as follows:

  • Gestionnaire de protocole.Protocol handler. Ce composant extrait les données de la mémoire en vue de leur traitement ultérieur et accède aux données d'une table utilisateur de la base de données spécifiée.This component pulls the data from memory for further processing and accesses data from a user table in a specified database. Il est chargé, entre autres, de collecter les données des colonnes indexées en texte intégral et de transmettre ces données à l'hôte de démon de filtre, qui applique le filtrage et l'analyse lexicale, si besoin est.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.

  • Filtres.Filters. Un filtrage peut être nécessaire sur certains types de données avant que les données d’un document puissent être indexées en texte intégral, notamment les données des colonnes varbinary, varbinary(max), imageou 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. Le filtre utilisé pour un document donné dépend du type de celui-ci.The filter used for a given document depends on its document type. Ainsi, différents filtres sont utilisés pour les documents Microsoft Word (.doc), les documents Microsoft Excel (.xls) et les documents XML (.xml).For example, different filters are used for Microsoft Word (.doc) documents, Microsoft Excel (.xls) documents, and XML (.xml) documents. Ensuite, le filtre extrait des segments de texte du document, en supprimant la mise en forme incorporée et en conservant le texte et, éventuellement, les informations sur l'emplacement du texte.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. Un flux d'informations textuelles est ainsi généré.The result is a stream of textual information. Pour plus d’informations, consultez Configurer et gérer les extensions analytiques avancées.For more information, see Configure and Manage Filters for Search.

  • Analyseurs lexicaux et générateurs de formes dérivées.Word breakers and stemmers. Un analyseur lexical est un composant spécifique d’une langue qui recherche des limites de mots en utilisant les règles lexicales de cette langue (analyse lexicale).A word breaker is a language-specific component that finds word boundaries based on the lexical rules of a given language (word breaking). Chaque analyseur lexical est associé à un composant de générateur de formes dérivées spécifique d'une langue qui conjugue des verbes et effectue des expansions fléchies.Each word breaker is associated with a language-specific stemmer component that conjugates verbs and performs inflectional expansions. Au moment de l'indexation, l'hôte de démon de filtre utilise un analyseur lexical et un générateur de formes dérivées pour effectuer l'analyse linguistique sur les données textuelles d'une colonne de table donnée.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. La langue associée à une colonne de table dans l'index de recherche en texte intégral détermine l'analyseur lexical et le générateur de formes dérivées à utiliser pour indexer la colonne.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. Pour plus d’informations, consultez Configurer et gérer les analyseurs lexicaux et générateurs de formes dérivées pour la recherche.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

Traitement de la recherche en texte intégralFull-Text Search processing

La recherche en texte intégral est rendue possible par le Moteur d'indexation et de recherche en texte intégral.Full-text search is powered by the Full-Text Engine. Le Moteur d'indexation et de recherche en texte intégral assure deux rôles : prise en charge de l'indexation et prise en charge des requêtes.The Full-Text Engine has two roles: indexing support and querying support.

Processus d’indexation de texte intégralFull-Text indexing process

Au début d'une alimentation de texte intégral (également appelé analyse), le Moteur d'indexation et de recherche en texte intégral effectue l'envoi (push) de grands lots de données en mémoire et informe l'hôte de démon de filtre.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. L'hôte filtre et effectue une analyse lexicale des données et il convertit les données converties en listes de mots inversées.The host filters and word breaks the data and converts the converted data into inverted word lists. La recherche en texte intégral extrait ensuite les données converties des listes de mots, traite les données pour supprimer les mots vides et conserve les listes de mots pour un lot dans un ou plusieurs index inversés.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.

Pendant l’indexation des données stockées dans une colonne varbinary(max) ou image , le filtre qui implémente l’interface IFilter extrait le texte en fonction du format de fichier spécifié pour ces données (par exemple, 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). Dans certains cas, les composants de filtrage imposent que les données varbinary(max) ou image soient écrites dans le dossier de filtrage de données, au lieu d’être envoyées (push) en mémoire.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.

Dans le cadre du traitement, les données de texte collectées sont transmises à un analyseur lexical pour décomposer le texte en jetons individuels ou mots clés.As part of processing, the gathered text data is passed through a word breaker to separate the text into individual tokens, or keywords. La langue utilisée pour la création de jetons peut être spécifiée au niveau de la colonne ou être identifiée au sein des données varbinary(max), imageou xml par le composant de filtrage.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.

Un traitement supplémentaire peut être effectué pour supprimer les mots vides et normaliser les jetons avant leur stockage dans l'index de recherche en texte intégral ou un fragment d'index.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.

À la fin d'une alimentation, une fusion finale est déclenchée ; les fragments d'index sont fusionnés entre eux dans un index de recherche en texte intégral.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Il en résulte une amélioration des performances des requêtes dans la mesure où seul l'index principal doit être interrogé au lieu des fragments d'index ; par ailleurs, les statistiques de score sont plus appropriées pour un classement en fonction de la pertinence.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.

Processus d’interrogation de texte intégralFull-Text querying process

Le processeur de requêtes passe les parties de texte intégral d'une requête au Moteur d'indexation et de recherche en texte intégral à des fins de traitement.The query processor passes the full-text portions of a query to the Full-Text Engine for processing. Le Moteur d'indexation et de recherche en texte intégral effectue l'analyse lexicale et procède éventuellement à des expansions du dictionnaire des synonymes, à la recherche de radical et au traitement des mots vides (mots parasites).The Full-Text Engine performs word breaking and, optionally, thesaurus expansions, stemming, and stopword (noise-word) processing. Ensuite, les parties de texte intégral de la requête sont représentées sous forme d'opérateurs SQL, essentiellement comme des fonctions table multi-diffusion.Then the full-text portions of the query are represented in the form of SQL operators, primarily as streaming table-valued functions (STVFs). Au cours de l'exécution de la requête, ces fonctions table multi-diffusion accèdent à l'index inversé pour extraire les résultats corrects.During query execution, these STVFs access the inverted index to retrieve the correct results. Les résultats sont alors retournés au client ou bien ils font l'objet d'un traitement supplémentaire avant d'être retournés au client.The results are either returned to the client at this point, or they are further processed before being returned to the client.

Architecture des index de recherche en texte intégralFull-text index architecture

Les informations contenues dans les index de recherche en texte intégral sont utilisées par le Moteur d'indexation et de recherche en texte intégral pour compiler des requêtes de texte intégral qui permettent de rechercher rapidement certains mots ou combinaisons de mots dans une table.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 index de recherche en texte intégral stocke les informations se rapportant aux mots significatifs et à leur emplacement dans une ou plusieurs colonnes d'une table de base de données.A full-text index stores information about significant words and their location within one or more columns of a database table. Un index de recherche en texte intégral est un type spécial d'index fonctionnel par jeton qui est construit et géré par le Moteur d'indexation et de recherche en texte intégral pour 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. Le processus de création d'un index de texte intégral diffère du processus de création des autres types d'index.The process of building a full-text index differs from building other types of indexes. Au lieu de construire une structure d'arbre B (B-tree) en fonction d'une valeur stockée dans une ligne particulière, le Moteur d'indexation et de recherche en texte intégral crée une structure d'index inversée, empilée, compressée et basée sur des jetons individuels provenant du texte indexé.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. La taille d’un index de recherche en texte intégral est limitée uniquement par les ressources mémoire dont dispose l’ordinateur sur lequel l’instance de SQL ServerSQL Server s’exécute.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.

À compter de SQL Server 2008SQL Server 2008, les index de recherche en texte intégral sont intégrés au Moteur de base de données, au lieu de résider dans le système de fichiers comme dans les versions antérieures 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. Pour une nouvelle base de données, le catalogue de texte intégral est désormais un objet virtuel qui n'appartient à aucun groupe de fichiers ; il s'agit tout simplement d'un concept logique qui fait référence à un groupe d'index de recherche en texte intégral.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. Notez toutefois que pendant la mise à niveau d’une base de données SQL Server 2005 (9.x)SQL Server 2005 (9.x) , pour tout catalogue de texte intégral qui contient des fichiers de données, un nouveau groupe de fichiers est créé ; pour plus d’informations, consultez Mise à niveau de la fonction de recherche en texte intégral.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.

Un seul index de recherche en texte intégral est autorisé par table.Only one full-text index is allowed per table. Pour qu'un index de recherche en texte intégral puisse être créé sur une table, cette dernière doit posséder une colonne d'index unique, qui n'accepte pas les valeurs Null.For a full-text index to be created on a table, the table must have a single, unique nonnull column. Vous pouvez créer un index de recherche en texte intégral sur les colonnes de type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinaryet varbinary(max) peut être indexé pour la recherche en texte intégral.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. Lorsque vous créez un index de recherche en texte intégral sur une colonne de type de données varbinary, varbinary(max), imageou xml , vous devez spécifier une colonne de type.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. Une colonne de type est une colonne de table dans laquelle vous stockez l’extension de fichier (.doc, .pdf, .xls, etc.) du document dans chaque ligne.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.

Structure d’index de recherche en texte intégralFull-text index structure

La compréhension de la structure d'un index de recherche en texte intégral vous permet de comprendre également le fonctionnement du Moteur d'indexation et de recherche en texte intégral.A good understanding of the structure of a full-text index will help you understand how the Full-Text Engine works. Cette rubrique utilise l'extrait suivant de la table Document dans Adventure WorksAdventure Works comme exemple de table.This topic uses the following excerpt of the Document table in Adventure WorksAdventure Works as an example table. L'extrait suivant montre deux colonnes, la colonne DocumentID et la colonne Title , ainsi que trois lignes provenant de cette table.This excerpt shows only two columns, the DocumentID column and the Title column, and three rows from the table.

Pour cet exemple, il faut partir de l’hypothèse qu’un index de recherche en texte intégral a été créé sur la colonne Title .For this example, we will assume that a full-text index has been created on the Title column.

DocumentIDDocumentID TitreTitle
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

Par exemple, la table suivante, qui illustre le Fragment 1, décrit le contenu de l’index de recherche en texte intégral créé sur la colonne Title de la table 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. Les index de recherche en texte intégral contiennent plus d'informations que les éléments présentés dans cette table.Full-text indexes contain more information than is presented in this table. La table est une représentation logique d'un index de recherche en texte intégral et est fournie à des fins de démonstration uniquement.The table is a logical representation of a full-text index and is provided for demonstration purposes only. Les lignes sont stockées dans un format compressé pour optimiser l'utilisation du disque.The rows are stored in a compressed format to optimize disk usage.

Remarquez que les données ont été inversées par rapport aux documents d'origine.Notice that the data has been inverted from the original documents. L'inversion se produit parce que les mots clés sont mappés aux ID de document.Inversion occurs because the keywords are mapped to the document IDs. Pour cette raison, un index de recherche en texte intégral est souvent désigné par le nom d'un index inversé.For this reason, a full-text index is often referred to as an inverted index.

Remarquez également que le mot clé « and » a été supprimé de l'index de recherche en texte intégral.Also notice that the keyword "and" has been removed from the full-text index. Cela s'explique du fait que « and » est un mot vide, et que la suppression de mots vides d'un index de recherche en texte intégral peut induire des économies substantielles en termes d'espace disque, d'où une amélioration des performances des requêtes.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. Pour plus d’informations sur les mots vides, consultez Configurer et gérer les mots vides et listes de mots vides pour la recherche en texte intégral.For more information about stopwords, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

Fragment 1Fragment 1

Mot cléKeyword ColIdColId DocIdDocId OccurrenceOccurrence
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
MaintenanceMaintenance 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
AssemblyAssembly 11 22 66
33 11 22 77
InstallationInstallation 11 33 44

La colonne Keyword contient la représentation d'un jeton unique extrait au moment de l'indexation.The Keyword column contains a representation of a single token extracted at indexing time. Les analyseurs lexicaux déterminent le contenu d'un jeton.Word breakers determine what makes up a token.

La colonne ColId contient une valeur qui correspond à une colonne particulière indexée en texte intégral.The ColId column contains a value that corresponds to a particular column that is full-text indexed.

La colonne DocId contient les valeurs d’un entier sur 8 octets mappé à une valeur de clé de texte intégral particulière dans une table indexée en texte intégral.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. Ce mappage est nécessaire lorsque la clé de texte intégral n'est pas un type de données integer.This mapping is necessary when the full-text key is not an integer data type. Dans de tels cas, les mappages entre les valeurs de clé de texte intégral et les valeurs DocId sont maintenus dans une table séparée appelée la table de mappage DocId.In such cases, mappings between full-text key values and DocId values are maintained in a separate table called the DocId Mapping table. Pour lancer une requête à propos de ces mappages, utilisez la procédure stockée système sp_fulltext_keymapping .To query for these mappings use the sp_fulltext_keymappings system stored procedure. Pour satisfaire à un critère de recherche, les valeurs DocId de la table précitée doivent être jointes avec la table de mappage DocId pour extraire des lignes de la table de base qui est interrogée.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. Lorsque la valeur de clé de texte intégral de la table de base est un type de données Integer, la valeur sert directement de DocId et aucun mappage n'est nécessaire.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. Par conséquent, l'utilisation de valeurs de clé de texte intégral Integer peut contribuer à optimiser des requêtes de texte intégral.Therefore, using integer full-text key values can help optimize full-text queries.

La colonne Occurrence contient une valeur entière.The Occurrence column contains an integer value. Pour chaque valeur DocId, il existe une liste de valeurs d'occurrences qui correspondent aux décalages de mots relatifs du mot clé spécifique contenu dans 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. Les valeurs d'occurrences servent à déterminer les correspondances d'expressions ou de proximité, par exemple lorsque des expressions ont des valeurs d'occurrences adjacentes numériquement.Occurrence values are useful in determining phrase or proximity matches, for example, phrases have numerically adjacent occurrence values. Elles servent également à calculer les scores de pertinence ; par exemple, le nombre d'occurrences d'un mot clé dans DocId peut être utilisé pour l'établissement d'un score.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.

Fragments d’index de recherche en texte intégralFull-text index fragments

L'index de recherche en texte intégral logique est habituellement fractionné entre plusieurs tables internes.The logical full-text index is usually split across multiple internal tables. Chaque table interne est appelé fragment d'index de recherche en texte intégral.Each internal table is called a full-text index fragment. Quelques-uns de ces fragments peuvent contenir des données plus récentes que d'autres.Some of these fragments might contain newer data than others. Par exemple, si un utilisateur met à jour la ligne suivante dont DocId est 3 et que la table effectue un suivi automatique des modifications, un nouveau fragment est créé.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 TitreTitle
33 Rear ReflectorRear Reflector

Dans l'exemple suivant, qui illustre le Fragment 2, le fragment contient des données plus récentes à propos de DocId 3 par rapport à Fragment 1.In the following example, which shows Fragment 2, the fragment contains newer data about DocId 3 compared to Fragment 1. Par conséquent, lorsque l'utilisateur émet des requêtes concernant « Rear Reflector », les données de Fragment 2 sont utilisées pour DocId 3.Therefore, when the user queries for "Rear Reflector" the data from Fragment 2 is used for DocId 3. Chaque fragment est marqué avec un horodateur de création qui peut être interrogé à l’aide de la vue de catalogue 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.

Fragment 2Fragment 2

Mot cléKeyword ColIdColId DocIdDocId OccOcc
RearRear 11 33 11
ReflectorReflector 11 33 22

Comme on peut le constater d'après Fragment 2, les requêtes de texte intégral doivent interroger chaque fragment en interne et ignorer les entrées plus anciennes.As can be seen from Fragment 2, full-text queries need to query each fragment internally and discard older entries. Par conséquent, trop de fragments d'index de recherche en texte intégral dans l'index de texte intégral peut conduire à une dégradation substantielle dans les performances des requêtes.Therefore, too many full-text index fragments in the full-text index can lead to substantial degradation in query performance. Pour réduire le nombre de fragments, réorganisez le catalogue de texte intégral en utilisant l’option REORGANIZE de l’instruction Transact-SQLTransact-SQL ALTER FULLTEXT CATALOG.To reduce the number of fragments, reorganize the fulltext catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOGTransact-SQLTransact-SQL statement. Cette instruction effectue une fusion principale, c’est-à-dire une fusion de tous les fragments en un fragment unique plus grand, et supprime toutes les entrées obsolètes de l’index de recherche en texte intégral.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.

Une fois réorganisé, l'index de l'exemple contient les lignes suivantes :After being reorganized, the example index would contain the following rows:

Mot cléKeyword ColIdColId DocIdDocId OccOcc
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
MaintenanceMaintenance 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
AssemblyAssembly 11 22 66
33 11 22 77

Différences entre les index en recherche intégral et les index standard SQL Server :Differences between full-text indexes and regular SQL Server indexes:.

Index de texte intégralFull-text indexes Index SQL Server classiquesRegular SQL Server indexes
Un seul index de recherche en texte intégral est autorisé par table.Only one full-text index allowed per table. Plusieurs index classiques sont autorisés par table.Several regular indexes allowed per table.
L’ajout de données aux index de recherche en texte intégral, opération que l’on appelle remplissage, doit être demandé soit dans le cadre de la planification, soit par le biais d’une requête spécifique, ou peut intervenir automatiquement lors de l’ajout de nouvelles données.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. Sont mis à jour automatiquement lorsque les données sur lesquelles ils sont fondés sont modifiées, mises à jour ou supprimées.Updated automatically when the data upon which they are based is inserted, updated, or deleted.
Sont groupés à l'intérieur d'une même base de données dans un ou plusieurs catalogues de texte intégral.Grouped within the same database into one or more full-text catalogs. Ne sont pas groupés.Not grouped.

Prise en charge des langues et composants linguistiques de la recherche en texte intégralFull-Text search linguistic components and language support

La recherche en texte intégral prend en charge environ 50 langues, dont l'anglais, l'espagnol, le chinois, le japonais, l'arabe, le bengali et l'hindi.Full-text search supports almost 50 diverse languages, such as English, Spanish, Chinese, Japanese, Arabic, Bengali, and Hindi. Pour obtenir une liste complète des langues de texte intégral prises en charge, consultez sys.fulltext_languages (Transact-SQL).For a complete list of the supported full-text languages, see sys.fulltext_languages (Transact-SQL). Chacune des colonnes contenues dans l'index de recherche en texte intégral est associée à un identificateur de paramètres régionaux (LCID) Microsoft Windows qui représente une langue prise en charge par la recherche en texte intégral.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. Par exemple, le LCID 1033 correspond à l'anglais américain et le LCID 2057 à l'anglais britannique.For example, LCID 1033 equates to U.S English, and LCID 2057 equates to British English. Pour chaque langue de texte intégral prise en charge, SQL ServerSQL Server fournit des composants linguistiques qui acceptent l'indexation et l'interrogation des données de texte intégral qui sont stockées dans cette langue.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.

Les composants spécifiques à une langue sont les suivants :Language-specific components include the following:

  • Analyseurs lexicaux et générateurs de formes dérivées.Word breakers and stemmers. Un analyseur lexical détecte les limites de mots en fonction des règles lexicales définies pour une langue donnée (analyse lexicale).A word breaker finds word boundaries based on the lexical rules of a given language (word breaking). Chaque analyseur lexical est associé à un générateur de formes dérivées qui conjugue des verbes pour la même langue.Each word breaker is associated with a stemmer that conjugates verbs for the same language. Pour plus d’informations, consultez Configurer et gérer les analyseurs lexicaux et générateurs de formes dérivées pour la recherche.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

  • Listes de mots vides.Stoplists. Une liste de mots vides système contenant un jeu de base de mots vides (également appelés mots parasites) est fournie.A system stoplist is provided that contains a basic set stopwords (also known as noise words). Un mot vide n’est d’aucune utilité pour la recherche et est ignoré par les requêtes de texte intégral.A stopword is a word that does not help the search and is ignored by full-text queries. Par exemple, en français, les mots tels que « un », « et », « est » ou « le » sont considérés comme des mots vides.For example, for the English locale words such as "a", "and", "is", and "the" are considered stopwords. En général, vous devez configurer un ou plusieurs fichiers de dictionnaires des synonymes et une ou plusieurs listes de mots vides.Typically, you will need to configure one or more thesaurus files and stoplists. Pour plus d’informations, consultez Configurer et gérer les mots vides et listes de mots vides pour la recherche en texte intégral.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • Fichiers du dictionnaire des synonymes.Thesaurus files. SQL ServerSQL Server installe aussi un fichier de dictionnaire des synonymes pour chaque langue de texte intégral, ainsi qu’un fichier de dictionnaire des synonymes global.also installs a thesaurus file for each full-text language, as well as a global thesaurus file. Les fichiers de dictionnaire des synonymes installés sont essentiellement vides, mais vous pouvez les modifier et définir des synonymes pour une langue ou un scénario d'entreprise spécifique.The installed thesaurus files are essentially empty, but you can edit them to define synonyms for a specific language or business scenario. En développant un dictionnaire des synonymes adapté à vos données de texte intégral, vous pouvez élargir efficacement l'étendue des requêtes de texte intégral sur ces données.By developing a thesaurus tailored to your full-text data, you can effectively broaden the scope of full-text queries on that data. Pour plus d’informations, consultez Configurer et gérer les fichiers de dictionnaire des synonymes pour la recherche en texte intégral.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Filtres (iFilters).Filters (iFilters). L’indexation d’un document dans une colonne dont le type de données est varbinary(max), imageou xml exige le traitement supplémentaire d’un filtre.Indexing a document in a varbinary(max), image, or xml data type column requires a filter to perform extra processing. Ce filtre doit être spécifique au type de document (.doc, .pdf, .xls, .xml, etc.).The filter must be specific to the document type (.doc, .pdf, .xls, .xml, and so forth). Pour plus d’informations, consultez Configurer et gérer les extensions analytiques avancées.For more information, see Configure and Manage Filters for Search.

Les analyseurs lexicaux (et les générateurs de formes dérivées) et les filtres s'exécutent dans le processus hôte de démon de filtre (fdhost.exe).Word breakers (and stemmers) and filters run in the filter daemon host process (fdhost.exe).

S’APPLIQUE À : ouiSQL Server (à partir de 2008) ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse