Не можна використовувати предикат CONTAINS або FREETEXT у таблиці або індексованому поданні, оскільки він не індексований повнотекстовим


96

У моїй базі даних SQL Server 2008 R2 з’являється така помилка:

Не вдається використати CONTAINSабо FREETEXTпредикат у таблиці або індексованому поданні 'tblArmy', оскільки він не індексований повнотекстом.


1
Ви насправді створили повнотекстовий каталог?
Alex K.

Відповіді:


112
  1. Переконайтеся, що у вас встановлена ​​функція повнотекстового пошуку.

    Налаштування повнотекстового пошуку

  2. Створіть повнотекстовий каталог пошуку.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
    
  3. Створіть повнотекстовий індекс пошуку.

     create fulltext index on Production.ProductDescription(Description)
     key index PK_ProductDescription_ProductDescriptionID
    

    Перш ніж створювати індекс, переконайтеся:
    - у вас ще немає повнотекстового індексу пошуку в таблиці, оскільки в таблиці дозволений лише один повнотекстовий індекс пошуку - в таблиці
    існує унікальний індекс. Індекс повинен базуватися на одноклавішному стовпці, який не допускає значення NULL.
    - існує повнотекстовий каталог. Повнотекстовий каталог каталогу потрібно вказати явно, якщо немає повнотекстового каталогу за замовчуванням.

Ви можете виконати кроки 2 і 3 у SQL Sever Management Studio. У провіднику об’єктів клацніть правою кнопкою миші на таблиці, виберіть пункт Full-Text indexменю, а потім пункт Define Full-Text Index...підменю. Майстер повнотекстової індексації проведе вас через процес. Він також створить для вас повнотекстовий каталог пошуку, якщо у вас його ще немає.

введіть тут опис зображення

Ви можете знайти більше інформації на MSDN


Хороша інформація Алекс! ПРИМІТКА: для тих, хто використовує Azure SQL, він зараз не підтримує таблицю з вмістом. Дивіться тут: msdn.microsoft.com/library/azure/ee336253.aspx
Termato

Крім того , при використанні SQL Express Advanced Services, дивіться тут , щоб створити повний текст Індекс: stackoverflow.com/questions/10407337 / ...
Termato

70

Вирішення для CONTAINS: Якщо ви не хочете створювати повнотекстовий індекс у стовпці, і продуктивність не є одним із ваших пріоритетів, ви можете використовувати LIKEоператор, який не потребує попередньої конфігурації:

Приклад: знайти всі Товари, що містять літеру Q:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'

1
посилання . LIKE Transact-SQL предикат працює лише на шаблонах символів. Крім того, ви не можете використовувати предикат LIKE для запиту відформатованих двійкових даних. Крім того, запит LIKE щодо великої кількості неструктурованих текстових даних набагато повільніший, ніж еквівалентний повнотекстовий запит щодо тих самих даних.
Маноліс

2
Ах, солодке ... простий, круговий спосіб, який не вимагає від вас викопати програму встановлення та займатися вашими налаштуваннями навколишнього середовища. Молодці!
Крістін

21

Ви повинні визначити Full-Text-Indexв усіх таблицях бази даних, де вам потрібно використовувати запит, CONTAINSякий займе якийсь час.

Натомість ви можете скористатися таким, LIKEякий дасть вам миттєві результати без необхідності регулювати будь-які налаштування для таблиць.

Приклад:

SELECT * FROM ChartOfAccounts WHERE AccountName LIKE '%Tax%'

Той самий результат, отриманий за допомогою, CONTAINSможна отримати за допомогою LIKE.

див. результат: введіть тут опис зображення


Це дуже розумно
WonderWorker

6
Це приємний фокус, але спосіб формулювання цієї відповіді неправильний. Не "просто використовуйте" це. Для цього є кілька серйозних наслідків для продуктивності, і кожен, хто вводить це у виробничу систему, повинен дуже ретельно подумати про те, щоб виконати такі повні сканування таблиць у неіндексованому стовпці.
cesay

3

увімкнути / вимкнути Повнотекстовий пошук у контекстному меню неактивний. Думаю, мені потрібно встановити повнотекстовий пошук. Як я можу встановити повнотекстовий пошук?
DotnetSparrow

Запустіть інсталяцію для SQL Server, і має бути можливість зміни встановлених компонентів (або щось подібне). Клацніть це, а тоді встановіть прапорець Повний текст у відповідний час, і ви повинні бути добре. Вибачте, у мене немає одного підручного, або я б дав більш конкретні вказівки.
Tom H

@Hi Tom: Я не бачив можливості додавання функцій під час запуску інсталятора SQL Server 2008 R2.
DotnetSparrow

1

Вам потрібно додати повнотекстовий індекс до певних полів, які потрібно шукати.

ALTER TABLE news ADD FULLTEXT(headline, story);

де "новини" - це ваша таблиця та поля "заголовок, історія", які ви зазвичай не вмикаєте для повнотекстового пошуку


1

Існує ще одне рішення, як встановити значення True text для стовпця Повний текст.

Наприклад, це рішення для мене не працювало

ALTER TABLE news ADD FULLTEXT(headline, story);

Моє рішення.

  1. Клацніть правою кнопкою миші на таблиці
  2. Дизайн
  3. Клацніть правою кнопкою миші на стовпець, який ви хочете відредагувати
  4. Повнотекстовий покажчик
  5. Додати
  6. Закрити
  7. Оновити

НАСТУПНІ КРОКИ

  1. Клацніть правою кнопкою миші на таблиці
  2. Дизайн
  3. Клацніть на стовпець, який потрібно редагувати
  4. У нижній частині mssql у вас буде вкладка "Властивості стовпця"
  5. Повнотекстова специфікація -> (Повнотекстовий індекс індексується) має значення true.

Оновити

Версія mssql 2014


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.