Мы используем SQL Server 2005 в проекте. Пользователи системы имеют возможность искать некоторые объекты с помощью «ключевых слов». Мы реализуем это путем создания полнотекстового каталога для значимых столбцов в каждой таблице, которые могут содержать эти «ключевые слова», а затем с помощью CONTAINS для поиска ключевых слов, которые пользователь вводит в поле поиска в этом индексе.
Так, например, предположим, что у вас есть объект Movie, и вы хотите, чтобы пользователь мог искать ключевые слова в заголовке и теле статьи, тогда мы индексируем столбцы Title и Plot, а затем делаем что-то вроде:
SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)
(На самом деле он немного более продвинутый, но ничего ужасно сложного)
Некоторые пользователи добавляют числа в свой поиск, например, они хотят найти «Терминатор 2». Проблема здесь в том, что, насколько мне известно, по умолчанию SQL Server не индексирует короткие слова, поэтому поиск выполняется следующим образом:
SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')
фактически эквивалентно этому:
SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'
и мы получаем множество ложных результатов.
Есть ли способ заставить SQL Server индексировать маленькие слова? Предпочтительно, я бы предпочел индексировать только числа, например 1, 2, 21 и т. д. Я не знаю, где определить критерии индексации, и даже если это возможно, быть таким конкретным.
Что ж, я сделал это, удалил «шумовые слова» из списка, и теперь поведение немного другое, но все же не то, что вы ожидали.
Поиск не будет для "Терминатора 2" (я просто выдумываю, мой работодатель может быть не очень доволен, если я раскрою, что мы делаем ... в любом случае, термины немного другие, но принцип тот же) , Я не получаю что-либо, но знаю, что есть объекты, содержащие эти два слова.
Может я что не так делаю? Я удалил все числа 1 ... 9 из моей конфигурации шума для ENG, ENU и NEU (нейтральный), восстановил индексы и попытался выполнить поиск.





Эти «маленькие слова» считаются «шумовыми словами» по полному текстовому индексу. Вы можете настроить список шумовых слов. Этот Сообщение блога предоставляет более подробную информацию. При изменении файла шумовых слов вам необходимо повторно заполнить свой полнотекстовый индекс.
Я знал о файле шумовых слов, но я не понимаю, почему ваш пример "Терминатора 2" все еще вызывает проблемы. Вы можете попробовать спросить об этом на Форум по ядру СУБД MSDN, где тусуются люди, специализирующиеся на подобных вещах.
Вы можете комбинировать CONTAINS (или CONTAINSTABLE) с простыми условиями where:
ВЫБРАТЬ * ИЗ фильмов, ГДЕ СОДЕРЖИТ (Заголовок, «Терминатор 2») и Заголовок, например «% Терминатор 2%»
Пока СОДЕРЖИТ, найдите всех Терминаторов, где устраните «Терминатора 1».
Конечно, двигатель достаточно умен, чтобы запускаться с СОДЕРЖИТ, а не в таком состоянии.