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

95

J'obtiens l'erreur suivante dans ma base de données SQL Server 2008 R2:

Impossible d'utiliser un prédicat CONTAINSou FREETEXTsur la table ou la vue indexée 'tblArmy' car elle n'est pas indexée en texte intégral.

DotnetSparrow
la source
1
Avez-vous réellement créé un catalogue de texte intégral?
Alex K.

Réponses:

111
  1. Assurez-vous que la fonction de recherche en texte intégral est installée.

    Configuration de la recherche en texte intégral

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

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
  3. Créez 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 n'avez pas déjà d'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.
    - un 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 Server Management Studio. Dans l'explorateur d'objets, cliquez avec le bouton droit sur une table, sélectionnez l' Full-Text indexélément de menu, puis l'élément de Define Full-Text Index...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 pour vous si vous n'en avez pas encore.

entrez la description de l'image ici

Vous pouvez trouver plus d'informations sur MSDN

Alex Aza
la source
Bonne information Alex! REMARQUE: pour ceux qui utilisent Azure SQL, il ne prend pas en charge la table Contains pour le moment. Voir ici: msdn.microsoft.com/library/azure/ee336253.aspx
Termato
De plus, si vous utilisez SQL Express Advanced Services, cliquez ici pour créer un index de texte intégral: stackoverflow.com/questions/10407337/…
Termato
69

Une solution de contournement pour CONTAINS: Si vous ne souhaitez pas créer un index de texte intégral sur la colonne et que les performances ne font pas partie de vos priorités, vous pouvez utiliser l' LIKEinstruction qui ne nécessite aucune configuration préalable:

Exemple: recherchez tous les produits contenant la lettre Q:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'
Mohammad Sepahvand
la source
1
lien . LIKE Le prédicat Transact-SQL fonctionne uniquement sur les modèles de caractères. En outre, vous ne pouvez pas utiliser le prédicat LIKE pour interroger des données binaires formatées. En outre, une requête LIKE sur une grande quantité de données de texte non structurées est beaucoup plus lente qu'une requête de texte intégral équivalente sur les mêmes données.
Manolis
1
Ah, doux ... le moyen simple et circulaire qui ne vous oblige pas à déterrer votre installateur et à vous amuser avec vos paramètres d'environnement. Bien joué!
Christine
21

Vous devez définir Full-Text-Indexsur toutes les tables de la base de données où vous devez utiliser une requête CONTAINSqui prendra un certain temps.

Au lieu de cela, vous pouvez utiliser le LIKEqui vous donnera des résultats instantanés sans avoir besoin d'ajuster les paramètres des tableaux.

Exemple:

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

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

voir le résultat: entrez la description de l'image ici

Achraf Abusada
la source
C'est vraiment intelligent
WonderWorker
6
C'est une belle astuce, mais la façon dont cette réponse est formulée est fausse. Ne pas «simplement l'utiliser». Il y a de sérieuses implications en termes de performances pour cela et quiconque met cela dans un système de production doit réfléchir très attentivement à faire des analyses complètes de table comme celle-ci sur une colonne non indexée.
caesay
3

Vous devrez peut-être activer la table pour l'indexation de texte intégral .

mellamokb
la source
activer / désactiver La recherche de texte intégral est grisée dans le menu contextuel. Je suppose que je dois installer la recherche de texte intégral. Comment puis-je installer la recherche de texte intégral?
DotnetSparrow
Exécutez l'installation pour SQL Server et il devrait y avoir une option pour modifier les composants installés (ou quelque chose de similaire). Cliquez dessus puis cochez la case Texte intégral au moment opportun et vous devriez être bon. Désolé, je n'en ai pas sous la main ou je donnerais des instructions plus précises.
Tom H
@ Salut Tom: Je n'ai pas vu d'option pour ajouter des fonctionnalités lorsque j'exécute le programme d'installation de SQL Server 2008 R2.
DotnetSparrow
1

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

ALTER TABLE news ADD FULLTEXT(headline, story);

où "actualités" est votre tableau et les champs "titre, histoire" que vous n'activerez pas pour la recherche plein texte

SimonQuest
la source
1

Il existe une autre solution pour définir la colonne Texte intégral sur true.

Cette solution par exemple n'a pas fonctionné pour moi

ALTER TABLE news ADD FULLTEXT(headline, story);

Ma solution.

  1. Faites un clic droit sur la table
  2. Conception
  3. Faites un clic droit sur la colonne que vous souhaitez modifier
  4. Index de texte intégral
  5. Ajouter
  6. Fermer
  7. Rafraîchir

PROCHAINES ÉTAPES

  1. Faites un clic droit sur la table
  2. Conception
  3. Cliquez sur la colonne que vous souhaitez modifier
  4. En bas de mssql, il y aura l'onglet "Propriétés de la colonne"
  5. Spécification de texte intégral -> (Est indexé en texte intégral) défini sur true.

Rafraîchir

Version de mssql 2014

Icet
la source
-1
Select * from table
where CONTAINS([Column], '"A00*"')  

agira comme% identique à

where [Column] Like 'A00%'
Dnyanesh Mijagiri
la source