Ограничение количества результатов полнотекстового поиска с использованием функции RANK

Tsql теория > Ограничение количества результатов полнотекстового поиска с использованием функции RANK
14.02.2013 11:14:35



Статья:

Функции CONTAINSTABLE и FREETEXTTABLE возвращают столбец с именем RANK, содержащий порядковые номера от 0 до 1000 (ранжирующие значения). Эти значения используются для ранжирования возвращенных строк согласно их соответствию критерию выбора. Ранжирующие значения указывают только относительный порядок релевантности строк в результирующем наборе, при этом чем меньше значение, тем меньше релевантность. Фактические значения несущественны и, как правило, различны для каждого выполнения запроса.

Примечание Примечание

Запросы, использующие предикаты CONTAINS и FREETEXT, не возвращают ранжирующие значения.

Число элементов, совпадающих с условиями поиска, часто бывает очень велико. Чтобы запросы CONTAINSTABLE и FREETEXTTABLE не возвращали слишком много соответствий, следует использовать необязательный параметр top_n_by_rank, в результате чего будет возвращаться только подмножество строк.top_n_by_rank — это целочисленное значение n, указывающее, что следует возвратить только n совпадений с самым высоким рангом в нисходящем порядке. Если параметр top_n_by_rank скомбинирован с другими параметрами, то запрос может вернуть меньше строк, чем фактически соответствует всем предикатам.

SQL Server упорядочивает соответствия по рангу и возвращает заданное число строк. Это может привести к значительному повышению производительности.Например, запрос, обычно возвращающий 100 000 строк из таблицы с миллионом строк, обрабатывается гораздо быстрее, если запросить всего 100 строк с наивысшими ранжирующими значениями.

ПРИМЕР- вернёт максимум 300 записей

 SELECT h2.name AS [names], h.name AS [problems],h.id AS id2,h.id , h.createdat,h2.id AS [problim_id],K.RANK FROM [База_Решений] h(NOLOCK)
JOIN [База_Знаний] h2 ON h2.id=h.[ключ_базы]
INNER JOIN
CONTAINSTABLE(База_Решений, (name,[Описание]), 'insert',
300) AS K
ON h.id= K.[KEY]


SELECT h2.name AS [names], h.name AS [problems],h.id AS id2,h.id , h.createdat,h2.id AS [problim_id],K.RANK FROM [База_Решений] h(NOLOCK)
JOIN [База_Знаний] h2 ON h2.id=h.[ключ_базы]
INNER JOIN
FREETEXTTABLE(База_Решений, (name,[Описание]), 'select',
300) AS K
ON h.id= K.[KEY]