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

Откуда:
Сообщений: 103
Возникла проблема при поиске.
В вьюхе с полнотекстовым поиском есть текст "тест 45" и вот таким запросом ничего не выводит
SELECT *
FROM View_Test
WHERE CONTAINS(TextSearch, '"тест*" ~ "45*"')

Если запрос поменять на
SELECT *
FROM View_Test
WHERE CONTAINS(TextSearch, '"тест45*"')

успешно находится, хоть там и есть пробел.
В чем может быть проблема? Есть у кого идеи?

ЗЫ: Индекс перестравивал, список стоп-слов вырублен
16 апр 13, 10:40    [14185670]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
CONTAINS
Query with Full-Text Search

Где вы нашли
автор
'"тест*" ~ "45*"'
?
16 апр 13, 10:51    [14185726]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
invm
Member

Откуда: Москва
Сообщений: 9837
Maxx,

<generic_proximity_term> ::= 
  { <simple_term> | <prefix_term> } { { { NEAR | ~ } 
16 апр 13, 10:55    [14185758]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Max_Tpop
Member

Откуда:
Сообщений: 103
Maxx,

Запрос правильный, если вы об этом.
Например, в этой вьюхе есть текст "тест 12"
Запросом
SELECT *
FROM View_Test
WHERE CONTAINS(TextSearch, '"тест*" ~ "12*"')

он будет найден.
Вот только не понятно почему "тест 45" не находит, будто между текстом нет пробела.
16 апр 13, 10:59    [14185780]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Max_Tpop
Вот только не понятно почему "тест 45" не находит, будто между текстом нет пробела.

А каким образом вы проверили, что там нет пробела?
16 апр 13, 11:00    [14185788]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Max_Tpop
Member

Откуда:
Сообщений: 103
Гость333
Max_Tpop
Вот только не понятно почему "тест 45" не находит, будто между текстом нет пробела.

А каким образом вы проверили, что там нет пробела?

В вьюхе этот текст выводится с пробелом, а проиндексировалось наверно без него, точно не уверен, так как это не проверить.
16 апр 13, 11:02    [14185798]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
invm,
точно ,epic fail
16 апр 13, 11:05    [14185821]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Max_Tpop
Member

Откуда:
Сообщений: 103
Вот скрипты и возможные варианты данной проблемы. Похоже дело в тире между словом и в трехзначном коде. Как с этим бороться, в основном поиск происходит по коду.
-- Создаем таблицу
CREATE TABLE TestTable
(
	ID int NOT NULL,
	Name nvarchar(50),
	Code nvarchar(50)
)
GO

-- Наполняем тестовыми данными
Insert Into TestTable
			Values (1, 'тест', '445'), 
		               (2, 'тест-1', '445'), 
		               (3, 'test-1', '445'), 
			       (4, 'тест-1', '4455')
GO

-- Создаем вьюху с привязкой к схеме			
CREATE VIEW View_Test WITH SCHEMABINDING
AS
SELECT ID, 
       Name +' '+ Code AS NameWithCode,
       Name,
       Code
FROM dbo.TestTable
GO

-- Создаем уникальный индекс
CREATE UNIQUE CLUSTERED INDEX IndexViewTest ON dbo.View_Test
(
	ID ASC
) 
GO

-- Создаем каталог
CREATE FULLTEXT CATALOG TestCatalog
GO

-- Создаем полнотекстовый индекс
CREATE FULLTEXT INDEX ON View_Test
(
	NameWithCode LANGUAGE 1049,
	Name LANGUAGE 1049,
	Code LANGUAGE 1049
)
KEY INDEX IndexViewTest ON TestCatalog
WITH (CHANGE_TRACKING = AUTO, STOPLIST = OFF)
GO

-- Ждем 3 сек. для заполнения индекса
Waitfor Delay '00:00:03'

declare @Search nvarchar(100) = '445'

Set @Search = CHAR(26) + LTRIM(RTRIM(@Search)) + CHAR(27)
Set @Search = REPLACE(REPLACE(REPLACE(@Search, ' ', '*" ~ "'), CHAR(26), '"'), CHAR(27), '*"')

SELECT *
FROM View_Test
WHERE CONTAINS(NameWithCode, @Search)

SELECT *
FROM View_Test
WHERE CONTAINS(Code, @Search)

Set @Search = 'тест-1445'

Set @Search = CHAR(26) + LTRIM(RTRIM(@Search)) + CHAR(27)
Set @Search = REPLACE(REPLACE(REPLACE(@Search, ' ', '*" ~ "'), CHAR(26), '"'), CHAR(27), '*"')

SELECT *
FROM View_Test
WHERE CONTAINS(NameWithCode, @Search)
17 апр 13, 09:46    [14190477]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при полнотекстовом поиске  [new]
Max_Tpop
Member

Откуда:
Сообщений: 103
Проблема была в неправильном разбиение слов из-за выбранного языка (Русский-1049) при создании индекса. Почему то слово тест-1 445 разбивалось как nn1445-, поэтому заменил язык на (Английский-1033) и все заработало.
Пример разбиения для языка 1049:
select *
from sys.dm_fts_parser('"тест-1 445"', 1049, null, 0)

keyword group_id phrase_id occurrence special_term display_term expansion_type source_term
0x0442043504410442101Exact Matchтест0тест-1 445
0x002D00310020003400340035102Exact Match-1 4450тест-1 445
0x006E006E0031003400340035002D102Exact Matchnn1445-0тест-1 445

Пример разбиения для языка 1033:
select *
from sys.dm_fts_parser('"тест-1 445"', 1033, null, 0)

keyword group_id phrase_id occurrence special_term display_term expansion_type source_term
0x0442043504410442101Exact Matchтест0тест-1 445
0x0031102Exact Match10тест-1 445
0x006E006E0031102Exact Matchnn10тест-1 445
0x003400340035103Exact Match4450тест-1 445
0x006E006E003400340035103Exact Matchnn4450тест-1 445
22 апр 13, 11:18    [14211682]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить