2011-06-09 5 views
4

У меня есть таблица с полнотекстовым поиском, включенным в столбце Название. Я пытаюсь сделать взвешенный поиск с помощью stststable, но я получаю арифметическое переполнение для значения Rank. Запрос как следоватьSQL Server 2008 Containstable генерирует отрицательный ранг с помощью weighted_term

SELECT ID, CAST(Res_Tbl.RANK AS Decimal) AS Relevancy , Title 
    FROM table1 AS INNER JOIN 
    CONTAINSTABLE(table1,Title,'ISABOUT("pétoncle" weight (.8), "pétoncle" weight (.8), "PÉTONCLE" weight (.8))',LANGUAGE 1036) AS Res_Tbl 
    ON ID = Res_Tbl.[KEY] 

Когда я выполнить этот запрос, я получаю: Ошибка арифметического переполнения для типа INT, значение = -83886083125.000076.

Если я удалю один из двух ';' в функции ISABOUT запрос завершается успешно.

Обратите внимание, что при отсутствии результата запрос завершен успешно.

Кто-нибудь знает, как это решить?

Этот вопрос также находится на dba.stackexchange.com

+0

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

+0

Если я бросаю бросок, я получаю ту же ошибку. Проблема в функции CONTAINSTABLE. Я не могу предоставить вам какие-либо данные, потому что данные принадлежат моему клиенту. Я замечаю что-то, когда я манипулирую предикатом. Если я удалю один из специальных символов (&,#,;), запрос выполняется успешно. – Nico

ответ

1

Qualifier: Поскольку я не могу воссоздать это, я не могу знать наверняка, если это решит проблему. Однако, это некоторые вещи, которые я вижу.

Прежде всего, амперсанд, знак фунта и точки с запятой являются символами прерывания слова. Это означает, что вместо поиска строки «pтолько» то, что вы на самом деле ищете, это «p», «233» и «toncle». Понятно, что это не ваше намерение.

Должен предположить, что у вас есть текст «p & # 233; toncle» где-то в вашем наборе данных. Это означает, что вам нужно, чтобы вся строка была полной.

Есть несколько вещей, которые вы можете сделать.

1) Отключите все слова одновременно. Вы можете это сделать, изменив полный индекс текста, чтобы отключить его.

Обратите внимание, что вы должны быть база данных установлены в SQL Server 2008 СОВМЕСТИМОСТИ для этого не синтаксической ошибки:

ALTER FULLTEXT INDEX ON Table1 SET STOPLIST OFF; 

2) Создать новый stoplist

Если вы создаете пустой StopList , вы можете добавить нужные вам стоп-слова или скопировать стоп-лист системы и удалить ненужные временные слова. (Я бы посоветовал второй подход).

Сказав это, я не смог найти & или # в системном списке, поэтому они могут быть жестко закодированы. Возможно, вам придется просто отключить стоп-лист.

3) Измените свой поиск, чтобы проигнорировать «p# 233;

Если вы уронили "р & # 233; toncle" из ISABOUT и заменить их на "р toncle", она могла бы работать:

'ISABOUT("pétoncle" weight (.8), "p toncle" weight (.8))' 

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


Некоторые больше информации для исследующих удовольствия:

0

Для людей, попавших на эту страницу в поисках отрицательных результатов ранга, возвращенных SQL Server, как и я, получается, что c произойдет, если некоторые из ваших совпадений слишком велики (за пределами некоторого лимита символов). SQL Server на самом деле не будет жаловаться или не вызывать ошибки во время запроса, вместо этого ранжирование будет главным образом мусором, создающим отрицательный ранг для некоторых вариантов весов (в моем случае, например, с небольшими значениями веса в терминах с перекрытием). Ограничьте токен/длину слова и избегайте этой проблемы (возможно, ошибка внутри полнотекстового поиска SQL Server 2008).

Смежные вопросы