L’exemple suivant montre comment configurer SQL Server 2008 afin d’effectuer une recherche Full Text Search sur un champ de la base destiné à stocker du code HTML. Le principe est le même pour indexer des .doc, .pdf, etc.
Code HTML d’exemple
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Bewise</title></head>
<body>
<span class="important">Bewise, nous développons votre avance</span>
</body>
</html>
Avant toute chose, une nouveauté de iFTS (integrated Full Text Search – le nouveau nom de la recherche plein texte de SQL Server) nous permet de tester comment le Word Breaker effectue son découpage sur ce texte HTML :
sys.dm_fts_parser('query_string', lcid, stoplist_id, accent_sensitivity)
(http://msdn.microsoft.com/en-us/library/cc280463.aspx)
SELECT *
FROM sys.dm_fts_parser (
'"<html xmlns=''http://www.w3.org/1999/xhtml''><head><title>Bewise</title></head><body><span class=''important''>Bewise, nous développons votre avance</span></body></html>"',
1033, 0, 0)
L’ensemble des balises HTML et classes CSS ne sont pas considérées comme des NOISE WORD. Ils seront donc pris en compte dans le cas d’une recherche. Une solution à ce problème pourrait être d’ajouter à notre Stop List l’ensemble des balises html connues ; mais cela ne règlerait pas le problème des classes et autres styles CSS.
La solution la plus optimisée consiste en fait à profiter des iFilters supportés par SQL 2008 (http://msdn.microsoft.com/en-us/library/ms142499.aspx). Pour activer l’ensemble des filtres disponibles sur votre instance l’instruction suivante doit être exécutée :
EXEC sp_fulltext_service @action='load_os_resources', @value=1;
L’ensemble des filtres dispos sont récupérables avec l’instruction suivante :
EXEC sp_help_fulltext_system_components 'filter';
On y trouve un filtre pour les extensions .html, .aspx, etc.
Afin de pouvoir « filtrer » notre HTML lors de recherche Full Text, plusieurs points sont à suivre et risque de modifier votre modèle de données s’il est déjà en place. En effet, les filtres ne s’appliquent qu’à des champs de type XML, image ou varbinary !
Dans notre exemple il faut donc prendre soin de stocker notre HTML dans un champ de type VARBINARY(MAX) et surtout pas NVARCHAR(MAX).
Attention ! L’encodage à utiliser pour stocker notre HTML doit être impérativement de l’UTF-8 ! Autrement, le word breaker ne sera pas capable d’interpréter le flux binaire correctement.
Ensuite, il va falloir « typer » notre champ contenant le HTML afin que la Full Text Search utilise le filtre désiré. Autrement dit, faire le lien entre notre champ binaire et le filtre désiré. Pour ce faire, on va ajouter une colonne supplémentaire à notre table. Cette colonne doit être de type char ou nvarchar et va contenir le nom (componentname) du filtre choisi. Dans notre cas c’est « .html »
Lors de la création de l’index Full Text on précise alors le nom de la colonne de notre table qui contient le type de filtre à utiliser. C’est le paramètre 'type_column_name'. Cela peut être fait via Management Studio en Design sur la table.
sp_fulltext_column [ @tabname = ] 'qualified_table_name' ,
[ @colname = ] 'column_name' ,
[ @action = ] 'action'
[ , [ @language = ] 'language' ]
[ , [ @type_colname = ] 'type_column_name' ]
http://msdn.microsoft.com/en-us/library/aa933405(SQL.80).aspx
Une fois le catalog Full Text reconstruit, un appel FREETEXT, FREETEXTTABLE, CONTAINS ou CONTAINSTABLE sur notre champ binaire va faire appel au filtre HTML et nous filtrer correctement tout ce qui est balises ou style.