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

Откуда: Москва
Сообщений: 1053
На входе в процедуру есть текст (храниться в таблице, по которой построен FullText Index), так же есть таблица с Keywords. Необходимо в тексте найти эти самые Keywords, понятно, что Keywords написаны могут быть в единственном числе, а в тесте может встречаться и множественное число или глагольная форма и т.д. Как лучшим способом решить данную задачу? Первое что приходит в голову - это в цикле по Keywords динамически формировать селект с contains для данного текста и если он возвращает данные, то запоминаем в таблицу и т.д. Но по сути это же обратная задача по тексту найти кейвордс, а не по кейвордс найти текст. В принципе можно посмотреть, что храниться в индексе для данного текста, но дальше не понятно как сравниваться данные из индекса и кейвордс, формы же разные?
10 дек 12, 10:51    [13604769]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Glory
Member

Откуда:
Сообщений: 104751
И сразу цикл с динамикой ?
APPLY JOIN уже отменили ?
10 дек 12, 10:55    [13604805]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
gang
Member

Откуда:
Сообщений: 1394
Hel975, FORMSOF смотрели?
10 дек 12, 10:57    [13604822]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
gang
Hel975, FORMSOF смотрели?


Именно, его и юзаю, вопрос не в этом был.
10 дек 12, 11:03    [13604896]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
И сразу цикл с динамикой ?
APPLY JOIN уже отменили ?


Блин, все время забываю про эти новые джойны. Спасибо за подсказку. Старые привычки сложно искоренить... А со стороны данных в индексе никак не зайти?
10 дек 12, 11:06    [13604913]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
И сразу цикл с динамикой ?
APPLY JOIN уже отменили ?


Glory, я правильно поняла мысль - перенести динамику в табличную функцию и использовать CROSS APPLY?
10 дек 12, 11:19    [13605017]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Hel975
Glory, я правильно поняла мысль - перенести динамику в табличную функцию и использовать CROSS APPLY?

У вас уже есть "так же есть таблица с Keywords"
Что мешает использовать ее с CONTAINSTABLE ?
10 дек 12, 11:21    [13605035]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
Hel975
Glory, я правильно поняла мысль - перенести динамику в табличную функцию и использовать CROSS APPLY?

У вас уже есть "так же есть таблица с Keywords"
Что мешает использовать ее с CONTAINSTABLE ?


Что-то не доходит. Делаю так:
SELECT k.ProjectCodingKeywordID, k.Keyword, cc.ProjectID 
FROM dbo.ProjectCodingKeyword k (NOLOCK)		
	INNER JOIN ProjectCodingCode c (NOLOCK) ON k.ProjectCodingCodeID = c.ProjectCodingCodeID
	INNER JOIN ProjectCodingCategory cc (NOLOCK) ON c.ProjectCodingCategoryID = cc.ProjectCodingCategoryID
	CROSS APPLY (
		SELECT FT_TBL.AnswerVerbatimID 
		FROM vFFM_Verbatim_en AS FT_TBL 
			INNER JOIN
				CONTAINSTABLE(vFFM_Verbatim_en, Verbatim, 'FORMSOF(INFLECTIONAL,"' + k.Keyword + '")') AS KEY_TBL
				ON FT_TBL.AnswerVerbatimID = KEY_TBL.[KEY]
		WHERE FT_TBL.ProjectID = cc.ProjectID
			AND FT_TBL.AnswerVerbatimID = @AnswerVerbatimID
	) AS A	
WHERE cc.ProjectID  = @ProjectID


Ругается:
Msg 102, Level 15, State 1, Line 16
Incorrect syntax near '+'.

Не нравится: 'FORMSOF(INFLECTIONAL,"' + k.Keyword + '")'
10 дек 12, 11:38    [13605166]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Потому что со времен 2000-го сервер не принимает в параметры функций выражения.
10 дек 12, 12:00    [13605356]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
Потому что со времен 2000-го сервер не принимает в параметры функций выражения.


Т.е. в моем случае нельзя применить CROSS APPLY?
10 дек 12, 12:04    [13605383]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Hel975
Т.е. в моем случае нельзя применить CROSS APPLY?

Причем тут CROSS APPLY?
10 дек 12, 12:04    [13605388]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
Hel975
Т.е. в моем случае нельзя применить CROSS APPLY?

Причем тут CROSS APPLY?


Тогда я не понимаю, как переписать мою конструкцию, чтобы она заработала.
10 дек 12, 12:07    [13605408]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Hel975
Тогда я не понимаю, как переписать мою конструкцию, чтобы она заработала.

Не передавать в функцию выражение. Передавать уже вычисленное значение этого выражения.
10 дек 12, 12:14    [13605454]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
Hel975
Тогда я не понимаю, как переписать мою конструкцию, чтобы она заработала.

Не передавать в функцию выражение. Передавать уже вычисленное значение этого выражения.


Вычисленное значение и означает цикл по таблице с кейвордами, т.е. как есть сейчас.
10 дек 12, 12:23    [13605571]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Hel975
Вычисленное значение и означает цикл по таблице с кейвордами, т.е. как есть сейчас.

Мда. Ну что тут скажешь. Логика железная
Раз нельзя сделать
select 'FORMSOF(INFLECTIONAL,"' + k.Keyword + '")' as x
FROM dbo.ProjectCodingKeyword k
то делайте цикл
10 дек 12, 12:26    [13605610]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Glory
Мда. Ну что тут скажешь. Логика железная
Раз нельзя сделать
select 'FORMSOF(INFLECTIONAL,"' + k.Keyword + '")' as x
FROM dbo.ProjectCodingKeyword k
то делайте цикл


Ну а дальше как его засунуть в CONTAINSTABLE? До меня не доходит.
10 дек 12, 15:51    [13607507]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Гость333
Member

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

Например, так?
SELECT k.ProjectCodingKeywordID, k.Keyword, cc.ProjectID 
FROM (SELECT *, 'FORMSOF(INFLECTIONAL,"' + Keyword + '")' AS Formsof_Keyword FROM dbo.ProjectCodingKeyword (NOLOCK)) k
	INNER JOIN ProjectCodingCode c (NOLOCK) ON k.ProjectCodingCodeID = c.ProjectCodingCodeID
	INNER JOIN ProjectCodingCategory cc (NOLOCK) ON c.ProjectCodingCategoryID = cc.ProjectCodingCategoryID
	CROSS APPLY (
		SELECT FT_TBL.AnswerVerbatimID 
		FROM vFFM_Verbatim_en AS FT_TBL 
			INNER JOIN
				CONTAINSTABLE(vFFM_Verbatim_en, Verbatim, k.Formsof_Keyword) AS KEY_TBL
				ON FT_TBL.AnswerVerbatimID = KEY_TBL.[KEY]
		WHERE FT_TBL.ProjectID = cc.ProjectID
			AND FT_TBL.AnswerVerbatimID = @AnswerVerbatimID
	) AS A	
WHERE cc.ProjectID  = @ProjectID
10 дек 12, 16:35    [13608000]     Ответить | Цитировать Сообщить модератору
 Re: FullTextSearch 2008 и обратная задача.  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1053
Гость333
Hel975,

Например, так?


Спасибо за попытку, но не работает. Выдает ошибку:
Msg 102, Level 15, State 1, Line 16
Incorrect syntax near 'k'.

И ругается на CONTAINSTABLE(vFFM_Verbatim_en, Verbatim, k.Formsof_Keyword) AS KEY_TBL

Подозреваю, что CONTAINSTABLE не поддерживает такой синтаксис. А вот такая конструкция работает:

SELECT *
FROM (
	SELECT 'FORMSOF(INFLECTIONAL,"' + k.Keyword + '")' as x, k.ProjectCodingKeywordID, cc.ProjectID 
	FROM dbo.ProjectCodingKeyword k 
		INNER JOIN ProjectCodingCode c (NOLOCK) ON k.ProjectCodingCodeID = c.ProjectCodingCodeID
		INNER JOIN ProjectCodingCategory cc (NOLOCK) ON c.ProjectCodingCategoryID = cc.ProjectCodingCategoryID
	WHERE cc.ProjectID  = @ProjectID
) AS B
	CROSS APPLY sys.dm_fts_parser (B.x, 1033, 0, 0) as p


Пока решила использовать ее, потом пожойню с моим текстом, выброшу только noise words.
10 дек 12, 16:40    [13608055]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить