Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Быстрый тупой вопрос по SELECT  [new]
Bombastic
Member [заблокирован]

Откуда: Бомбамбия-Кергуду, ТЛПляндия
Сообщений: 5427
А че дефисы в запросе не учитываются?
Почему-то у меня
WHERE CONTAINS([Data], '"*444-nj-456*"')
ничего не выводит, хотя есть текст Trulala 55 444-nj-456
14 мар 14, 13:31    [15723564]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
Дедушка Ау
Guest
Bombastic,

А если "*" убрать?
14 мар 14, 13:45    [15723716]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
Bombastic
Member [заблокирован]

Откуда: Бомбамбия-Кергуду, ТЛПляндия
Сообщений: 5427
Дедушка Ау
Bombastic,

А если "*" убрать?


Все также. Хотя по логике должно же как слово целиком восприниматься. Да?
14 мар 14, 14:01    [15723919]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
icprog
Member

Откуда:
Сообщений: 166
Может дело в кавычках?
Попробуйте:
WHERE CONTAINS([Data], '*444-nj-456*')
14 мар 14, 14:09    [15723991]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
icprog
Member

Откуда:
Сообщений: 166
Точнее так:
WHERE CONTAINS([Data], '444-nj-456')
14 мар 14, 14:15    [15724034]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
Bombastic
Member [заблокирован]

Откуда: Бомбамбия-Кергуду, ТЛПляндия
Сообщений: 5427
icprog
Точнее так:
WHERE CONTAINS([Data], '444-nj-456')


Не помогает. Странно как-то. А двойные ковычки со звездочкой идут, синтаксис для использования вайлкарда по аналогии с процентом в лайк
14 мар 14, 14:21    [15724096]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Bombastic,

А эта фраза точно есть в индексе? Вот эксперимент провел:
create database FtTest
go
use FtTest
go
create table FtTable(id int not null identity, val varchar(max), constraint PK_id primary key(id));
insert FtTable(val) values ('test1'),('Trulala 55 444-nj-456'),('test2');
go
create fulltext catalog FtCatalog as default;
go
create fulltext index on fttable(val) key index pk_id;
go
waitfor delay '00:00:05'; --Comment this
go
select * from sys.dm_fts_index_keywords( db_id(), object_id('FtTable'))
go
select * from FtTable where contains(Val, '"*444-nj-456*"')
go
use master;
go
drop database FtTest;
go

Результат возвращается.
keyword display_item
0x003400340034 444
0x003400350036 456
0x00350035 55
0x006E006A nj
0x006E006E003400340034 nn444
0x006E006E003400350036 nn456
0x006E006E00350035 nn55
0x00740065007300740031 test1
0x00740065007300740032 test2
0x007400720075006C0061006C0061 trulala
0xFF END OF FILE


id val
2 Trulala 55 444-nj-456


Т.е. все нормально ищет.
Но если в эксперименте убрать делэй, то не возвращает ничего, потому что видно, что индекс пустой.

В документации написано что есть разные методы заполнения индекса.
автор
CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }

Указывает, будет ли SQL Server распространять на полнотекстовый индекс изменения (обновления, удаления или вставки), выполненные в столбцах таблицы, которые включены в полнотекстовый индекс.

Кроме того, даже для AUTO указано что:
автор
AUTO

Указывает, что отслеживаемые изменения будут распространяться автоматически в ходе изменения данных в базовой таблице (автоматическое заполнение). Изменения могут распространяться автоматически, однако это не значит, что они будут немедленно отражаться в полнотекстовом индексе. Аргумент AUTO используется по умолчанию.

Что и наблюдается в эксперименте.

Может быть вам нужно сделать что-то принудительно, чтобы изменения отразились в индексе, типа
alter fulltext index on fttable start update population;


Посмотрите, что у вас там (в индексе) вообще, я так понимаю, разбивание на слова тоже идет в соответствии с выбранным языком и определенными правилами.

Короче я к тому, что дефисы ни при чем, скорее всего, во всяком случае, в простом эксперименте сервер все четко возвращает.
14 мар 14, 14:44    [15724339]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый тупой вопрос по SELECT  [new]
Bombastic
Member [заблокирован]

Откуда: Бомбамбия-Кергуду, ТЛПляндия
Сообщений: 5427
SomewhereSomehow
Bombastic,

А эта фраза точно есть в индексе? Вот эксперимент провел:
create database FtTest
go
use FtTest
go
create table FtTable(id int not null identity, val varchar(max), constraint PK_id primary key(id));
insert FtTable(val) values ('test1'),('Trulala 55 444-nj-456'),('test2');
go
create fulltext catalog FtCatalog as default;
go
create fulltext index on fttable(val) key index pk_id;
go
waitfor delay '00:00:05'; --Comment this
go
select * from sys.dm_fts_index_keywords( db_id(), object_id('FtTable'))
go
select * from FtTable where contains(Val, '"*444-nj-456*"')
go
use master;
go
drop database FtTest;
go

Результат возвращается.
keyword display_item
0x003400340034 444
0x003400350036 456
0x00350035 55
0x006E006A nj
0x006E006E003400340034 nn444
0x006E006E003400350036 nn456
0x006E006E00350035 nn55
0x00740065007300740031 test1
0x00740065007300740032 test2
0x007400720075006C0061006C0061 trulala
0xFF END OF FILE


id val
2 Trulala 55 444-nj-456


Т.е. все нормально ищет.
Но если в эксперименте убрать делэй, то не возвращает ничего, потому что видно, что индекс пустой.

В документации написано что есть разные методы заполнения индекса.
автор
CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }

Указывает, будет ли SQL Server распространять на полнотекстовый индекс изменения (обновления, удаления или вставки), выполненные в столбцах таблицы, которые включены в полнотекстовый индекс.

Кроме того, даже для AUTO указано что:
автор
AUTO

Указывает, что отслеживаемые изменения будут распространяться автоматически в ходе изменения данных в базовой таблице (автоматическое заполнение). Изменения могут распространяться автоматически, однако это не значит, что они будут немедленно отражаться в полнотекстовом индексе. Аргумент AUTO используется по умолчанию.

Что и наблюдается в эксперименте.

Может быть вам нужно сделать что-то принудительно, чтобы изменения отразились в индексе, типа
alter fulltext index on fttable start update population;


Посмотрите, что у вас там (в индексе) вообще, я так понимаю, разбивание на слова тоже идет в соответствии с выбранным языком и определенными правилами.

Короче я к тому, что дефисы ни при чем, скорее всего, во всяком случае, в простом эксперименте сервер все четко возвращает.


Cпасибо большое за подробный и полезный ответ!
Да, индексы у меня странные. Сейчас буду разбираться. Спасибо!
14 мар 14, 15:15    [15724691]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить