Сделать индекс SQL Server небольшим.
-
09-06-2019 - |
Вопрос
Мы используем 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».
Конечно, двигатель достаточно умен, чтобы запуститься с условием «СОДЕРЖИТ не подобное».