SQL Server 2008 Containtable генерирует отрицательный рейтинг с помощью weighted_term - PullRequest
4 голосов
/ 10 июня 2011

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

 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

Ответы [ 2 ]

1 голос
/ 18 августа 2011

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

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

Я должен предположить, что у вас есть текст "pétoncle" где-то в вашем наборе данных. Это означает, что вам нужно, чтобы вся эта строка была завершена.

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

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

Обратите внимание, что для вашей базы данных должна быть установлена ​​совместимость с SQL Server 2008, чтобы не генерировать синтаксическую ошибку:

ALTER FULLTEXT INDEX ON Table1 SET STOPLIST OFF;

2) Создать новый стоп-лист

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

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

3) Измените свой поиск, чтобы игнорировать регистр "pétoncle".

Если вы отбросите «pétoncle» из ISABOUT и измените их на «p toncle», это может сработать:

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

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


Еще немного информации для вашего удовольствия от исследования:

0 голосов
/ 20 декабря 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...