2010-12-11 19 views
6

Existen algunos hilos de discusión sobre el tema, pero creo que mi caso de uso es algo diferente.Búsqueda de texto completo en Google App Engine (Java)

Lo que quiero hacer:

  • completo componente de búsqueda de texto para mi GAE/J aplicación
  • El tamaño del índice es pequeño: 25-50MB más o menos
  • No necesito actualizar en tiempo real a el índice, una revisión periódica de dicha indexación está bien
  • Esto es para auto-completar y similares, por lo que debe ser extremadamente rápido (me da la impresión de que la aplicación de un índice invertido en el almacén de datos introduce latencia considerable)

Mi estrategia hasta el momento (simplemente planeando, no han intentado implementar nada todavía):

  • Uso Lucene con RAMDirectory
  • una tarea programada periódica crea el índice, serializa al almacén de datos, almacena una actualización Identificación del (o marca de tiempo)
  • Buscar servlets carga el índice en el arranque y crea la RAMDirectory
  • en cada petición al servlet comprueba el actual identificador de actualización y vuelve a cargar el índice según sea necesario

Lo principal de lo que estoy confundido es cómo sincronizar los datos en memoria entre las instancias: ¿funcionará, o me falta algo?

Además, ¿qué tan lejos puedo presionarlo antes de comenzar a tener problemas con el uso de la memoria? No pude encontrar nada en las cuotas de RAM para GAE. (Este índice es pequeño, pero puedo pensar en más cosas que me gustaría agregar)

Y, por supuesto, ¿alguna reflexión sobre mejores enfoques?

+0

memoria es separada entre instancias GAE, por lo que un directorio de memoria RAM recto-para arriba no sería compartido entre ellos. Tendría que inicializarlo para cada instancia al inicio. Lo cual podría no ser tan malo teniendo en cuenta los nuevos servidores en espera y las solicitudes de preparación. –

+0

Bueno, sí, eso es parte de lo que describí anteriormente ... – Dmitri

Respuesta

0

Bueno, a partir de GAE 1.5.0 parece residente Backends se puede utilizar para crear un servicio de búsqueda.

Por supuesto, no hay cuota libre de estos.

1

Si está de acuerdo con las reconstrucciones periódicas, y su índice es pequeño, su enfoque actual suena principalmente bien. En lugar de construir el índice en línea y serializarlo en el almacén de datos, ¿por qué no construirlo sin conexión y cargarlo con la aplicación? Luego, puede crear una instancia directamente desde la tienda de discos, y para enviar una actualización, implementa una nueva versión de su aplicación.

+0

Voy a actualizar una vez por hora, por lo que agrupar el índice con la aplicación no parece una buena forma de hacerlo. – Dmitri

0

Para autocompletar, ¿podría almacenar las N coincidencias principales para cada prefijo (básicamente lo que pondría en el menú desplegable) en Memcache? Las entidades de Memcache pueden ser respaldadas por entidades en el almacén de datos y recargados si es necesario.

1

Recientemente GAE ha agregado el servicio de "búsqueda de texto". Echar un vistazo a GAE Java Text Search

+0

¿Alguna idea de cómo manejar la paginación de resultados en la API GAE/J FTS? Sigo obteniendo cursores nulos. Gracias. –