El algoritmo k-vecino más cercano (kNN) realiza una búsqueda de similitud en campos de dense_vector tipo. Este tipo de búsqueda, que se denomina más apropiadamente "kNN aproximado", acepta un vector o incrustación como término de búsqueda y encuentra entradas en el índice que están cercanas.
En esta sección vas a aprender a realizar una búsqueda kNN usando las incrustaciones de documentos creadas en la sección anterior.
La consulta
En la sección de búsqueda en texto completo del tutorial aprendiste sobre la opción de consulta que pasó al método search() del cliente Elasticsearch. Al buscar vectores, se emplea la opción knn en su lugar.
A continuación puedes ver una nueva versión de la función handle_search() en app.py que ejecuta una búsqueda kNN para la consulta introducida por el usuario en el formulario de búsqueda.
En esta versión de la función, la opción query fue reemplazada por knn. Las opciones de paginación size y from_ siguen igual, y todo lo demás en la función y la plantilla de index.html también es igual que antes.
La opción de búsqueda knn acepta varios parámetros que configuran la búsqueda:
field: el campo en el índice para buscar. El campo debe tener un tipodense_vector.query_vector: la incrustación que buscar. Esto debería ser una incrustación generada a partir del texto de búsqueda.num_candidates: el número de documentos candidatos a considerar de cada fragmento. Elasticsearch recupera esta cantidad de candidatos de cada fragmento, los combina en una sola lista y luego encuentra la "k" más cercana para devolver como resultado.k: el número de resultados que se detienen. Este número tiene un efecto directo en el rendimiento, por lo que debe mantener lo más pequeño posible. El valor transmitido en esta opción debe ser menor quenum_candidates.
Con los ajustes usados en el código anterior, se devolverán los 10 mejores resultados de coincidencia.
Puedes experimentar con esta nueva versión de la aplicación. Aquí tienes un par de buenos ejemplos para apreciar lo útil que es este tipo de búsqueda:
- Buscando "holiday", que es el equivalente británico de "vacation" en inglés americano, la búsqueda kNN devuelve el documento "Vacation Policy" como resultado principal, aunque la palabra holiday en sí no aparece en el documento.
- Buscar "gatos y perros" o cualquier otro término relacionado con mascotas muestra el documento "Política de Mascotas de Oficina" como resultado principal, aunque el resumen del documento no mencione ninguna mascota específica.
Uso de filtros en consultas kNN
La consulta de búsqueda, tal como se define en la sección de texto completo de este tutorial, permitía al usuario aplicar que se usara una categoría específica, usando la category:<category-name> sintáctica en cualquier lugar del texto de búsqueda. La función extract_filters() en app.py se encarga de encontrar y separar estas expresiones de filtro de la consulta de búsqueda. En la versión de la función handle_search() de la sección anterior no se emplea la variable filters , por lo que se ignoran los filtros de categoría.
Por suerte, la opción knn también permite filtrado. La opción de filtro en realidad acepta el mismo tipo de filtros, por lo que los filtros pueden insertar directamente en la consulta knn , exactamente como los devuelve la función extract_filters() :
Las agregaciones también funcionan bien en consultas kNN, por lo que también pueden agregar:
Esta versión de la función handle_search() tiene la misma funcionalidad que la versión de búsqueda en texto completo, implementada mediante búsqueda vectorial en lugar de búsqueda basada en palabras clave.
En la siguiente sección, aprenderás a combinar resultados de estos dos métodos de búsqueda diferentes.
Previamente
Almacenamiento de incrustacionesPróximo
Búsqueda híbrida