Impossibile utilizzare un predicato CONTAINS o FREETEXT nella tabella o nella vista indicizzata perché non è indicizzato a testo completo


95

Ricevo il seguente errore nel mio database SQL Server 2008 R2:

Impossibile utilizzare un predicato CONTAINSo FREETEXTnella tabella o nella vista indicizzata "tblArmy" perché non è indicizzato a testo completo.


1
Hai effettivamente creato un catalogo full text?
Alex K.

Risposte:


111
  1. Assicurati di aver installato la funzione di ricerca full-text.

    Configurazione della ricerca full-text

  2. Crea un catalogo di ricerca full-text.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
  3. Crea indice di ricerca full-text.

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

    Prima di creare l'indice, assicurarsi che:
    - non si disponga già dell'indice di ricerca full-text sulla tabella poiché è consentito un solo indice di ricerca full-text su una tabella
    - esiste un indice univoco sulla tabella. L'indice deve essere basato su una colonna a chiave singola, che non consente NULL.
    - esiste un catalogo full-text. È necessario specificare esplicitamente il nome del catalogo full-text se non esiste un catalogo full-text predefinito.

È possibile eseguire i passaggi 2 e 3 in SQL Server Management Studio. In Esplora oggetti, fai clic con il pulsante destro del mouse su una tabella, seleziona la Full-Text indexvoce di menu e quindi la Define Full-Text Index...voce di sottomenu. La procedura guidata per l'indicizzazione di testo completo ti guiderà attraverso il processo. Creerà anche un catalogo di ricerca full-text per te se non ne hai ancora.

inserisci qui la descrizione dell'immagine

Puoi trovare maggiori informazioni su MSDN


Buone informazioni Alex! NOTA: per coloro che utilizzano Azure SQL, al momento non supporta la tabella Contains. Vedi qui: msdn.microsoft.com/library/azure/ee336253.aspx
Termato

Inoltre, se si utilizza SQL Express avanzata Services, vedere qui per creare un testo completo Index: stackoverflow.com/questions/10407337/...
Termato

69

Una soluzione alternativa per CONTAINS: se non si desidera creare un indice di testo completo sulla colonna e le prestazioni non sono una delle priorità, è possibile utilizzare l' LIKEistruzione che non necessita di alcuna configurazione precedente:

Esempio: trova tutti i prodotti che contengono la lettera Q:

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

1
collegamento . LIKE Il predicato Transact-SQL funziona solo su modelli di caratteri. Inoltre, non è possibile utilizzare il predicato LIKE per eseguire query su dati binari formattati. Inoltre, una query LIKE su una grande quantità di dati di testo non strutturato è molto più lenta di una query full-text equivalente sugli stessi dati.
Manolis

1
Ah, dolce ... il modo semplice e completo che non richiede di estrarre il tuo programma di installazione e di andare in giro con le impostazioni dell'ambiente. Molto bene!
Christine

21

È necessario definire Full-Text-Indexsu tutte le tabelle nel database in cui è necessario utilizzare una query con la CONTAINSquale ci vorrà del tempo.

Invece puoi usare il LIKEche ti darà risultati immediati senza la necessità di regolare le impostazioni per le tabelle.

Esempio:

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

Lo stesso risultato ottenuto con CONTAINSpuò essere ottenuto con LIKE.

guarda il risultato: inserisci qui la descrizione dell'immagine


È davvero intelligente
WonderWorker

6
Questo è un bel trucco, ma il modo in cui è formulata questa risposta è sbagliato. Non "usarlo e basta". Ci sono alcune gravi implicazioni sulle prestazioni per fare questo e chiunque lo inserisca in un sistema di produzione dovrebbe riflettere molto attentamente sull'esecuzione di scansioni di tabelle complete come questa su una colonna non indicizzata.
caesay

3

abilita / disabilita La ricerca a testo completo è disattivata nel menu contestuale. Immagino di dover installare la ricerca a testo completo. Come posso installare la ricerca full text?
DotnetSparrow

Esegui l'installazione per SQL Server e dovrebbe esserci un'opzione per modificare i componenti installati (o qualcosa di simile). Fare clic su di esso, quindi selezionare la casella di controllo Testo completo al momento appropriato e dovresti essere bravo. Mi spiace, non ne ho uno a portata di mano o darei istruzioni più specifiche.
Tom H

@ Ciao Tom: non ho visto l'opzione per aggiungere funzionalità quando eseguo il programma di installazione di SQL Server 2008 R2.
DotnetSparrow

1

devi aggiungere l'indice di testo completo su campi specifici che desideri cercare.

ALTER TABLE news ADD FULLTEXT(headline, story);

dove "notizie" è la tabella e i campi "titolo, articolo" che non verranno attivati ​​per la ricerca a testo completo


1

C'è un'altra soluzione per impostare la colonna Full text su true.

Queste soluzioni, ad esempio, non hanno funzionato per me

ALTER TABLE news ADD FULLTEXT(headline, story);

La mia soluzione.

  1. Fare clic con il tasto destro sul tavolo
  2. Design
  3. Fare clic con il tasto destro sulla colonna che si desidera modificare
  4. Indice del testo completo
  5. Inserisci
  6. Vicino
  7. ricaricare

PROSSIMI PASSI

  1. Fare clic con il tasto destro sul tavolo
  2. Design
  3. Fare clic sulla colonna che si desidera modificare
  4. In fondo a mssql ci sarà la scheda "Proprietà colonna"
  5. Specifica full-text -> (Is Full-text Indexed) impostato su true.

ricaricare

Versione di mssql 2014


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

agirà come% come

where [Column] Like 'A00%'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.