es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo ejecutar una búsqueda de vecino más cercano con Lucene HnswGraph.

Me gustaría usar Lucene para realizar una búsqueda del vecino más cercano. Estoy utilizando Lucene 9.0.0 en JVM 11. No encontré mucha documentación y principalmente intenté unir las cosas utilizando las pruebas existentes (https://github.com/apache/lucene/blob/54ebf3c73b72bafc414f834a15b8a3e81fd75ad8/lucene/core/src/test/org/apache/lucene/util/hnsw/TestHnswGraph.java).

Escribí una pequeña prueba que prepara un “HnswGraph”, pero hasta ahora la búsqueda no arroja el resultado esperado. Configuré un conjunto de vectores aleatorios y añadí un vector final (0.99f,0.01f) que está muy cerca de mi objetivo de búsqueda.
Desafortunadamente, la búsqueda nunca devuelve el valor esperado. No estoy seguro de cuál es mi error. Supongo que puede estar relacionado con la inserción y el orden de los ID de los documentos.

Quizás alguien que esté más familiarizado con Lucene pueda proporcionar algún comentario. ¿Es correcto mi enfoque? Estoy utilizando documentos solo para persistencia.

HnswGraphBuilder builder = new HnswGraphBuilder(vectores, funcionSimilaridad, maxConex, anchuraHaz, semilla);
HnswGraph hnsw = builder.build(vectores);

// Realizar una búsqueda
NeighborQueue nn = HnswGraph.search(
    new float[] { 1, 0 },
    10,
    10,
    vectores.randomAccess(), // ? ¿Por qué necesito especificar los valores del gráfico nuevamente?
    funcionSimilaridad, // ? ¿Por qué puedo especificar una función de similitud diferente para la búsqueda? ¿No debería ser la misma que se usó para la creación del gráfico?
    hnsw,
    null,
    new SplittableRandom(RandomUtils.nextLong()));

El código de prueba completo se puede encontrar aquí:
https://gist.github.com/Jotschi/cea21a72412bcba80c46b967e9c52b0f

Tags:  

Answer

  1. Avatar for davy.ai

    Uso de Lucene para la búsqueda del vecino más cercano

    Lucene se puede utilizar para la búsqueda del vecino más cercano mediante la implementación de un algoritmo de búsqueda de vecino aproximado (ANN, por sus siglas en inglés). Uno de los algoritmos implementados en Lucene es el algoritmo Hierarchical Navigable Small World (HNSW).

    Para utilizar el algoritmo HNSW para la búsqueda del vecino más cercano con Lucene 9.0.0 en JVM 11, se puede seguir el ejemplo en el fragmento de código proporcionado.

    Se utiliza el HnswGraphBuilder para preparar el HnswGraph con un conjunto de vectores y una función de similitud. Luego, se puede utilizar el HnswGraph para realizar una búsqueda utilizando el método HnswGraph.search().

    Sin embargo, si la búsqueda no proporciona el resultado esperado, el error puede estar relacionado con el orden de inserción y los ID de los documentos. En este caso, se recomienda verificar nuevamente el orden de los vectores en la búsqueda y en la creación del gráfico.

    Además, no está claro por qué es necesario especificar nuevamente los valores del gráfico en la búsqueda y por qué se puede especificar una función de similitud diferente. Puede ser útil consultar la documentación de Lucene o buscar ayuda en la comunidad para aclarar estos problemas.

    En general, el uso de Lucene para la búsqueda del vecino más cercano requiere familiarizarse con el algoritmo elegido e implementarlo cuidadosamente para garantizar resultados precisos.

Comments are closed.