2010-12-11 12 views
6

Ci sono alcuni thread che fluttuano sull'argomento, ma penso che il mio caso d'uso sia un po 'diverso.Ricerca a testo integrale su Google App Engine (Java)

Quello che voglio fare:

  • completa componente di ricerca del testo per il mio GAE/J app
  • Le dimensioni indice è piccola: di solito 25-50 MB o giù di lì
  • Non ho bisogno di aggiornamenti in tempo reale a l'indice, una reindicizzazione periodica va bene
  • Questo è per il completamento automatico e simili, quindi deve essere estremamente veloce (ho l'impressione che l'implementazione di un indice invertito in Datastore introduca una notevole latenza)

La mia strategia finora (solo la pianificazione, non hanno provato ancora nulla attuazione):

  • Usa Lucene con RAMDirectory
  • Un lavoro cron periodica crea l'indice, serializza al Datastore, memorizza un aggiornamento id (o timestamp)
  • Ricerca servlet carica l'indice all'avvio e crea la RAMDirectory
  • a ogni richiesta del servlet controlla l'attuale aggiornamento id e ricarica l'indice, se necessario

La cosa principale su cui sono confuso è come sincronizzare i dati in memoria tra le istanze: funzionerà o mancherò qualcosa?

Inoltre, fino a che punto posso spingerlo prima che inizi ad avere problemi con l'uso della memoria? Non ho trovato nulla sulle quote RAM per GAE. (Questo indice è piccolo, ma posso pensare a più cose che vorrei aggiungere)

E, naturalmente, qualche idea su approcci migliori?

+0

memoria è separata tra le istanze GAE, quindi una directory di RAM straight-up non sarebbe condivisa tra di loro. Dovresti inizializzarlo per ogni istanza all'avvio. Quale non potrebbe essere così cattivo dato i nuovi server in standby e le richieste di riscaldamento. –

+0

Beh, sì, è una specie di parte di ciò che ho delineato sopra ... – Dmitri

risposta

0

Bene, a partire da GAE 1.5.0 sembra che i backend residenti possano essere utilizzati per creare un servizio di ricerca.

Naturalmente, per questi non esiste una quota gratuita.

1

Se stai bene con le ricostruzioni periodiche e il tuo indice è piccolo, il tuo approccio attuale suona principalmente bene. Invece di costruire l'indice online e serializzarlo sul datastore, però, perché non costruirlo offline e caricarlo con l'app? Quindi, è possibile creare un'istanza direttamente dal disk store e, per effettuare un aggiornamento, si distribuisce una nuova versione della propria app.

+0

Ho intenzione di aggiornare circa una volta all'ora, quindi raggruppare l'indice con l'app non sembra un buon modo per andare. – Dmitri

0

Per il completamento automatico, forse è possibile memorizzare le corrispondenze N in alto per ciascun prefisso (in pratica cosa si inserirà nel menu a discesa) in memcache? Le entità memcache possono essere supportate da entità nel datastore e ricaricate se necessario.

1

Recentemente GAE ha aggiunto il servizio "ricerca testo". Date un'occhiata a GAE Java Text Search

+0

Qualche idea su come gestire l'impaginazione dei risultati nell'API GAE/J FTS? Continuo a ricevere cursori nulli. Grazie. –

Problemi correlati