Costruire una console di gestione con ASP.NET per i catalogi full text

di Fabio Civerchia, in ASP.NET,

Molto spesso quando si realizza un sito che interroghi un database SQL Server 2000, sfruttando i cataloghi full-text per le ricerche, occorre fornire al cliente un client che popoli le tabelle alle quali dal sito è possibile interrogare, perché questi cataloghi non si aggiornano da soli, ma sulla base di uno schedalo.

Dobbiamo quindi fare in modo che da un pannello sia possibile aggiornare l'indice full.text, percchè l'inserimento di nuovi dati o la modifica non aggiornano l'indice. Bisogna farlo manualmente oppure impostare una pianificazione.

Immagine

Immagine

Il non aggiornamento del catalogo porta a non trovare i dati che abbiamo appena inserito.

Naturalmente questa soluzione è consigliabile quando si fa un aggiornamento di molti record, magari in una transazione.

Creare un web service

Una soluzione al nostro problema potrebbe essere quella di creare un Web Service che faccia questo per noi:

Public Class UpdateIndexFullText
  Public Shared Function IndexFullText() As Boolean
    Dim conn As SqlConnection = New SqlConnection(connstring)
    Dim Cmd As New SqlCommand("sp_fulltext_catalog", conn)
    Cmd.CommandType = CommandType.StoredProcedure
    With Cmd.Parameters
       .Add(New SqlParameter("@ftcat", SqlDbType.VarChar)).Value = "xml"
     .Add(New SqlParameter("@action", SqlDbType.VarChar, 20)).Value = "start_full"
    End With
    Try
     conn.Open()
     Dim Resisu As Boolean = Cmd.ExecuteScalar
     conn.Close()
     Cmd.Dispose()
     Return Resisu
    Catch exsql As SqlException
     Console.writeline(exsql.Message)
     Throw New Exception("Errore nel popolamento dell'indice Full Text")  
   Catch e As Exception
     Console.writeline(ex.Message)
     Throw New Exception("Errore nel popolamento dell'indice Full Text")
    Finally
     conn.Close()
    End Try
 
  End Function
 
 End Class

La stored procedure che si occupa di ciò è quella di sistema, chiamata sp_fulltext_catalog , accetta 3 argomenti e restituisce 0 se l'esito è positivo e 1 se è negativo.

Vediamola in dettaglio. Gli argomenti che accetta sono @ftcat che indica il nome del catalogo , @action che è l'azione da compiere e @path che indica il percorso dove SQL Server deve memorizzare l'indice, che di solito è la directory predefinita del server.

Quest'ultimo parametro può essere impostato, ma non è detto che vi convenga farlo (il valore di default è null).

Uno sguardo ai books on line

Diamo uno sguardo alla guida per capire meglio come funziona la stored procedure.

 <b>sp_fulltext_catalog</b> [ <b>@ftcat</b> <b>= </b> ] <b>'</b> <i>fulltext_catalog_name</i> <b>' ,</b> 
   [ <b>@action</b> <b>= </b> ] <b>'</b> <i>action</i> <b>'</b> 
   [ <b>, </b> [ <b>@path</b> <b>= </b> ] <b>'</b> <i>root_directory</i> <b>' </b> ]

L'action accetta diversi argomenti:

Valore

Descrizione

Create

Crea un nuovo catalogo full-text vuoto nel file system e aggiunge una riga corrispondente in sysfulltextcatalogs con i valori fulltext_catalog_name e root_directory , se è disponibile. fulltext_catalog_name deve essere un nome univoco all'interno del database.

Drop

Elimina il valore fulltext_catalog_name rimuovendolo dal file system insieme alla riga corrispondente di sysfulltextcatalogs . Se il catalogo contiene indici per una o più tabelle, questa azione ha esito negativo. Per eliminare le tabelle dal catalogo, eseguire sp_fulltext_table ' table_name ', 'drop'.

Se il catalogo non esiste, viene visualizzato un errore.

start_incremental

Avvia un processo di popolamento incrementale per il catalogo specificato in fulltext_catalog_name . Se il catalogo non esiste, viene visualizzato un errore. Se è già attivo il popolamento di un indice full-text, viene visualizzato un avviso e il popolamento non viene eseguito. Con il popolamento incrementale vengono recuperate per l'indicizzazione full-text solo le righe modificate, a condizione che la tabella su cui si esegue questa operazione includa una colonna di tipo timestamp .

start_full

Avvia un popolamento completo per fulltext_catalog_name . Per l'indicizzazione full-text viene recuperata ogni riga di ogni colonna associata al catalogo, anche se è già stata indicizzata.

Stop

Interrompe il popolamento di un indice per fulltext_catalog_name . Se il catalogo non esiste, viene visualizzato un errore. Se il popolamento è già stato interrotto, non viene visualizzato alcun avviso.

Rebuild

Ricostruisce il catalogo specificato in fulltext_catalog_name eliminando il catalogo full-text esistente dal file system, ricreandolo e riassociandolo a tutte le tabelle con riferimenti di indicizzazione full-text.

La ricostruzione non comporta la modifica dei metadati full-text nelle tabelle di sistema del database, né il popolamento del catalogo full-text appena creato. Per ripetere il popolamento, è necessario eseguire sp_fulltext_catalog con l'azione start_full o start_incremental .

[ <b>@path</b> <b>=</b> ] <b>'</b> <i>root_directory</i> <b>'</b> 
è la directory dove il catalogo viene creato, è di tipo nvarchar(100) , il valore predefinito è Null.

Quando viene creato un catalogo se il valore che gli passiamo è null, SQL Server utilizzerà il percorso con lasottodirectory Ftdata della directory Mssql, ad esempio C:\Programmi\Microsoft SQL Server\Mssql\Ftdata\.

@path è valido solo quando action è uguale a create, altrimenti va impostato su Null.

Una considerazione che vorrei fare è sul popolamento incrementale ( start_incremental) , che è molto più performante rispetto a quello totale in quanto fa una query solo sugli elementi modificati, naturalmente grazie al campo timestamp che usa per confrontare i record.

2 pagine in totale: 1 2

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti