У нас есть приложение, которое использует базу данных SQL Server 2008 и полнотекстовый поиск -. Я пытаюсь понять, почему следующие запросы ведут себя по-разному:
Во-первых, фраза, содержащая слово через дефис, например:
contains(column_name, '"one two-three-four five"')
А во-вторых, идентичная фраза, где дефисы заменены пробелами:
contains(column_name, '"one two three four five"')
Полный текстовый индекс -использует локаль ENGLISH (1033 )и системный стоп-лист по умолчанию.
Из моих наблюдений за другими полными -текстовыми поисками, содержащими слова через дефис, первый должен допускать совпадения по one two three four five
или one twothreefour five
. Вместо этого он соответствует толькоone twothreefour five
(а неone two-three-four five
).
Тестовый случай
Настройка:
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
Запросы:
--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
Очистка:
drop fulltext index on ftTest
drop fulltext catalog ftTest_catalog;
drop table ftTest;