2012-06-07 11 views
5

Ho iniziato a provare a utilizzare la nuova API di ricerca, la demo funziona senza intoppi, tuttavia, ci sono alcuni punti che sono ancora confuso dall'essere estraneo al mondo di ricerca.Chiarire l'utilizzo dell'API AppEngine Search

Prima di tutto è come creare un documento. Ovviamente non è possibile codificare manualmente ogni riga in un documento, ma cos'altro posso fare. Dite se ho una user class (sto usando Java, ma immagino che Python non faccia alcuna differenza qui), e aggiungerei le informazioni dell'utente nel documento, e potrei fare una ricerca full-text sul campo dell'indirizzo .

class User { 
    String username; 
    String password; 
    String address; 
} 

Nel mio archivio dati, ho questa entità con 10000 casi, e se avrò bisogno di costruire questo documento, devo

Fase 1: recuperare l'istanza 10000 da datastore

Fase 2: scorrere ogni dell'impresa utilizzatrice, e creo 10000 documenti

Passo 3: Aggiungere tutte le 10000 documenti in un indice, e allora sarò in grado di cercare

Per favore correggimi se sopra tre passaggi che ho citato è sbagliato.

Se questo è il caso, allora lo fa dopo ogni volta che un nuovo utente si registra, dobbiamo creare un nuovo documento e aggiungerlo all'indice?

+1

Penso che sia l'idea, sì ... – Thilo

+0

Grazie a @Thilo. A mio parere, l'indice si presenta come una mappa mantenuta manualmente nel database relazionale, ma è necessario sincronizzarlo con il db ogni volta che si verifica un inserimento/eliminazione/aggiornamento. Conosco il vantaggio di supportare la ricerca full-text, ma se questo è l'unico vantaggio, vale la pena fare tutto questo? –

+1

L'overhead è sempre presente con la ricerca full-text. Hai bisogno di quell'indice. Potrebbe essere implementato in modo più automatico, più dichiarativo, meno intensivo del codice rispetto all'API corrente? Può essere. Se FTS vale il costo spetta a te decidere. – Thilo

risposta

6

Purtroppo non ho giocato così tanto. Ho imparato alcune cose.

  • Al momento della prima implementazione, devo creare anche molti documenti (come descritto). Ma continuò a correre fino a scadenza delle eccezioni. Così ho finito upp usando la coda dei task per costruire i documenti per tutti i miei vecchi record.

  • Ricordarsi di creare un riferimento incrociato tra il documento di ricerca e l'entità del datastore. In questo modo puoi aggiornare facilmente il tuo record di documento. E da un risultato di ricerca ottieni l'entità della partita.

Per riferimento incrociato aggiungere una nuova proprietà del modello datastore nome simile a search_document_id in cui si memorizzano i doc_id (I prefissate tutti i miei DOC_ID di con il nome del modello datastore). E aggiungi un campo di testo su di te Documento contenente la chiave di entità come una stringa.

Ma vorrei dire in poche parole che hai ragione.

+5

Per riferimenti incrociati, perché non impostare doc_id del documento sulla chiave dell'entità? In questo modo non avresti bisogno di un ulteriore search_document_id sulla tua entità e non avresti bisogno di una proprietà di testo nel tuo documento che memorizzi la chiave dell'entità? Non l'ho provato, ma ho bisogno di fare un'entità/documento di riferimento incrociato e mi sono chiesto perché non farlo in questo modo. – Romz

+6

Confermo che ciò che ho suggerito funziona. – Romz