Вопрос

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

Итак, допустим, у вас есть объект Movie, и вы хотите, чтобы пользователь выполнял поиск по ключевым словам в заголовке и теле статьи, тогда мы проиндексируем столбцы «Заголовок» и «Сюжет», а затем сделаем что-то вроде:

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 Database Engine где тусуются люди, специализирующиеся на подобных вещах.

Вы можете комбинировать CONTAINS (или CONTAINSTABLE) с простыми условиями:

ВЫБЕРИТЕ * ИЗ фильмов ГДЕ СОДЕРЖИТ(Название, «Терминатор 2») и заголовок типа «%Терминатор 2%»

Пока СОДЕРЖИТ найти всех Терминаторов, место уничтожит «Терминатора 1».

Конечно, двигатель достаточно умен, чтобы запуститься с условием «СОДЕРЖИТ не подобное».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top