Определение точных совпадений из полнотекстового поиска SQL Server

Я использую полнотекстовый поиск SQL Server 2008 и присоединяюсь к FreeTextTable, чтобы определить ранжирование результатов.

Как определить, дает ли набор результатов точное совпадение?

Например, за один поиск я могу получить следующие результаты:

Manufacturer | Rank
===================

LG U300 ------- 102
LG C1100 ------ 54
LG GT505 ------ 18
LG KF300 ------ 18
LG Callisto --- 18
...

Разброс диапазона ранжирования предполагает, что один результат в подавляющем большинстве случаев более релевантен, чем все другие результаты, что указывает на то, что самый высокий результат, скорее всего, точно соответствует поисковому запросу.

Но при следующем поиске я могу получить такой результат:

Manufacturer | Rank
===================

LG C1100------- 33
LG GC900 ------ 31
LG GT500 ------ 31
LG KC910 ------ 31
LG KF310 ------ 31
...

Отсутствие разброса диапазона рангов в этом наборе результатов указывает на неточный результат поиска.

Как я могу вывести логическое значение в качестве дополнительного столбца в результатах, который указывает, указывает ли разброс ранга на точность результатов?

Спасибо!


person Community    schedule 15.08.2009    source источник


Ответы (3)


Вычислите процентную разницу между средним значением набора результатов и значением наивысшего ранга. Чем больше результат, тем выше вероятность точности совпадения.

Для первого набора результатов: (102-18) / 102 = 82,35%.

Затем установите базовый уровень в коде - например, если разброс больше 40%, вероятно, строка 1 содержит точный результат. Проведите несколько тестов по различным поисковым запросам, чтобы определить базовое значение.

person Community    schedule 15.08.2009

Вы можете выполнить дополнительные запросы, чтобы узнать, насколько ваше соответствие соответствует точному соответствию. Тогда вы можете принять ранг точного соответствия для эталонного теста за 100%.

DECLARE @Manufacturer varchar(500)
DECLARE @tManufacturer varchar(500)
DECLARE @maxRank int

SET @Manufacturer = 'your search term'

SELECT @tManufacturer=Manufacturer
FROM ManufacturerTable m
INNER JOIN FREETEXTTABLE(ManufacturerTable, Manufacturer, @Manufacturer, 1) AS KEY_TBL
ON m.ManufacturerID = KEY_TBL.[KEY]

if (@tManufacturer is null)
 SET @tManufacturer = @Manufacturer

SELECT @maxRank=Rank
FROM ManufacturerTable m
INNER JOIN FREETEXTTABLE(ManufacturerTable, Manufacturer, @tManufacturer, 1) AS KEY_TBL
ON m.ManufacturerID = KEY_TBL.[KEY]

SELECT Manufacturer, KEY_TBL.RANK*100/@maxRank as MatchRank
FROM ManufacturerTable m
INNER JOIN FREETEXTTABLE(ManufacturerTable, Manufacturer, @tManufacturer, 10) AS KEY_TBL
ON m.ManufacturerID = KEY_TBL.[KEY]

Предупреждение. В некоторых случаях может возникнуть MatchRank > 100, поэтому решение не является идеальным.

person Wojciech    schedule 28.05.2015

Вы, конечно, можете использовать дисперсию как индикатор «спреда», но я не думаю, что это правильный подход. (Особенно, если вы посмотрите только на первые n результатов.)

Актуальность - важная вещь в поиске информации. Это зависит от метода ранжирования, а также от вероятности появления поискового запроса, а также от релевантности других поисковых запросов. Что-то, что вы могли бы сделать:

Рассчитайте ожидаемое количество появлений (среднее количество) поискового запроса в случайном документе. Затем сравните количество появлений в возвращенном результате. Ваш рейтинг будет таким: counts-in-my-doc / mean-count. Документ актуален, если результат значительно выше 1.

person bayer    schedule 15.08.2009