2012-07-25 13 views
7

Mamy aplikację korzystającą z bazy danych SQL Server 2008 i wyszukiwanie pełnotekstowe. Próbuję zrozumieć, dlaczego zachowują się inaczej następujące pytania:Wyszukiwanie pełnotekstowe SQL Server dla frazy zawierającej łącznik nie zwraca oczekiwanych wyników.

pierwszy, wyrażenie zawierające dzielone słowo tak:

contains(column_name, '"one two-three-four five"') 

A po drugie, identyczne zdanie, gdzie myślniki są zastąpione spacjami :

contains(column_name, '"one two three four five"') 

Indeks pełnotekstowy wykorzystuje język angielski (1033) i domyślną stoplistę systemu.

Z moich obserwacji innych wyszukiwań pełnotekstowych zawierających słowa dzielone, pierwszy powinien umożliwiać dopasowywanie na one two three four five lub one twothreefour five. Zamiast tego pasuje tylko do one twothreefour five (a nie one two-three-four five).


Przypadek Testowy

Setup:

create table ftTest 
(
    Id int identity(1,1) not null, 
    Value nvarchar(100) not null, 
    constraint PK_ftTest primary key (Id) 
); 

insert ftTest (Value) values ('one two-three-four five'); 
insert ftTest (Value) values ('one twothreefour five'); 

create fulltext catalog ftTest_catalog; 
create fulltext index on ftTest (Value language 1033) 
    key index PK_ftTest on ftTest_catalog; 
GO 

Zapytania:

--returns one match 
select * from ftTest where contains(Value, '"one two-three-four five"') 

--returns two matches 
select * from ftTest where contains(Value, '"one two three four five"') 
select * from ftTest where contains(Value, 'one and "two-three-four five"') 
select * from ftTest where contains(Value, '"one two-three-four" and five') 
GO 

Cleanup:

drop fulltext index on ftTest 
drop fulltext catalog ftTest_catalog; 
drop table ftTest; 

Odpowiedz

7

http://support.microsoft.com/default.aspx?scid=kb;en-us;200043

„Gdzie charakter non-alfanumeryczny muszą być stosowane w critera wyszukiwania (głównie myślnik«-»charakter)., Wykorzystać klauzulę Transact-SQL LIKE zamiast pełnotekstowego lub zawiera predykaty”

+1

Pytanie jest więcej o * dlaczego * Serwer SQL wykazuje różne zachowanie dla dopasowywania.Praca z nim jest z pewnością wykonalna, ale po prostu nie ma dla mnie sensu, że "dwa-trzy-cztery pięć" zwróci oba wiersze, jednak "jeden dwa-trzy-cztery pięć" nie będzie. Ditto dla "jeden dwa-trzy-cztery". Czy to naprawdę oczekiwane zachowanie? a jeśli tak, dlaczego? – Laviak

5

W takich przypadkach, w których nie można przewidzieć zachowania słowa-breaker, zawsze dobrze jest uruchomić sys.dm_fts_parser na strunach, aby dowiedzieć się, jak słowa zostaną podzielone i przechowywane w wewnętrzny indeks.

Na przykład, bieganie sys.dm_fts_parser na „«jeden dwa trzy cztery pięć»” wyników w następujący -

select * from sys.dm_fts_parser('"one two-three-four five"', 1033, NULL, 0) 
--edited-- 
1 0 1 Exact Match one 
1 0 2 Exact Match two-three-four 
1 0 2 Exact Match two 
1 0 3 Exact Match three 
1 0 4 Exact Match four 
1 0 5 Exact Match five 

Jak widać z wyników zwróconych, słowo-breaker analizuje Łańcuch i wynik sześciu form, które mogą wyjaśniać wyniki wyświetlane podczas uruchamiania zapytania CONTAINS.

1

Wyszukiwanie pełnotekstowe uważa słowo za ciąg znaków bez spacji ani interpunkcji. Wystąpienie znaku niealfanumerycznego może "złamać" słowo podczas wyszukiwania. Ponieważ wyszukiwanie pełnotekstowe SQL Server jest mechanizmem opartym na słowie, interpunkcja ogólnie nie jest brana pod uwagę i jest ignorowana podczas przeszukiwania indeksu. Dlatego klauzula CONTAINS, taka jak "ZAWIERA (testowanie," awaria komputera ")" pasuje do wiersza z wartością "Niepowodzenie znalezienia mojego komputera byłoby kosztowne.".

Proszę skorzystać z linku dlaczego: https://support.microsoft.com/en-us/kb/200043

Powiązane problemy