lucene indexing lucene.net ir

lucene - Índice invertido rápido en la memoria



indexing lucene.net (4)

Estoy buscando una implementación rápida en memoria de un índice invertido genérico. Todo lo que necesito es almacenar funciones con pesos para un par de millones de entidades y usar el índice invertido para calcular las similitudes entre las entidades que usan varias funciones de distancia.

Todos los demás atributos de las entidades que puedo almacenar en algún almacén rápido de valores-clave.

Esperaba poder usar Lucene solo como un índice invertido, pero no puedo ver cómo puedo asociar con un documento mi propio vector de características personalizadas con pesos precalculados. ¡Cualquier recomendación sería muy apreciada!

Gracias.


¿Has mirado a Terrier ? No estoy seguro de que tenga índices en la memoria, pero es mucho más extensible en cuanto a la indexación y la puntuación que Lucene.


Lucene le permite almacenar casi todos los datos asociados con un documento. También tiene una función llamada "cargas útiles" que le permite almacenar datos arbitrarios en el índice asociado con un término en un documento. Así que creo que lo que quiere es almacenar sus "características" como términos en el índice, y los pesos como cargas útiles, y debería poder hacer que Lucene haga lo que quiera. Tiene una implementación de índice en memoria.


Si los pares de entidades que quiere comparar ya están dados con anticipación, y le interesan los puntajes de pares, no creo que Lucene le otorgue ninguna ventaja. Simplemente busque los vectores en algún almacén de valores-clave y calcule la similitud. Considere usar una representación vectorial dispersa para la eficiencia del espacio y el tiempo.

Si solo se da una entidad por adelantado, y usted está más interesado en una clasificación como escenario, vale la pena intentar con Lucene. El lugar correcto para mirar sería

org.apache.lucene.search.Similarity

deberías poder adaptarlo a tus necesidades y configurar tu versión como predeterminada

setDefault(Similarity similarity)

Sin embargo, tendría cuidado con las expectativas de ganancias de velocidad (iterando a través de todas), ya que dependen en gran medida de la dispersión (de la consulta) y de la función de puntuación que elija implementar. También tenga en cuenta que Lucene utiliza un esquema de recuperación de dos etapas, primer booleano ("todos los términos Y contenidos", ¿alguno de los términos O? ") Y luego puntúa qué pasa. Mientras que para tf.idf no pierde nada en el camino para otras funciones de puntuación, es posible que lo haga.

Para enfoques más generales para la búsqueda eficiente de vecinos cercanos aproximados, podría valer la pena investigar LSH:

http://en.wikipedia.org/wiki/Locality-sensitive_hashing


He estado haciendo un trabajo similar y he descubierto que el zset de redis es más o menos lo que necesito (aunque en realidad no lo estoy usando en este momento, he lanzado mi propia solución en base a archivos mapeados en memoria).

Básicamente, un zset es un conjunto ordenado de pares clave-valor.

Para que pueda tener un conjunto ordenado por característica donde cada
característica -> [{docid, puntaje}, {docid, puntaje} ..]
es decir
zadd feature score docid

redis tiene algunos buenos operadores para fusionar, extraer rangos, etc. Ver zunionstore, zrange (http://redis.io/commands/zunionstore).

Muy rápido (supuestamente) y todo en memoria, etc ... (aunque redis no es un db incrustado).