sql >> Database >  >> RDS >> Sqlserver

Escape-tekens voor zoeken in volledige tekst in SQL Server?

Slecht nieuws:dat kan niet. Goed nieuws:je hebt het niet nodig (omdat het toch niet helpt).

Ik heb een soortgelijk probleem ondervonden bij een van mijn projecten. Ik heb begrepen dat SQL Server tijdens het bouwen van een volledige tekstindex alle speciale tekens behandelt als scheidingstekens voor woorden en daarom:

  1. Uw woord met zo'n teken wordt weergegeven als twee (of meer) woorden in de volledige tekstindex.
  2. Deze tekens zijn verwijderd en verschijnen niet in een index.

Bedenk dat we de volgende tabel hebben met een bijbehorende full-text index ervoor (die wordt overgeslagen):

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

Overweeg later dat we rijen aan de tabel toevoegen:

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

Probeer te zoeken:

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

en

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

De eerste groep voorwaarden komt overeen met de eerste rij (en niet de tweede), terwijl de tweede groep alleen met de tweede rij overeenkomt.

Helaas kon ik geen link naar MSDN (of iets dergelijks) vinden waar dergelijk gedrag duidelijk wordt vermeld. Maar ik heb een officieel artikel gevonden dat vertelt hoe je aanhalingstekens kunt converteren voor zoekopdrachten in volledige tekst, dat [impliciet] is afgestemd op het hierboven beschreven algoritme.




  1. Alternatief voor het gebruik van het trefwoord LIMIT in een SubQuery in MYSQL

  2. Een array doorgeven aan een query met behulp van een WHERE-component

  3. Is het mogelijk om uit meerdere tabellen in dezelfde SQL-instructie te verwijderen?

  4. De langzaamste zoekopdrachten vinden