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

Откуда: Москва
Сообщений: 89
Где можно почитать о том, как рассчитывается ранг в полнотекстовом поиске с примерами и, желательно, на русском?
Читал это, но примеров там нет.
Или может быть кто-нибудь может объяснить на примере?
14 дек 11, 17:33    [11766276]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
How Search Query Results Are Ranked
14 дек 11, 18:12    [11766652]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
grigrim
Member

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

по содержимому ваша ссылка практически аналогична моей. И там, опять же, примера нет.
Тем временем нашёл аналог приведённой статьи на русском. Хотя снова без примера.

Так что вопрос всё ещё актуален.
14 дек 11, 18:19    [11766737]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
grigrim,

Вы спрашивали "как расчитывается". По привденной ссылке для каждой из указанных функций приведен алгоритм расчета ранка, например

StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )

для CONTAINSTABLE. Этого недостаточно?
14 дек 11, 18:23    [11766758]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
grigrim
Member

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

я спрашивал "как рассчитывается ... с примерами".

А формулу эту я видел, но не смог до конца осознать, к сожалению. Можете на примере объяснить её?
14 дек 11, 18:31    [11766802]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
grigrim,

Простите, на примере чего?! Пример ранжирования на паре записей не покажешь. Не хотите сами построить полнотекстовый индекс и "погонять запросы"?
14 дек 11, 20:24    [11767431]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
grigrim
Member

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

индекс уже построен. Я хочу понять как, в зависимости от чего, производится ранжирование возвращённых CONTAINSTABLE записей.

Например, есть проиндексированная вьюха, по ней построен полнотекстовый каталог.
Во вьюхе два поля: первичный ключ ID и текстовое поле для поиска SearchText.
Какой ранг записи должен быть, если:
- всего в каталоге записей, скажем, 7500;
- CONTAINSTABLE(viewName, *, '"книга*" & "автор*"') вернул 170 записей;
- в рассматриваемой записи 20 слов;
- из них на подстроку "книга" начинаются 3 слова, а на подстроку "автор" начинаются 2 слова?
Этих параметров достаточно для рассчёта ранга или нужно знать что-то ещё?
14 дек 11, 20:44    [11767532]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Какой ранг записи должен быть, если


Еще раз внимательно посмотрите на формулу. Там чуть больше параметров для расчета, чем Вы привели. Да и по большому счет значение ранка (абсолютное значение), не несет никакой "смысловой нагрузки", ибо основное его предназначение это сравнение для упорядочивания и получения TOP N.

ЗЫ. Вопрос носит какой-то практический смысл?
14 дек 11, 21:03    [11767622]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
grigrim
Member

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

в формуле, насколько я понимаю, больше всего на 1 параметр, чем я привёл. Это MaxQueryRank, который, по сути, является константой и равен максимально возможному значению ранка: 1000.

Опишу предысторию и для чего вообще мне это всё нужно.
Изначально была проиндексированная вьюха, в которой так же был первичный ключ ID, но вместо одного текстового поля было несколько. Ну, допустим, вместо SearchText были текстовые поля BookName и AuthorName. Но такой подход затрудняет поиск, когда пользователь хочет найти книгу определённого автора (у пользователя только одно поле для ввода). Получается, мы можем найти либо только книгу, либо только автора.
Как решение этой проблемы я попробовал "слепить" два текстовых поля в одно. Но тут некоторые запросы стали выдавать менее релевантные результаты.
Если есть возможность указать серверу, что результаты, найденные в поле BookName важнее тех, которые найдены в поле AuthorName, то это как раз что надо.
14 дек 11, 21:43    [11767772]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
grigrim
Если есть возможность указать серверу, что результаты, найденные в поле BookName важнее тех, которые найдены в поле AuthorName, то это как раз что надо.
Непонятно, как этому поможет знание формулы расчёта...

Можно просто делать 2 поиска по отдельности по 2-м полям, объединяя результаты с умножением rank на какой то коэффициент.
14 дек 11, 23:17    [11768050]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
grigrim
Member

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

если делать 2 поиска по отдельности по двум полям, то по запросу
DECLARE @szSearchText_ VARCHAR(100) = '"ремарк*" & "перемен*"'

SELECT B.ID, B.BookName, A.AuthorName
FROM
(	SELECT ID, BookName
	FROM viewName
	WHERE CONTAINS (BookName, @szSearchText_)
) B
INNER JOIN
(	SELECT ID, AuthorName
	FROM viewName
	WHERE CONTAINS (AuthorName, @szSearchText_)
) A ON B.ID = A.ID
не найдётся следующая запись:
IDBookNameAuthorName
1Эрих Мария РемаркНа западном фронте без перемен
15 дек 11, 00:48    [11768227]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
grigrim
не найдётся следующая запись:
Понятно.

Но к сожалению устанавливать веса или менять формулы не получится, нет такой функциональности, знание формул по любому не поможет :-(

Можно только сделать свой поиск, см. http://www.gotdotnet.ru/blogs/DeColores/1914/
15 дек 11, 09:45    [11768850]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование в полнотекстовом поиске  [new]
grigrim
Member

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

я предположил, что если, например, увеличить количество упоминаний BookName в текстовом поле SearchText:
SELECT ID, REPLICATE(BookName+' ', 5)+AuthorName AS SearchText
FROM viewName
, то это могло бы увеличить ранг. Но оказалось, всё не так просто. Поэтому и стал интересоваться формулой для понимания, что нужно изменить, чтобы повлиять на ранжирование.
15 дек 11, 11:52    [11769804]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить