Info Full-Text Engine

mercoledì 29 dicembre 2010 - 09.28
Tag Elenco Tags  SQL Server 2008 R2

cypher Profilo | Junior Member

ciao a tutti,
dovrei fare delle ricerche su dei testi e a tal proposito stavo leggendo del "Full-Text Engine" di SQL Server 2008 e dei suoi nuovi predicati CONTAINS e FREETEXT. A parte FREETEXT che sembra riesca a fare una ricerca addirittura semantica (qualcuno l'ha usato?lo conferma?) per quanto riguarda CONTAINS sembra fare lo stesso lavoro del LIKE.

Qualcuno mi sa dare delucidazioni a riguardo?

lbenaglia Profilo | Guru

>A parte FREETEXT che sembra
>riesca a fare una ricerca addirittura semantica (qualcuno l'ha
>usato?lo conferma?) per quanto riguarda CONTAINS sembra fare
>lo stesso lavoro del LIKE.

Il comando CONTAINS permette ricerche molto più flessibili rispetto all'operatore LIKE come documentato sui Books Online:
http://msdn.microsoft.com/it-it/library/ms187787.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

ciao,
grazie ora ho capito meglio la differenza e vorrei fare qualche prova.
ho creato il catalogo fulltext su una tabella che è composta da colonne del seguente tipo (datetime,varchar(100),float,text,int).
Da quello che ho letto prima di applicargli un indice full-text devo indicizzare la colonna in maniera normale.
Dato che devo fare la la ricerca sulla colonna di tipo text non mi permette di assegnargli un indice. Allora ho cambiato il tipo in varchar(1000) ma nel salvataggio mi viene fuori questo errore:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

come posso risolvere il problema in modo da poter creare l'indice full-text e fare quindi le mie prove? (l'opzione menzionata nel messaggi odi errore non la trovo :))

lbenaglia Profilo | Guru

>ho creato il catalogo fulltext su una tabella che è composta
>da colonne del seguente tipo (datetime,varchar(100),float,text,int).
>Da quello che ho letto prima di applicargli un indice full-text
>devo indicizzare la colonna in maniera normale.

I Books Online recitano: "Only one full-text index is allowed per table. For a full-text index to be created on a table, the table must have a single, unique nonnull column. You can build a full-text index on columns of type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary, and varbinary(max) can be indexed for full-text search. Creating a full-text index on a column whose data type is varbinary, varbinary(max), image, or xml requires that you specify a type column. A type column is a table column in which you store the file extension (.doc, .pdf, .xls, and so forth) of the document in each row".

Come puoi leggere l'unico prerequisito necessario per la definizione di un indice full-text è che la tabella debba avere una singola colonna con un valore univoco non NULL.
Nella tua tabella puoi aggiungere una colonna numerica NOT NULL di tipo IDENTITY per soddisfare i prerequisiti (per assicurare l'univocità non sarebbe male definire su di essa un indice UNIQUE non-cliustered oppure un constraint di PRIMARY KEY).

>Dato che devo fare la la ricerca sulla colonna di tipo text non
>mi permette di assegnargli un indice. Allora ho cambiato il tipo
>in varchar(1000)
La domanda è: se sono sufficienti 1000 carattri, per quale motivo hai definito una colonna come text (tra l'altro un dada type deprecato)?

>ma nel salvataggio mi viene fuori questo errore:
>Saving changes is not permitted. The changes you have made require
>the following tables to be dropped and re-created. You have either
>made changes to a table that can't be re-created or enabled the
>option Prevent saving changes that require the table to be re-created
>
>come posso risolvere il problema in modo da poter creare l'indice
>full-text e fare quindi le mie prove? (l'opzione menzionata nel
>messaggi odi errore non la trovo :))
Lancia SSMS, autenticati all'istanza, Tools > Options > Designers e togli il segno di spunta alla check box "Prevents saving changes that require table re-creation".

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

scusa per ricapitolare, dato che devo ricreare una nuova tabella e metterci dentro i dati dato che quella che ho non mi permette di modificarla (non posso inserire una colonna not null in una tabella già popolata), ne creo una nuova con (id,testo), associo una primary key a id e cosi posso fare un full-text index su testo?

grazie per la pazienza :)

lbenaglia Profilo | Guru

>scusa per ricapitolare, dato che devo ricreare una nuova tabella
>e metterci dentro i dati dato che quella che ho non mi permette
>di modificarla (non posso inserire una colonna not null in una
>tabella già popolata), ne creo una nuova con (id,testo), associo
>una primary key a id e cosi posso fare un full-text index su
>testo?
Se specifichi l'attributo IDENTITY puoi eccome:

USE tempdb; CREATE TABLE dbo.foo( c1 char(1) NOT NULL ); INSERT dbo.foo VALUES ('a'), ('b'), ('c'); ALTER TABLE dbo.foo ADD c2 int IDENTITY NOT NULL; SELECT * FROM dbo.foo; /* Output: c1 c2 ---- ----------- a 1 b 2 c 3 (3 row(s) affected) */ ALTER TABLE dbo.foo ADD CONSTRAINT PK_foo PRIMARY KEY(c2); DROP TABLE dbo.foo;

>grazie per la pazienza :)
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

ok grazie mille cosi funziona.
solo che non mi permette ancora di aggiungere un full-text index (l'opzione non è selezionabile)

cypher Profilo | Junior Member

come risolvo?

cypher Profilo | Junior Member

ho risolto dandogli l'istruzione manualmente tramite query
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) KEY INDEX ui_ukJobCand WITH STOPLIST = SYSTEM;

ora però mi sorgono alcuni dubbi del tipo:
perche la seguente query
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
non mi restituisce niente anche se all'interno del dataset c'è una tupla del genere (tanto è vero che se trasformo il contains in like mi restutuisce la tupla)?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5