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;
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