Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Escape-Zeichen für die SQL Server-Volltextsuche?

Schlechte Nachrichten:Es gibt keine Möglichkeit. Gute Nachrichten:Sie brauchen es nicht (da es sowieso nicht hilft).

Ich habe bei einem meiner Projekte ein ähnliches Problem gehabt. Mein Verständnis ist, dass SQL Server beim Erstellen des Volltextindex alle Sonderzeichen als Worttrennzeichen behandelt und daher:

  1. Ihr Wort mit einem solchen Zeichen wird im Volltextindex als zwei (oder mehr) Wörter dargestellt.
  2. Diese(s) Zeichen werden entfernt und erscheinen nicht in einem Index.

Stellen Sie sich vor, wir haben die folgende Tabelle mit einem entsprechenden Volltextindex dafür (der übersprungen wird):

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

Überlegen Sie später, wie wir Zeilen zur Tabelle hinzufügen:

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

Versuchen Sie es mit der Suche:

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

und

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

Die erste Bedingungsgruppe stimmt mit der ersten Reihe (und nicht mit der zweiten) überein, während die zweite Gruppe nur mit der zweiten Reihe übereinstimmt.

Leider konnte ich keinen Link zu MSDN (oder so) finden, wo ein solches Verhalten eindeutig angegeben ist. Aber ich habe einen offiziellen Artikel gefunden, der erklärt, wie man Anführungszeichen für Volltext-Suchanfragen umwandelt, was [implizit] mit dem oben beschriebenen Algorithmus übereinstimmt.