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