23 messaggi dal 28 novembre 2005
Wella,

mi sono studiato un po' il Full Text Search però non sono riuscito a capire come fare a restituire gli stessi record che otterrei utilizzando un LIKE %keyword%.
Infatti se uso il CONTAIN(field, 'keyword') ottengo i record che contengono la keyword intesa come parola separata, se uso keyword* trovo le parole che iniziano per la keyword.
Quindi, in buona sostanza, per simulare un like %keyword% come faccio?
Grazie
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Avrai certamente letto nella documentazione che una ricerca FT si basa su un catalogo memorizzato sul File System che viene popolato con la lista di parole contenute in uno o più campi di una tabella.
Questa struttura permette di scorrere l'elenco delle parole e, laddove viene trovata una corrispondenza con quanto stai cercando, viene utilizzato il puntatore (costituito dalla PK) per tornare sulla tabella ed avere i record che soddisfano il criterio.
Non avere certezza di come inizia la parola che stai cercando (*keyword) significa non poter contare su alcuna indicizzazione (lo stesso vale per gli indici tradizionali) costringendo il sistema a scorrere, eventualmente, tutto l'elenco; al contrario la ricerca della parola che inizia per una stringa nota (keyword*) permette di saltare più o meno rapidamente ad un punto specifico della struttura.

Per questo motivo non avrebbe senso soddisfare una richiesta come quella da te prospettata accedendo ad una struttura di indice in quanto sarebbe certamente più oneroso di un table scan...

Bye
23 messaggi dal 28 novembre 2005
Grazie Luca per la risposta.
Quindi, se ho capito bene, non esiste alcun modo per ottimizzare una ricerca di tipo %keyword% perché utilizzare un indice (sia di tipo full text che tradizionale) non evita comunque il table scan.
Inoltre ho trovato alcune stranezze con il Full Text in quanto può capitare che esistano effettivamente le parole però in realtà non le trova. Faccio un esempio:se un campo indicizzato con Full Serch contiene "Nella lampada c'è un genio." e io faccio il contains con 'genio' allora il record mi dovrebbe tornare. Invece, mentre funziona correttamente con molte parole, sembra che con altre parole non ritorni nulla oppure ritorna molti meno record di quanti in realtà ci sono. Non so se è una cosa normale oppure se ho sbagliato qualcosa nel settaggio dell'indice, ma io vorrei che quando scrivo il CONTAINS ottengo veramente tutti i record che hanno quella parola separata.



"l.bianchi [MVP]" <l.bianchi> wrote in message news:259531@...
Avrai certamente letto nella documentazione che una ricerca FT si basa su un catalogo memorizzato sul File System che viene popolato con la lista di parole contenute in uno o più campi di una tabella.
Questa struttura permette di scorrere l'elenco delle parole e, laddove viene trovata una corrispondenza con quanto stai cercando, viene utilizzato
il puntatore (costituito dalla PK) per tornare sulla tabella ed avere i record che soddisfano il criterio.
Non avere certezza di come inizia la parola che stai cercando (*keyword) significa non poter contare su alcuna indicizzazione (lo stesso vale per gli indici tradizionali) costringendo il sistema a scorrere, eventualmente,
tutto l'elenco; al contrario la ricerca della parola che inizia per una stringa nota (keyword*) permette di saltare più o meno rapidamente ad un punto specifico della struttura.

Per questo motivo non avrebbe senso soddisfare una richiesta come quella da
te prospettata accedendo ad una struttura di indice in quanto sarebbe certamente più oneroso di un table scan...

Bye


Luca Bianchi
Microsoft MVP - SQL Server

Corso LEARN&GET ASP.NET 2.0
Milano, 27 e 28 Marzo - 2 giorni di corso, licenza VS 2005, hosting 6 mesi A partire da soli 375,00 Euro IVA esclusa!
http://g.aspitalia.com/g/c/395/

Hosted by http://www.ithost.ch - your host company

1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
assandri ha scritto:
Grazie Luca per la risposta.
Quindi, se ho capito bene, non esiste alcun modo per ottimizzare una ricerca di tipo %keyword% perché utilizzare un indice (sia di tipo full text che tradizionale) non evita comunque il table scan.


Esatto...


Inoltre ho trovato alcune stranezze con il Full Text in quanto può capitare che esistano effettivamente le parole però in realtà non le trova.


Ci sono alcune parole che sono escluse per scelta esplicita. Sono le cosiddette NOISE WORDS, ovvero quelle parole che, per la lingua di riferimento, rappresentano le congiunzioni, gli articoli, aggettivi, ecc che non possono essere considerate "chiavi di ricerca". Tali parole sono contenute in file noise.xyz dove xyz è il riferimento alla lingua (ita per l'Italia). Possono essere editati laddove tu voglia aggiungere o rimuovere delle noise words.
Tieni inoltre presente che a differenza di un indice tradizionale, un indice FT non viene mantenuto costantemente allineato. E' necessario quindi schedulare dei job affinchè venga popolato (in maniera full o incrementale) il catalogo FT...

Bye
23 messaggi dal 28 novembre 2005
Ok, grazie.

Credo che il mio problema sia proprio nel popolamenteo. Non ho specificato nessuna lingua per l'indice perché il campo viene scritto in tutte le lingue dal cinese all'italiano.
Grazie ancora per i consigli.
Saluti Marco

"l.bianchi [MVP]" <l.bianchi> wrote in message news:259655@...
assandri ha scritto:

Grazie Luca per la risposta.
Quindi, se ho capito bene, non esiste alcun modo per ottimizzare una ricerca di tipo %keyword% perché utilizzare un indice (sia di tipo full text che tradizionale) non evita comunque il table scan.

Esatto...


Inoltre ho trovato alcune stranezze con il Full Text in quanto può capitare
che esistano effettivamente le parole però in realtà non le trova.

Ci sono alcune parole che sono escluse per scelta esplicita. Sono le cosiddette NOISE WORDS, ovvero quelle parole che, per la lingua di riferimento, rappresentano le congiunzioni, gli articoli, aggettivi, ecc che non possono essere considerate "chiavi di ricerca". Tali parole sono contenute in file noise.xyz dove xyz è il riferimento alla lingua (ita per l'Italia). Possono essere editati laddove tu voglia aggiungere o rimuovere delle noise words.
Tieni inoltre presente che a differenza di un indice tradizionale, un indice FT non viene mantenuto costantemente allineato. E' necessario quindi
schedulare dei job affinchè venga popolato (in maniera full o incrementale)
il catalogo FT...

Bye


Luca Bianchi
Microsoft MVP - SQL Server

Corso LEARN&GET ASP.NET 2.0
Milano, 27 e 28 Marzo - 2 giorni di corso, licenza VS 2005, hosting 6 mesi A partire da soli 375,00 Euro IVA esclusa!
http://g.aspitalia.com/g/c/395/

Hosted by http://www.ithost.ch - your host company

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.