Сделайте индекс SQL Server маленькими числами

Мы используем 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 (нейтральный), восстановил индексы и попытался выполнить поиск.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
2 329
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Эти «маленькие слова» считаются «шумовыми словами» по полному текстовому индексу. Вы можете настроить список шумовых слов. Этот Сообщение блога предоставляет более подробную информацию. При изменении файла шумовых слов вам необходимо повторно заполнить свой полнотекстовый индекс.

Я знал о файле шумовых слов, но я не понимаю, почему ваш пример "Терминатора 2" все еще вызывает проблемы. Вы можете попробовать спросить об этом на Форум по ядру СУБД MSDN, где тусуются люди, специализирующиеся на подобных вещах.

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

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

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

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

Другие вопросы по теме