2009-03-20 8 views
6

¿Existe una manera rápida y fácil de obtener frecuencias de términos de un índice de Lucene, sin hacerlo a través de la clase TermVectorFrequencies, ya que lleva mucho tiempo para grandes colecciones?Obtener frecuencias de términos en Lucene

Lo que quiero decir es, ¿hay algo así como TermEnum que no solo tiene la frecuencia del documento, sino también la frecuencia de los términos?

ACTUALIZACIÓN: El uso de TermDocs es demasiado lento.

Respuesta

8

Utilice TermDocs para obtener la frecuencia de término para un documento dado. Al igual que la frecuencia del documento, obtiene el término documentos de IndexReader, utilizando el término de interés.


No encontrará un método más rápido que TermDocs sin perder un poco de generalidad. TermDocs lee directamente del archivo ".frq" en un segmento de índice, donde cada frecuencia de término se enumera en orden de documento.

Si eso es "demasiado lento", asegúrese de haber optimizado su índice para fusionar varios segmentos en un solo segmento. Itere sobre los documentos en orden (los saltos están bien, pero no se puede avanzar y retroceder en la lista de documentos de manera eficiente).

El siguiente paso podría ser el procesamiento adicional para crear una estructura de archivos aún más especializada que omita el SkipData. Personalmente, buscaría un algoritmo mejor para lograr mi objetivo, o proporcionaría un mejor hardware — mucha memoria, ya sea para contener un RAMDirectory, o para usarlo en su propio sistema de caché de archivos.

1

TermDocs da el TF de un término determinado en cada documento que contiene el término. Puede obtener el DF iterando a través de cada documento <, frecuencia > y contando el número de pares, aunque TermEnums debería ser más rápido. IndexReader tiene un termDocs(Term) method que devuelve un TermDocs para el término y el índice dados.

+0

¿se puede utilizar este enfoque para determinar las frecuencias de término en un conjunto de resultados de una consulta de Lucene? –

+0

¿es posible usar termDocs para obtener PhraseFrequency? – Dany

2

La versión troncal de Lucene (a ser 4.0, eventualmente) ahora expone el totalTermFreq() para cada término de TermsEnum. Este es el número total de veces que este término apareció en todo el contenido (pero, como docFreq, no tiene en cuenta las eliminaciones).

+0

Usando lucene 4.0, ¿cuál es el equivalente de td.read (doc, freq), donde td es un TermDoc y doc y freq son int []? – lizzie

Cuestiones relacionadas