web-dev-qa-db-fra.com

Impossible d'utiliser un prédicat CONTAINS ou FREETEXT sur une table ou une vue indexée car il n'est pas indexé en texte intégral

Je reçois une erreur de suivi dans ma base de données SQL Server 2008 R2:

Impossible d'utiliser un prédicat CONTAINS ou FREETEXT sur la vue indexée ou table 'tblArmy' car il n'est pas indexé en texte intégral.

70
DotnetSparrow
  1. Assurez-vous que la fonctionnalité de recherche en texte intégral est installée.

    Full-Text Search setup

  2. Créer un catalogue de recherche en texte intégral.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
    
  3. Créer un index de recherche en texte intégral.

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

    Avant de créer l'index, assurez-vous que:
    - vous ne disposez pas déjà d'un index de recherche en texte intégral sur la table, car un seul index de recherche en texte intégral est autorisé sur une table
    - un index unique existe sur la table. L'index doit être basé sur une colonne à clé unique, qui n'autorise pas NULL.
    - le catalogue de texte intégral existe. Vous devez spécifier explicitement le nom du catalogue de texte intégral s'il n'y a pas de catalogue de texte intégral par défaut.

Vous pouvez effectuer les étapes 2 et 3 dans SQL Sever Management Studio. Dans l'explorateur d'objets, cliquez avec le bouton droit sur une table, sélectionnez Full-Text index élément de menu puis Define Full-Text Index... élément de sous-menu. L'assistant d'indexation de texte intégral vous guidera tout au long du processus. Il créera également un catalogue de recherche en texte intégral si vous n'en avez pas encore.

enter image description here

Vous pouvez trouver plus d’informations sur MSDN

101
Alex Aza

Solution de contournement pour CONTAINS: si vous ne souhaitez pas créer un index en texte intégral sur la colonne et que les performances ne font pas partie de vos priorités, vous pouvez utiliser l'instruction LIKE qui n'est pas nécessaire. toute configuration préalable:

Exemple: rechercher tous les produits contenant la lettre Q:

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

Vous devez définir Full-Text-Index sur toutes les tables de la base de données sur lesquelles vous devez utiliser une requête avec CONTAINS, ce qui prendra parfois.

Au lieu de cela, vous pouvez utiliser le LIKE qui vous donnera des résultats instantanés sans avoir à ajuster les paramètres des tables.

Exemple:

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

Le même résultat obtenu avec CONTAINS peut être obtenu avec LIKE.

voir le résultat: enter image description here

17
Ashraf Abusada
3
mellamokb

Il existe une solution supplémentaire pour définir la colonne Full text sur true.

Ces solutions par exemple n'ont pas fonctionné pour moi

ALTER TABLE news ADD FULLTEXT(headline, story);

Ma solution.

  1. Clic droit sur la table
  2. Conception
  3. Clic droit sur la colonne que vous souhaitez éditer
  4. Index de texte intégral
  5. Ajouter
  6. Proche
  7. Rafraîchir

PROCHAINES ÉTAPES

  1. Clic droit sur la table
  2. Conception
  3. Cliquez sur la colonne que vous souhaitez éditer
  4. En bas de mssql, vous verrez l'onglet "Propriétés de la colonne"
  5. Spécification de texte intégral -> (Est indexé sur le texte intégral) défini sur true.

Rafraîchir

Version de mssql 2014

1
Icet

vous devez ajouter un index de texte intégral sur des champs spécifiques que vous souhaitez rechercher.

ALTER TABLE news ADD FULLTEXT(headline, story);

où "news" est votre table et les champs "headline, story" que vous ne pourrez pas activer pour la recherche en texte intégral

1
SimonQuest
Select * from table
where CONTAINS([Column], '"A00*"')  

agira comme% identique à

where [Column] Like 'A00%'
0
Dnyanesh Mijagiri