Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Caratteri di escape della ricerca di testo completo di SQL Server?

Cattive notizie:non c'è modo. Buone notizie:non ne hai bisogno (perché non servirà comunque).

Ho affrontato un problema simile su uno dei miei progetti. La mia comprensione è che durante la creazione di un indice full-text, SQL Server tratta tutti i caratteri speciali come delimitatori di parole e quindi:

  1. La tua parola con un tale carattere è rappresentata come due (o più) parole nell'indice full-text.
  2. Questi caratteri vengono rimossi e non vengono visualizzati in un indice.

Si consideri che abbiamo la seguente tabella con un corrispondente indice full-text (che viene saltato):

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

Considera in seguito di aggiungere righe alla tabella:

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

Prova a cercare:

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

e

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

Il primo gruppo di condizioni corrisponderà alla prima riga (e non alla seconda) mentre il secondo gruppo corrisponderà solo alla seconda riga.

Sfortunatamente non sono riuscito a trovare un collegamento a MSDN (o qualcosa del genere) in cui tale comportamento sia chiaramente indicato. Ma ho trovato un articolo ufficiale che spiega come convertire le virgolette per le query di ricerca full-text, che è [implicitamente] allineato con l'algoritmo sopra descritto.