Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Caractères d'échappement de la recherche en texte intégral SQL Server ?

Mauvaise nouvelle :il n'y a aucun moyen. Bonne nouvelle :vous n'en avez pas besoin (car cela ne vous aidera pas de toute façon).

J'ai rencontré un problème similaire sur l'un de mes projets. D'après ce que j'ai compris, lors de la création d'un index de texte intégral, SQL Server traite tous les caractères spéciaux comme des délimiteurs de mots et donc :

  1. Votre mot avec un tel caractère est représenté comme deux (ou plus) mots dans l'index de texte intégral.
  2. Ces caractères sont supprimés et n'apparaissent pas dans un index.

Considérons que nous avons le tableau suivant avec un index de texte intégral correspondant (qui est ignoré) :

CREATE TABLE [dbo].[ActicleTable] 
(
  [Id] int identity(1,1) not null primary key,
  [ActicleBody] varchar(max) not null
);

Considérez plus tard que nous ajoutons des lignes au tableau :

INSERT INTO [ActicleTable] values ('digitally improvements folders')
INSERT INTO [ActicleTable] values ('digital"ly improve{ments} fold(ers)')

Essayez de rechercher :

SELECT * FROM [ArticleTable] WHERE CONTAINS(*, 'digitally')
SELECT * FROM [ArticleTable] WHERE CONTAINS(*, 'improvements')
SELECT * FROM [ArticleTable] WHERE CONTAINS(*, 'folders')

et

SELECT * FROM [ArticleTable] WHERE CONTAINS(*, 'digital')
SELECT * FROM [ArticleTable] WHERE CONTAINS(*, 'improve')
SELECT * FROM [ArticleTable] WHERE CONTAINS(*, 'fold')

Le premier groupe de conditions correspondra à la première ligne (et non à la seconde) tandis que le deuxième groupe correspondra uniquement à la deuxième ligne.

Malheureusement, je n'ai pas pu trouver de lien vers MSDN (ou quelque chose) où un tel comportement est clairement indiqué. Mais j'ai trouvé un article officiel qui explique comment convertir les guillemets pour les requêtes de recherche en texte intégral, qui est [implicitement] aligné sur l'algorithme décrit ci-dessus.