SQL 2005 Полнотекстовый поиск: как по умолчанию для всех пользовательских слов поиска использовать поиск FTS типа CONTAINS NEAR - PullRequest
1 голос
/ 28 января 2010

У меня есть веб-страница asp.net с простым текстовым полем поиска, которое возвращает совпадающие строки из базы данных MSSQL 2005. В настоящее время он использует оператор LIKE для возврата совпадений, но вынуждает пользователя вводить точную фразу. Пользователи хотят больше поисковых запросов Google, и поэтому я решил настроить и проиндексировать необходимые таблицы с помощью FTS.

Я бы хотел, чтобы пользовательское слово для поиска использовалось в поиске CONTAINS, а NEAR отделяло каждое слово, которое они вводят, в текстовое поле. Я новый разработчик и не знаю, как это сделать, или если уже есть встроенная функция для этого.

Так, например, если пользователь вводит «Сойер Том» в поле поиска, запрос должен работать следующим образом:

ВЫБЕРИТЕ BookID, BookTitle ОТ tblBooks ГДЕ СОДЕРЖИТСЯ (BookTitle, «Сойер РЯДОМ Том»)

И возврат:

12032 Приключения Тома Сойера

В настоящее время, используя имеющееся у меня утверждение like, пользовательский поиск не найдет совпадений.

Если пользователь вводит просто Сойер, запрос должен работать просто так:

ВЫБРАТЬ BookID, BookTitle ОТ tblBooks ГДЕ СОДЕРЖИТСЯ (BookTitle, «Сойер»)

Возвращение:

12032 Приключения Тома Сойера 72192 Buz Sawyer Роя Крейна: Война на Тихом океане (Том 1)

Мой текущий код просто вставляет строку поиска в запрос следующим образом:

ВЫБРАТЬ BookID, BookTitle ОТ tblBooks ГДЕ СОДЕРЖИТСЯ (BookTitle, @Search)

Что, очевидно, не работает. Как я могу отделить каждое слово автоматически с помощью NEAR?

Заранее большое спасибо за любую помощь, которую вы можете оказать!

-Давид

1 Ответ

0 голосов
/ 28 января 2010

Сначала вам нужно разделить входную переменную @Search на слова.

Вот сообщение в блоге с UDF, которое выполнит это:

T-SQL, чтобы разбить варчар на слова

Далее вы просматриваете каждое возвращенное слово и объединяете каждое слово с запросом NEAR.

Примерно так:

declare @words as TABLE(wordNum int identity primary key, word nvarchar(max))

insert into @words select [value] from  dbo.SplitWords('my dog has fleas')

declare @wordCount int
select @wordCount = COUNT(*) from @words

declare @searchString nvarchar(max)
set @searchString = ''

declare @thisWord nvarchar(max)
set @thisWord = ''

declare @i int
set @i = 1
WHILE @i <= @wordCount
BEGIN
    select @thisWord = word from @words where wordNum = @i
    if @i = @wordCount
        select @searchString = @searchString + @thisWord
    else
        select @searchString = @searchString + @thisWord + ' NEAR '
    SET @i = @i + 1
END
...