2010-01-20 11 views
5

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.

+0

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. –

+0

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. –

+0

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. –

Respuesta

2

Usted, probablemente, está almacenando mucha información en el documento. Reduzca los campos almacenados tanto como pueda.

En segundo lugar, al recuperar campos, seleccione solo los campos que necesita. Puede usar el siguiente método de IndexReader para especificar solo algunos de los campos almacenados.

public abstract Document document(int n, FieldSelector fieldSelector) 

De esta forma no se cargan los campos que no se utilizan.

Puede utilizar el siguiente ejemplo de código.

FieldSelector idFieldSelector = 
new SetBasedFieldSelector(Collections.singleton("idFieldName"), Collections.emptySet()); 
for (int i: resultDocIDs) { 
String id = reader.document(i, idFieldSelector).get("idFieldName"); 
} 
+0

Gracias por la sugerencia y la muestra del código. No sabía acerca de FieldSelector, podría ser útil en el futuro. Pero, almaceno solo un campo en el documento y eso es lo que tengo que buscar al final. El único campo que almaceno es solo la oración misma más algunas anotaciones gramaticales. Eso significa que para un solo documento (es decir, una frase) no almaceno más de 300-400 bytes. (Información adicional: he indexado alrededor de 50 millones de documentos) –

Cuestiones relacionadas