2013-08-15 10 views
5

Io utilizzo la funzionalità di ricerca di marklogic per creare una pagina di ricerca. A partire da ora, sto eseguendo un XQuery per ottenere risultati di ricerca tramite search:search. Come esempio ossa nude, vedi questo codice:Relazioni dati come contesto per la ricerca in Marklogic

xquery version "1.0-ml"; 
import module namespace search = "http://marklogic.com/appservices/search" 
     at "/MarkLogic/appservices/search/search.xqy"; 

search:search('test', 
    <options xmlns='http://marklogic.com/appservices/search'></options>) 

Questa ricerca cerca tutti i contenuti nel database, che va bene in molti casi. In altri casi, cerco in base alle raccolte con cts:collection-query. Le collezioni servono come grandi contesti per le mie ricerche.

Ora, desidero limitare i risultati della ricerca in base a una relazione di dati in un documento "principale". Questo documento "principale" ha tutte le relazioni in un modello a oggetti. Se quel modello di oggetti ha un riferimento a un documento, voglio che il documento sia incluso nella ricerca. In sostanza, il documento "principale"/modello è il contesto della ricerca.

Stavo cercando di scambiare idee sul modo migliore per farlo. Ecco cosa mi è venuta in mente finora, ma speravo che qualcuno più familiarità con Mark Logic (Ho solo lavorato con lui per 6 mesi) mi potrebbe portare in una buona direzione:

  1. Aggiungi tutti i documenti referenziato nel documento del modello a una collezione unica. Quindi cerca la ricerca in base a quella raccolta. Tuttavia, le collezioni dovrebbero essere aggiornate con la modifica del modello.
  2. Caricare il documento del modello nel mio codice e ottenere un elenco di tutti i riferimenti e aggiungerli a una query da cts:document-query (o simili).
  3. Ristruttura il mio concetto di "modello" in qualche modo nei miei documenti XML.

Grazie per qualsiasi input o suggerimenti.

+1

Terminato andando con # 1. # 2 era circa 3 volte più lento nel mio database. Inoltre, a causa del vasto modello di relazione nel mio XML, il codice per # 2 stava iniziando a diventare brutto. Con le raccolte in atto, sono in grado di consentire a tutti gli sviluppatori di riutilizzare con facilità. Molto probabilmente implementerò i trigger in futuro. – Paul

risposta

2

Tutte queste idee funzionerebbero bene. Decidere quale usare dipende dai particolari della tua applicazione, come la frequenza con cui il documento principale viene modificato (e ne hai il controllo), quanto sia difficile rimodellare il tuo XML.

Un'altra cosa da considerare è che è possibile impostare un trigger sugli aggiornamenti dei documenti che potrebbero eseguire automaticamente le modifiche alla raccolta.

-David Lee

+0

Mi piace l'idea di aggiungere un trigger. – Paul

3

Vorrei iniziare con (2) e vedere se la prestazione è abbastanza buono. Dipenderà dal tuo caso d'uso, ma prevedo che dovrebbe andare bene per migliaia o addirittura centinaia di migliaia di riferimenti.

Assicurarsi di utilizzare un termine unico cts:document-query($list-of-references). Questo sarà più veloce di cts:or-query(for $ref in $list-of-references return cts:document-query($ref)), perché la ricerca dell'indice può essere un singolo passaggio invece di N ricerche separate.

Problemi correlati