Метод ранжирования, используемый SQL Server для полнотекстового индексирования.

У меня возникли проблемы с ранжированием, используемым полнотекстовым поиском в SQL Server.

Предположим, пользователь ищет два слова «foo bar». Мы предполагаем, что пользователь намеревается выполнить поиск по ИЛИ, поэтому мы передаем «foo OR bar» в наш вызов CONTAINSTABLE. Мы обнаружили, что строка, которая содержит «foo» 10 раз, но не содержит «bar», будет иметь гораздо более высокий ранг, чем строка, в которой есть и «foo», и «bar». Мы хотели бы, чтобы строка, в которой есть оба термина, была предпочтительнее строки, в которой несколько раз встречается только один термин. Любые советы о том, как этого добиться?

Я нашел документацию, связанную с модификатором RANKMETHOD, но, похоже, она предназначена только для поиска SQL Enterprise и недоступна при обычной установке SQL Server 2005. Мы также могли бы переключиться на Lucene.Net, но я надеюсь убедиться, что у него лучший рейтинг. Мы также можем выполнять многократный поиск и объединять результаты, но это кажется нежелательным, поскольку количество искомых слов увеличивается.


person Frank Schwieterman    schedule 28.10.2008    source источник


Ответы (4)


RANKMETHOD недоступен ни для одной версии SQL Server. Если вы создаете ключевые слова для перехода в поиск CONTAINSTABLE и знаете что-то о том, какие слова были более «важными», вы можете ранжировать слова с помощью ISABOUT и WEIGHT.

Например, если foo имеет более высокий ранг, чем bar, вы можете сделать что-то вроде этого:

SELECT * FROM CONTAINSTABLE (YourFullTextTable, *, 'ISABOUT ("foo" ВЕС (0,5), "bar" ВЕС (0,3))')

person Coolcoder    schedule 02.12.2008

Попробуйте переписать запрос SELECT * FROM CONTAINSTABLE (YourFullTextTable, *, '"foo bar" или "foo" ~ "bar" или "foo or bar"'). По сути, этот запрос должен ранжировать любые записи с точным «foo bar» > «foo» рядом с «bar» > foo или bar.

person TestCheck    schedule 23.12.2009

Я провел краткое обсуждение инвертированных индексов и косинусного ранжирования (основные алгоритмы и структуры данных полнотекстовых поисковых систем) Здесь.

При чисто косинусном ранжировании foo (1), bar (1) должен быть ближе к вектору, занимаемому foo, bar, чем foo (10), bar (0). Можно изменить значение косинуса постфактум, что, по сути, и делает Pagerank. Если полнотекстовый поиск изменяет ранжирование косинуса после вычисления скалярного произведения, а не взвешивания осей, это объясняет непропорциональное значение foo.

person ConcernedOfTunbridgeWells    schedule 28.10.2008

Просто чтобы продолжить это. Причина, по которой рейтинг был низким для строк, содержащих строки A и B, при сопоставлении со строкой «A или B», заключается в том, что A находился в другом столбце, чем B. Если я создаю представление в таблице, которая объединяется эти столбцы в один столбец, ранжирование для «A или B» больше, чем я ожидал.

person Frank Schwieterman    schedule 10.11.2008