Coldfusion Verity Search engine - ricerche indicizzate - seconda parte

  • 30
  • Dec 2006
  • Dev @ Contech Lab
  • View: 18645 | 0 Comments

  • coldfusion | verity

  • segue... ancora su indicizzazione...

    Indicizzazione ed aggiornamento in background Verity K2 permette l'indicizzazione di banche dati, anche di particolari campi, per questo però vi rimando alla terza parte dove sarà esaminato in dettaglio un esempio di questo tipo.

    Nel codice che segue ho messo uno breve script che una volta schedulato, magari una volta al giorno, permette di aggiornare gli indici della Collection, aggiungendo i nuovi documenti pubblicati sul sito.

    view plain print about
    <!--- //------------------ Aggiorna indici della collection -----------------// --->
    <cfset collectionname= "MiaCollection">
    <cfset collectionpath= "d:\ftp\internew\htdocs\repository">

    <cfindex action="REFRESH" 
    collection="#collectionname#" 
    key="#collectionpath#" 
    type="PATH" 
    extensions=".pdf,.doc" 
    recurse="Yes" >


    <cfoutput>SCHEDULAZIONE OK - #now()#</cfoutput>

    <cfmail from="" to="" server="" port="25" 
    subject="Verity Sched MIOSITO" >

    Indicizzazione completata
    </cfmail>
    <cfabort>

    La ricerca Terminata la fase di creazione della Collection e sua indicizzazione, possiamo passare al Template di ricerca. Verity viene interrogato dal TAG CFSEARCH.

    L'esempio che segue utilizza e concatena due logiche di ricerca:

     

    • ricerca delle stringhe di input all'interno di una collection
    • ricerca su database, dei record che sono stati evidenziati come soluzioni sulla collection precendente

     

    La logica usata è quella di utilizzare il CFSEARCH per trovare i documenti PDF che soddidfano i criteri di ricerca. L'elenco dei nomi dei documEnti (nome del file) che soddisfano la ricerca viene messo in una lista e poi tramite una SQL query IN vengono estratti tutti i record dell'archivio documenti che contengono la lista dei nomi file trovati.

    In questo modo si avranno i record dei documenti completi di abstract, classificazioni varie, titoli e autori ed eventuali altre info archiviate su database e legate al documento trovato da Verity.

    Questo è stato necessario in quanto Verity lanciato solo sui documenti non è in grado di trovare le informazioni contenute nel DB.

    view plain print about
    <!--- //---------- ricerca con verity ---------------------// --->

    <!--- path dei documenti --->
    <cfset Docpath = GetDirectoryFromPath(pdfpath)> 
    <cfqueryparam name="VISTA_DOC" default="nome_vista">
    <!--- start search --->
    <CFSEARCH 
    NAME="PageSearch"
    COLLECTION="#collection#"
    TYPE="Simple" 
    CRITERIA="#SearchText#"
    maxrows="50" >

    <cfif PageSearch.RecordCount GT 0> 
    <cfset lenDP = len(DocPath)> 
    <cfloop query="PageSearch">
    <cfset lenkeynameD = evaluate(len(key)-lenDP+2)>
    <cfset ResultDocList = ListAppend(ResultDocList, right(key, lenkeynameD))>
    </cfloop> 
    <cfset ResultDocListQuoted = ListQualify(ResultDocList, "'", ",", "ALL")>
    </cfif>

    <cfset SearchTextOgg = Replace(SearchText,'*',','all')
    >
     
    <cfquery name="Search" datasource="#dsn#">
    select campo, campo2, campo 3 
    from #VISTA_DOC# where idsomm <> 0 AND 
    (
    <!--- stringhe multiparola:start --->
    <cfset pos = 0>
    (
    <cfloop list="#SearchTextOgg#" delimiters=" " index="ITEM">
    <cfset pos = pos + 1>
    (campo like '%#ITEM#%' or campo1 like '%#ITEM#%')
    <cfif pos is not ListLen(SearchTextOgg, ' ')>OR</cfif>
    </cfloop>
    )
    <!--- stringhe multiparola:end --->

    <!--- query IN nomi dei documenti ottenuti dal verity --->
    <cfif listlen(ResultDocList) GTE 1>
    OR FILEDOC IN (#PreserveSingleQuotes(ResultDocListQuoted)#)
    </cfif> 
    )
    order by id_settore ASC, datadoc DESC
    </cfquery>