Сделать индекс SQL Server маленьким числом - PullRequest
6 голосов
/ 16 сентября 2008

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

Ответы [ 3 ]

2 голосов
/ 16 сентября 2008

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

0 голосов
/ 24 сентября 2008

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

SELECT * FROM Movies, ГДЕ СОДЕРЖИТ (Заголовок, «Терминатор 2») и Заголовок как «% Терминатор 2%»

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

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

0 голосов
/ 17 сентября 2008

Я знал о файле шумовых слов, но я не уверен, что ваш пример «Терминатора 2» все еще вызывает у вас проблемы. Возможно, вы захотите спросить об этом на форуме MSDN Database Engine , на котором тусуются люди, специализирующиеся на подобных вещах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...