#sql-server #sql-server-2005 #full-text-search
#sql-server #sql-server-2005 #полнотекстовый поиск
Вопрос:
Используя полнотекстовый поиск SQL Server 2005, я хотел бы возвращать значения в пределах% от результата максимальной релевантности для этого поиска.
SELECT
A.ActivityID,
KEY_TBL.Rank as Relevance,
DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank
FROM Activity A
INNER JOIN FREETEXTTABLE(vwActivitySearch, FTS,'My search expression') AS KEY_TBL ON A.ActivityID = KEY_TBL.[KEY]
ВОЗВРАТ:
ActivityID Relevance SearchRank
----------- ----------- --------------------
89378 242 1
89406 242 1
88083 236 2
88214 236 2
84007 197 3
83434 197 3
13017 172 4
89247 164 5
89346 164 5
Вместо возврата по рангу я хотел бы возвращать значения, превышающие 90% или некоторый произвольный процент от максимальной релевантности, поэтому в этом примере
WHERE Relevance>(242*0.9).
Я уверен, что есть простой способ добиться этого, но я его не вижу.
Некоторые ограничения —
- Запрос представляет собой выражение CTE в UDF.
- Я мог бы легко запустить начальный запрос, чтобы получить @MAXRelevance= SELECT MAX(релевантность)… затем используйте Max(релевантность) в предложении WHERE, но полнотекстовый поиск не гарантирует возврата одних и тех же абсолютных значений для результатов релевантности при повторных поисках.
Существующая функция:
CREATE FUNCTION [dbo].[xxActivitySearch] (@SearchTerm varchar(255)='',@ResultDepth int)
RETURNS @ReturnTable Table (ActivityID int,Relevance int,SearchRank int)
AS
BEGIN
WITH T AS (
SELECT
A.ActivityID,
KEY_TBL.Rank as Relevance,
DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank
FROM Activity A
INNER JOIN FREETEXTTABLE(vwActivitySearch, FTS,@SearchTerm) AS KEY_TBL ON A.ActivityID=KEY_TBL.[KEY])
INSERT @ReturnTable SELECT * FROM T WHERE (SearchRank<=@ResultDepth)
RETURN
END
Комментарии:
1. Не могли бы вы добавить второй CTE, который выполнял бы SELECT ActivityId, Relevance, SearchRank ИЗ FirstCTE, ГДЕ релевантность> (242 * 0.9) и использовал это в качестве CTE для основного запроса?
2. Хороший момент, Уэйн, который помог мне переориентироваться на это. В результате я решил непосредственную проблему, выполнив нечто очень похожее. Однако я все еще думаю, что должен быть какой-то способ достичь этого в одном запросе, и я просто упускаю трюк. С нетерпением ожидая будущих проектов, я подозреваю, что новые аналитические функции SQL Server Denali msdn.microsoft.com/en-us/library/hh213234 (v= SQL.110).aspx будет большим подспорьем в решении проблем такого типа.
3. Я уверен, что есть и такое. Я продолжу проводить некоторые исследования, поскольку мне интересно решить аналогичную задачу.
Ответ №1:
WITH T AS
(
SELECT A.ActivityID,
KEY_TBL.Rank as Relevance,
DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank,
MAX(KEY_TBL.Rank) OVER() AS MaxRelevance
FROM Activity A
INNER JOIN
FREETEXTTABLE(vwActivitySearch, FTS, 'My search expression') AS KEY_TBL
ON A.ActivityID = KEY_TBL.[KEY]
)
SELECT ActivityID,
Relevance,
SearchRank
FROM T
WHERE Relevance>(MaxRelevance*0.9)
Комментарии:
1. Именно тот ответ, который я искал!