Кажется, работает очень хорошо, но я буду внимательно следить за производительностью.

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

Я использую предикат CONTAINS для поиска в полях. Перед передачей строки поиска я делаю следующее:

SET @ftQuery = '"' + REPLACE(@query,' ', '*" OR "') + '*"'

изменениязамок в"* * ИЛИ" замок * ", например. Это необходимо, потому что я хочу, чтобы люди могли искать насаз и получить результаты длязамок.

WHERE CONTAINS(Building.Name, @ftQuery) OR CONTAINS(Road.Name, @ftQuery)

Проблема в том, что теперь, когда я добавил к концу каждого слова подстановочный знак, слова-шумы (например,) также добавлены символы подстановки и, следовательно, больше не отображаются как выпадающие. Это означает, что поискзамок вернет элементы со словами, такими кактеатр и т.п.

Первым делом я подумал об изменении ИЛИ на И, но, похоже, это просто не возвращает совпадений, если в запросе используется слово-шум.

Все, чего я пытаюсь добиться, - это позволить пользователю вводить несколько разделенных пробелами слов, которые представляют либо полноту, либо префикс слов, по которым он ищет, в любом порядке - и отбрасывать шумовые слова, такие как от их ввода (в противном случае, когда они ищутзамок они получают большой список предметов с результатом, который им нужен где-то посередине списка.

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

Благодарен за любую помощь!

Джейми

Ответы на вопрос(4)

Несмотря на то, что я хочу использовать полнотекстовое индексирование для его способности выполнять выделение, его скорость и поиск по нескольким словам и т. Д., Я фактически индексирую только пару полей nvarchar (100) в двух таблицах. Каждая таблица легко останется ниже 50000 строк.

Мое решение состояло в том, чтобы удалить все шумовые слова из текстового файла и позволить индексатору составить индекс, включая все слова. Он все еще состоит из нескольких тысяч записей.

Затем я заменяю пробелы в строке поиска, как описано в моем исходном сообщении, чтобы заставить CONTAINS работать над несколькими словами и подбирать слова по отдельности.

Кажется, работает очень хорошо, но я буду внимательно следить за производительностью.

Решение Вопроса

но написать запрос, который выполняет поиск по стоп-слову. Если вы ДЕЙСТВИТЕЛЬНО хотите включить это поведение, вам нужно отредактировать список стоп-слов. (http://msdn.microsoft.com/en-us/library/ms142551.aspx), а затем пересоздать свой индекс.

Вот рабочая функция. ФайлnoiseENU.txt копируется как есть\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData .

    Public Function StripNoiseWords(ByVal s As String) As String
        Dim NoiseWords As String = ReadFile("/Standard/Core/Config/noiseENU.txt").Trim
        Dim NoiseWordsRegex As String = Regex.Replace(NoiseWords, "\s+", "|") ' about|after|all|also etc.
        NoiseWordsRegex = String.Format("\s?\b(?:{0})\b\s?", NoiseWordsRegex)
        Dim Result As String = Regex.Replace(s, NoiseWordsRegex, " ", RegexOptions.IgnoreCase) ' replace each noise word with a space
        Result = Regex.Replace(Result, "\s+", " ") ' eliminate any multiple spaces
        Return Result
    End Function

к идентификаторов языков:http://msdn.microsoft.com/en-us/library/ms190303.aspx

Dim queryTextWithoutNoise As String = removeNoiseWords (queryText, ConnectionString, 1033)

Открытая функция removeNoiseWords (ByVal inputText как строка, ByVal cnStr как строка, ByVal languageID как целое число) как строка

    Dim r As New System.Text.StringBuilder
    Try
        If inputText.Contains(CChar("""")) Then
            r.Append(inputText)
        Else
            Using cn As New SqlConnection(cnStr)

                Const q As String = "SELECT display_term,special_term FROM sys.dm_fts_parser(@q,@l,0,0)"
                cn.Open()
                Dim cmd As New SqlCommand(q, cn)
                With cmd.Parameters
                    .Add(New SqlParameter("@q", """" & inputText & """"))
                    .Add(New SqlParameter("@l", languageID))
                End With
                Dim dr As SqlDataReader = cmd.ExecuteReader
                While dr.Read
                    If Not (dr.Item("special_term").ToString.Contains("Noise")) Then
                        r.Append(dr.Item("display_term").ToString)
                        r.Append(" ")
                    End If
                End While
            End Using
        End If
    Catch ex As Exception
        ' ...        
    End Try
    Return r.ToString

End Function

Ваш ответ на вопрос