Полнотекстовый поиск SQL Server содержит проблему фразы - PullRequest
3 голосов
/ 09 сентября 2010

У меня проблема с полнотекстовым поиском SQL Server 2008. У меня следующий запрос

SELECT *
FROM cigars
WHERE CONTAINS(cigars.*, @Search )

@ Поиск - это значение, которое передается через хранимую процедуру. Но это не проблема.

Что если кто-то ищет, скажем, «Удар», он работает нормально, и я получаю все сигары, которые соответствуют.

Проблема заключается в том, что, если они ищут «Punch Cigar», я получаю эту ошибку.

Синтаксическая ошибка рядом с «Сигара» в полнотекстовом поиске «Удар Сигары».

Есть идеи о том, как я могу заставить его искать эту фразу?

Ответы [ 2 ]

4 голосов
/ 09 сентября 2010

Почему вы ищете по всем столбцам в таблице CIGAR? Конечно, некоторые из них не используют строковый / текстовый тип данных ...

После просмотра документации CONTAINS я бы посмотрел на функцию, которая правильно экранирует слова для поиска в FTS:

CREATE FUNCTION [dbo].[escapeFTSSearch] (
  @SearchParameter NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
  -- Declare the return variable here
  DECLARE @result NVARCHAR(MAX)

  SELECT @result = '"'+ REPLACE(REPLACE(@SearchParameter,'"',''), ' ', '" AND "') +'"'

  -- Return the result of the function
  RETURN @result

END

Тест:

SELECT [example].[dbo].[escapeFTSSearch] ('Punch Cigar')

... что дает мне:

"Punch" AND "Cigar"

Использование:

WHERE CONTAINS(cigars.*, dbo.escapeFTSSearch(@Search) )

Добавление

Функция упрощенная:

  • предполагается, что вам нужны все слова
  • не поддерживает нечеткий поиск
  • предполагает, что двойные кавычки отсутствуют в значении параметра

Твик по мере необходимости.

1 голос
/ 09 сентября 2010

Вы должны убедиться, что у вас есть начальные и конечные двойные кавычки и пробелы. то есть значение @Search должно быть «Punch Cigar»

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

declare @Search varchar(1000)
set @Search = 'punch and" cigar'

set @Search = ' "' + REPLACE(@Search,'"','') + '" '

select * from sys.dm_fts_parser(@Search,1033,null,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...