2009-06-15 22 views

Odpowiedz

23

Złe wieści: nie ma mowy. Dobra wiadomość: nie potrzebujesz tego (bo i tak nie pomoże).

Napotkałem podobny problem w jednym z moich projektów. W moim rozumieniu jest to, że podczas budowania indeksu pełnotekstowego, SQL Server traktuje znaki wszystkim specjalne jako ograniczników słów, a zatem:

  1. Twoje słowo o takim charakterze jest reprezentowany jako dwa (lub więcej) słów indeksu pełnotekstowego.
  2. Te znaki są usunięte i nie pojawiają się w indeksie.

Rozważmy mamy następującą tabelę z odpowiedniego indeksu pełnotekstowego dla niego (co jest pomijane):

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

Rozważmy później dodać wiersze do tabeli:

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

Spróbuj wyszukać:

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

i

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

Pierwsza grupa warunków zostanie dopasowana do pierwszego wiersza (a nie do drugiego), podczas gdy druga grupa będzie pasować tylko do drugiego rzędu.

Niestety nie mogłem znaleźć linku do MSDN (lub czegoś takiego), gdzie takie zachowanie jest jasno określone. Ale znalazłem official article, który mówi, jak konwertować cudzysłów dla pełnotekstowych zapytań wyszukiwania, który jest [niejawnie] wyrównany z wyżej opisanym algorytmem.

Powiązane problemy