Невозможно использовать предикат CONTAINS или FREETEXT для таблицы или индексированного представления, потому что он не индексируется полнотекстовым

98

В базе данных SQL Server 2008 R2 появляется следующая ошибка:

Невозможно использовать предикат CONTAINSили FREETEXTв таблице или индексированном представлении tblArmy, поскольку оно не индексируется полнотекстовым образом.

DotnetSparrow
источник
1
Вы действительно создали полнотекстовый каталог?
Alex K.

Ответы:

113
  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 см. Здесь, чтобы создать полнотекстовый индекс: stackoverflow.com/questions/10407337/…
Termato
71

Обходной путь для CONTAINS: Если вы не хотите создавать полнотекстовый индекс для столбца, а производительность не является одним из ваших приоритетов, вы можете использовать LIKEоператор, который не требует предварительной настройки:

Пример: найти все товары, содержащие букву Q:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'
Мохаммад Сепахванд
источник
1
ссылка . Предикат LIKE Transact-SQL работает только с шаблонами символов. Кроме того, вы не можете использовать предикат LIKE для запроса отформатированных двоичных данных. Более того, запрос LIKE к большому количеству неструктурированных текстовых данных выполняется намного медленнее, чем эквивалентный полнотекстовый запрос к тем же данным.
Манолис
3
Ах, сладко ... простой, обходной способ, который не требует от вас копаться в программе установки и возиться с настройками среды. Отлично сработано!
Кристина
21

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

Вместо этого вы можете использовать, LIKEчто даст вам мгновенные результаты без необходимости настраивать какие-либо настройки для таблиц.

Пример:

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

Тот же результат, полученный с помощью, CONTAINSможет быть получен с помощью LIKE.

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

Ашраф Абусада
источник
Это действительно умно
WonderWorker
6
Это хороший трюк, но формулировка этого ответа неверна. Не «просто используйте» это. Это может привести к серьезным последствиям для производительности, и любой, кто внедряет это в производственную систему, должен очень тщательно подумать о выполнении такого полного сканирования таблицы, как это, для неиндексированного столбца.
caesay
3

Возможно, вам потребуется включить таблицу для полнотекстового индексирования .

мелламокб
источник
включить / выключить Полнотекстовый поиск в контекстном меню неактивен. Думаю, мне нужно установить полнотекстовый поиск. Как установить полнотекстовый поиск?
DotnetSparrow
Запустите установку для SQL Server, и должна быть возможность изменить установленные компоненты (или что-то подобное). Щелкните это, затем установите флажок Полный текст в подходящее время, и все будет в порядке. Извините, у меня нет под рукой, иначе я бы дал более конкретные инструкции.
Tom H
@ Привет, Том: Я не видел возможности добавлять функции при запуске установщика SQL Server 2008 R2.
DotnetSparrow
1

вам необходимо добавить полнотекстовый индекс в определенные поля, в которых вы хотите выполнить поиск.

ALTER TABLE news ADD FULLTEXT(headline, story);

где "новости" - ваша таблица, а поля "заголовок, история", которые вы не хотите использовать для полнотекстового поиска.

SimonQuest
источник
1

Есть еще одно решение, чтобы установить для столбца Полный текст значение true.

Это решение, например, не сработало для меня

ALTER TABLE news ADD FULLTEXT(headline, story);

Мое решение.

  1. Щелкните правой кнопкой мыши по таблице
  2. дизайн
  3. Щелкните правой кнопкой мыши столбец, который вы хотите отредактировать
  4. Полнотекстовый указатель
  5. Добавить
  6. близко
  7. Обновить

СЛЕДУЮЩИЕ ШАГИ

  1. Щелкните правой кнопкой мыши по таблице
  2. дизайн
  3. Щелкните столбец, который вы хотите отредактировать
  4. Внизу mssql будет вкладка «Свойства столбца».
  5. Полнотекстовая спецификация -> (Полнотекстовая индексация) установлена ​​в значение true.

Обновить

Версия mssql 2014

Icet
источник
-1
Select * from table
where CONTAINS([Column], '"A00*"')  

будет действовать как% так же, как

where [Column] Like 'A00%'
Днянеш Миджагири
источник