Resumen: Recopilo los id. De doc de todos los resultados para una búsqueda determinada mediante el uso de un recopilador personalizado (rellena un BitSet con los identificadores). Los documentos de búsqueda y obtención de documentos son bastante rápidos de acuerdo con mis necesidades, pero cuando se trata de recuperar realmente los documentos del disco, las cosas se vuelven muy lentas. ¿Hay alguna forma de optimizar Lucene para una recopilación de documentos más rápida?Recopilar todos los resultados de una búsqueda en Lucene/Optimización
Detalles: Estoy trabajando en un corpus procesado de Wikipedia y guardo cada oración como un documento separado. Cuando busco "computadora", obtengo todas las oraciones que contienen el término computadora. Actualmente, buscar en el corpus y obtener todas las identificaciones de documentos funciona en menos de un segundo, pero recuperar los primeros 1000 documentos lleva unos 20 segundos. La obtención de todos los documentos lleva proporcionalmente más tiempo (es decir, otros 20 segundos para cada lote de 1000 documentos).
Las búsquedas posteriores y la obtención de documentos lleva mucho menos tiempo (aunque, no sé quién está haciendo el almacenamiento en caché, el sistema operativo o Lucene?) Pero buscaré términos diversos y no quiero confiar en el almacenamiento en caché, el rendimiento en la primera búsqueda es crucial para mí.
Estoy buscando sugerencias/trucos que mejoren el rendimiento de obtención de documentos (si es posible). ¡Gracias por adelantado!
Adición:
utilizo Lucene 3.0.0 pero yo uso Jython para conducir clases de Lucene. Lo que significa, que llame al método get_doc de la siguiente clase de Jython para cada ID doc Recuperé durante la búsqueda:
class DocumentFetcher():
def __init__(self, index_name):
self._directory = FSDirectory.open(java.io.File(index_name))
self._index_reader = IndexReader.open(self._directory, True)
def get_doc(self, doc_id):
return self._index_reader.document(doc_id)
que tienen documentos 50M en mi índice.
He trabajado con este tamaño de datos, pero no con estos muchos (50M) documentos. 20 ms es un tiempo de respuesta "bueno" cuando recupera solo algunas decenas de documentos, que es un caso típico. En este caso, dado que desea recuperar datos enormes, se siente demasiado lento. Si desea un rendimiento significativamente mejor, supongo que necesita usar mucha memoria. –
Supongo que una compensación de velocidad de memoria implicaría algún tipo de Lucene de precalentamiento (para cargar una parte significativa de los documentos en la memoria antes de llevar a cabo las operaciones de búsqueda y recuperación. Hmm, tal vez pueda guardar los documentos en una base de datos externa y espero que DB maneje los problemas de almacenamiento en caché mejor que mi solución personalizada. –
Puede hacer una llamada ficticia a FieldCache.DEFAULT.getStrings() que cargará todos los valores en ese campo. Si esa llamada sobrevive a OOME, debería ver ganancias de rendimiento con la solución que di anteriormente. –