{"id":15720,"date":"2024-05-15T15:19:30","date_gmt":"2024-05-15T22:19:30","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=15720"},"modified":"2025-06-13T16:36:57","modified_gmt":"2025-06-13T23:36:57","slug":"vector-search-indexing-recall-faiss","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/vector-search-indexing-recall-faiss\/","title":{"rendered":"Rendimiento de la b\u00fasqueda vectorial: El aumento de la recuperaci\u00f3n"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">La introducci\u00f3n de la b\u00fasqueda vectorial (KNN), con su puntuaci\u00f3n de similitud basada en la distancia, en el paradigma de b\u00fasqueda existente exigi\u00f3 un cambio en la forma de concebir los resultados \"relevantes\" y de medirlos.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Los \u00edndices basados en texto utilizan<\/span> <a href=\"https:\/\/docs.couchbase.com\/server\/current\/fts\/fts-scoring.html#scoring-td-idf\"><i><span style=\"font-weight: 400;\">tf-idf<\/span><\/i><\/a><span style=\"font-weight: 400;\"> como mecanismo de puntuaci\u00f3n, con los mismos resultados en todas las b\u00fasquedas, dado un corpus fijo de palabras (en este caso, los documentos de una partici\u00f3n).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">En cambio, una b\u00fasqueda KNN no garantiza el mismo nivel de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Idempotence\">idempotencia<\/a>. Los resultados son <\/span><i><span style=\"font-weight: 400;\">aproximado<\/span><\/i><span style=\"font-weight: 400;\">que a menudo difieren entre consultas. En este art\u00edculo, el equipo de b\u00fasqueda pasa de la b\u00fasqueda exacta a la aproximada. Por el camino, respondemos a preguntas sobre por qu\u00e9 <\/span><i><span style=\"font-weight: 400;\">los resultados aproximados pueden convertirse en la nueva normalidad<\/span><\/i><span style=\"font-weight: 400;\"> y cu\u00e1nta aproximaci\u00f3n es aceptable.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Preparar el escenario\u00a0<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Cada partici\u00f3n del \u00edndice de b\u00fasqueda es una <\/span><a href=\"https:\/\/blevesearch.com\/\"><span style=\"font-weight: 400;\">Bleve<\/span><\/a><span style=\"font-weight: 400;\"> \u00edndice compuesto por varios segmentos de zap (<\/span><i><span style=\"font-weight: 400;\">arquitectura segmentada<\/span><\/i><span style=\"font-weight: 400;\">), conteniendo cada segmento un \u00edndice vectorial. \u00c9stos se compactan peri\u00f3dicamente mediante una rutina de fusi\u00f3n para el \u00edndice Bleve.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Usos de la b\u00fasqueda <\/span><a href=\"https:\/\/github.com\/facebookresearch\/faiss\"><span style=\"font-weight: 400;\">FAISS<\/span><\/a><span style=\"font-weight: 400;\"> para la creaci\u00f3n de \u00edndices vectoriales, la formaci\u00f3n, la b\u00fasqueda y otras funciones relacionadas.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Las dos grandes clases de \u00edndices utilizados actualmente por Couchbase Search son:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\u00cdndices planos: realizan b\u00fasquedas exhaustivas, como si almacenaran los vectores en una matriz.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/facebookresearch\/faiss\/wiki\/Faiss-indexes#cell-probe-methods-indexivf-indexes\"><span style=\"font-weight: 400;\">\u00cdndices de FIV<\/span><\/a><span style=\"font-weight: 400;\"> - \u00cdndices basados en centroides que implican la agrupaci\u00f3n (KMeans en este caso) del conjunto de datos y, a continuaci\u00f3n, el poblamiento de esos cl\u00fasteres.<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h4><span style=\"font-weight: 400;\">Breve descripci\u00f3n de KNN\u00a0<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Como ya he comentado antes, el testware (e igualmente importante, nuestra forma de pensar) estaba predispuesto a la puntuaci\u00f3n exacta. La b\u00fasqueda por texto es <\/span><i><span style=\"font-weight: 400;\">fundamentalmente exhaustivo<\/span><\/i><span style=\"font-weight: 400;\"> en el sentido de que un \u00edndice invertido incluye todos los tokens de los documentos de la partici\u00f3n. Todos los documentos de un \u00edndice invertido son <\/span><i><span style=\"font-weight: 400;\">elegible <\/span><\/i><span style=\"font-weight: 400;\">para la b\u00fasqueda y se buscar\u00e1 a trav\u00e9s de \u00e9l.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Un \u00edndice vectorial basado en el centroide, por comparaci\u00f3n, <\/span><i><span style=\"font-weight: 400;\">limita el conjunto de vectores elegibles<\/span><\/i><span style=\"font-weight: 400;\"> de buenas a primeras, buscando \u00fanicamente en grupos espec\u00edficos, que pueden ser o no los mismos para cada consulta. Esto significa que, para una consulta determinada, la b\u00fasqueda exhaustiva, que puede llevar mucho tiempo, se sustituye por una aproximaci\u00f3n.\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">(Si la palabra \"retirada\" le ha despistado un poco, no se mueva: hablaremos de ello dentro de un rato).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Teniendo en cuenta que limitamos nuestro espacio de b\u00fasqueda desde el principio, es importante \"agrupar bien\".\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Uno de los primeros pasos en una b\u00fasqueda consiste en elegir cu\u00e1ntos y qu\u00e9 clusters buscar. Si son demasiado pocos, se pierden algunos vectores potencialmente similares. Si son demasiados, la latencia de la b\u00fasqueda aumenta considerablemente a cambio de un incremento relativamente peque\u00f1o de la calidad de la b\u00fasqueda.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La m\u00e9trica utilizada para la calidad de la b\u00fasqueda es <\/span><b>retirada<\/b><span style=\"font-weight: 400;\"> - qu\u00e9 porcentaje de los resultados devueltos son objetivamente los m\u00e1s pr\u00f3ximos a los vectores de la consulta. El conjunto de los vectores m\u00e1s cercanos al vector de consulta se denomina verdad b\u00e1sica y se utiliza como referencia para medir la recuperaci\u00f3n. Dado que la puntuaci\u00f3n KNN es la distancia entre dos vectores, es <\/span><i><span style=\"font-weight: 400;\">independiente de los dem\u00e1s documentos<\/span><\/i><span style=\"font-weight: 400;\"> en la partici\u00f3n (a diferencia del tf-idf) y, lo que es m\u00e1s importante, esto ayuda a realizar una comparaci\u00f3n objetiva entre la verdad sobre el terreno evaluada de forma independiente y el resultado.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Cu\u00e1nto (aproximado) es demasiado (aproximado): Recuerdo de conducci\u00f3n de 0,06 a 90+:<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Con todos estos conocimientos, decidimos empezar a hacer pruebas de recuperaci\u00f3n. Nuestras primeras pruebas mostraron un recuerdo sorprendentemente bajo, cercano al 0, 0,06 para ser precisos.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Aunque hab\u00edamos descargado la b\u00fasqueda de \u00edndices vectoriales a FAISS, hab\u00eda algunos aspectos que deb\u00edamos gestionar desde nuestro lado. Uno de ellos es la asignaci\u00f3n de ID de documentos a los vectores. La b\u00fasqueda asigna cada n\u00famero de documento a un hash vectorial \u00fanico. Estos hashes se pasan como <\/span><a href=\"https:\/\/github.com\/blevesearch\/go-faiss\/blob\/master\/index.go#L45\"><span style=\"font-weight: 400;\">ID personalizados a FAISS<\/span><\/a><span style=\"font-weight: 400;\"> para aprovechar el soporte para mapear vectores a ID personalizados y las b\u00fasquedas devuelven el ID personalizado. Teniendo en cuenta que los vectores (cada uno de los cuales tiene el mismo tama\u00f1o) est\u00e1n concatenados en un gran vector y tambi\u00e9n lo est\u00e1n los ID, conseguir el orden correcto determina el mapeo del vector al ID. Internamente, FAISS utiliza un hashmap para almacenar los vectores y sus IDs.<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">[,,...],[id1,id2,...id_n] =&gt; vec1 \u2192 id1, vec2 \u2192 id2, ... vec_n \u2192 id_n<\/pre>\n<p><span style=\"font-weight: 400;\">Un examen m\u00e1s detallado mostr\u00f3 que est\u00e1bamos asignando ID ordenados aleatoriamente a vectores al reconstruir \u00edndices durante una fusi\u00f3n, lo que provocaba que el conjunto de resultados fuera esencialmente aleatorio. Esto afectaba tanto a los \u00edndices planos como a los IVF, ya que ambos se basaban en el m\u00e9todo <\/span><i><span style=\"font-weight: 400;\">solicitud <\/span><\/i><span style=\"font-weight: 400;\">de los ID al recuperar los resultados.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Una vez resuelto el problema del orden, junto con algunas otras correcciones de la ruta de fusi\u00f3n, la retirada se elev\u00f3 a unos 70 usuarios. Ahora \u00edbamos por el buen camino: no ten\u00edamos ning\u00fan error fundamental que nos afectara. Empezamos a echar un vistazo a los botones que pod\u00edamos ajustar.\u00a0<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Girar mandos - Centroides y Nprobe<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">La estrategia inicial utilizaba un n\u00famero fijo (100) de centroides para todos los \u00edndices vectoriales con m\u00e1s de 10.000 vectores. En esencia, se trataba igual a 1M de vectores que a 20k vectores.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La agrupaci\u00f3n FAISS por defecto tiene un n\u00famero m\u00ednimo (39) y m\u00e1ximo (256) de puntos por agrupaci\u00f3n. Los puntos restantes son submuestreados. 100 centroides pueden haber sido suficientes para 100 * 256 = 25600 vectores como m\u00e1ximo, pero para cualquier cosa por encima de eso, hab\u00eda <\/span><i><span style=\"font-weight: 400;\">exceso de<\/span><\/i><span style=\"font-weight: 400;\"> submuestreo, como se refleja en la recuperaci\u00f3n.  Lo que necesit\u00e1bamos era una f\u00f3rmula para los centroides que se ajustara al conjunto de datos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Qu\u00e9 queremos optimizar: <em>R<\/em><\/span><span style=\"font-weight: 400;\"><em>ecall@K<\/em>sin que la indexaci\u00f3n y la latencia de b\u00fasqueda se resientan demasiado, si es posible.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>Configurar<\/strong><\/span><\/p>\n<p><span style=\"font-weight: 400;\">La configuraci\u00f3n era bastante sencilla: los scripts creaban un \u00edndice FAISS (formaci\u00f3n y adici\u00f3n de ID) y los consultaban, conociendo de antemano los resultados de la verdad sobre el terreno. Utilic\u00e9 el <\/span><span style=\"font-weight: 400;\">SIFT10K y SIFT1M<\/span><span style=\"font-weight: 400;\"> conjuntos de datos del <\/span><span style=\"font-weight: 400;\">documento original<\/span><span style=\"font-weight: 400;\"> ya que proporcionaron vectores de referencia utilizando la distancia eucl\u00eddea. El recall@K es la media de 100\/10k consultas respectivamente.<\/span><\/p>\n<p><strong>Aumento de los centroides<\/strong><\/p>\n<p>La primera fase consisti\u00f3 en ajustar el n\u00famero de conglomerados.<\/p>\n<p>Resultados de Sift1M - <span style=\"font-weight: 400;\">10.000 consultas<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><strong># centroides<\/strong><\/td>\n<td><strong>Tiempo de formaci\u00f3n<\/strong><\/td>\n<td><strong>Tiempo de b\u00fasqueda<\/strong><\/td>\n<td><strong>retirada@100<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">100<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.83<\/span><\/td>\n<td><span style=\"font-weight: 400;\">20.72<\/span><\/td>\n<td><span style=\"font-weight: 400; color: #ff0000;\">0.61<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">200<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.856<\/span><\/td>\n<td><span style=\"font-weight: 400;\">14.423<\/span><\/td>\n<td><span style=\"font-weight: 400;\">0.558<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">500<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4.75<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4.101<\/span><\/td>\n<td><span style=\"font-weight: 400;\">0.4833<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">1000<\/span><\/td>\n<td><span style=\"font-weight: 400;\">15.13<\/span><\/td>\n<td><span style=\"font-weight: 400;\">2.4113<\/span><\/td>\n<td><span style=\"font-weight: 400;\">0.43<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Resultados de Sift10k - <\/span><span style=\"font-weight: 400;\">100 consultas<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><strong># centroides<\/strong><\/td>\n<td><strong>Tiempo de entrenamiento (ms)<\/strong><\/td>\n<td><strong>Tiempo de b\u00fasqueda (ms)<\/strong><\/td>\n<td><strong>retirada@100<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">10<\/span><\/td>\n<td><span style=\"font-weight: 400;\">30.78<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1370<\/span><\/td>\n<td><span style=\"font-weight: 400; color: #ff0000;\">0.82<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">50<\/span><\/td>\n<td><span style=\"font-weight: 400;\">103<\/span><\/td>\n<td><span style=\"font-weight: 400;\">368.9<\/span><\/td>\n<td><span style=\"font-weight: 400;\">0.69<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">100<\/span><\/td>\n<td><span style=\"font-weight: 400;\">100<\/span><\/td>\n<td><span style=\"font-weight: 400;\">188.48<\/span><\/td>\n<td><span style=\"font-weight: 400;\">0.6<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Perspectivas<\/strong><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La l\u00ednea de base actual muestra un recuerdo de 0,61, que sin duda puede mejorarse.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La retirada <\/span><i><span style=\"font-weight: 400;\">disminuye<\/span><\/i><span style=\"font-weight: 400;\"> con el aumento del n\u00famero de centroides.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">El tiempo de b\u00fasqueda disminuye gracias a<\/span> <i><span style=\"font-weight: 400;\">localizaci\u00f3n creciente<\/span><\/i><span style=\"font-weight: 400;\"> aunque aumente el tiempo de entrenamiento.<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">A la inversa, el tiempo de b\u00fasqueda aumenta, a pesar del bajo tiempo de entrenamiento, para un menor n\u00famero de centroides, ya que esto implica buscar en celdas m\u00e1s grandes con un mayor n\u00famero de vectores.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Una vez establecido que el aumento de los centroides tiene un impacto negativo en el recuerdo, intentemos comprender intuitivamente por qu\u00e9 es as\u00ed.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Con un conjunto de datos de tama\u00f1o fijo, aumentar el n\u00famero de centroides podr\u00eda disminuir el n\u00famero de documentos de cada cl\u00faster. Con clusters m\u00e1s peque\u00f1os <\/span><i><span style=\"font-weight: 400;\">buscar menos vectores en general<\/span><\/i><span style=\"font-weight: 400;\"> y elige los K vectores m\u00e1s cercanos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por lo tanto, un aumento del n\u00famero de conglomerados deber\u00eda ir acompa\u00f1ado de un <\/span><i><span style=\"font-weight: 400;\">aumento correspondiente del n\u00famero de conglomerados buscados.<\/span><\/i><\/p>\n<p><strong>Aumentar nprobe<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">Sift1M - <\/span>10.000 consultas<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>nlist<\/strong><\/td>\n<td><strong>nprobe<\/strong><\/td>\n<td><strong>Tiempo de formaci\u00f3n<\/strong><\/td>\n<td><strong>Tiempo total de b\u00fasqueda<\/strong><\/td>\n<td><strong>retirada@100<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">100 (base actual)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.43<\/span><\/td>\n<td><span style=\"font-weight: 400;\">21.24\u00a0<\/span><\/td>\n<td><span style=\"color: #ff0000;\"><b>0.61<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">100<\/span><\/td>\n<td><span style=\"font-weight: 400;\">10<\/span><\/td>\n<td><span style=\"font-weight: 400;\">0.778<\/span><\/td>\n<td><span style=\"font-weight: 400; color: #ff0000;\">119.5<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.993<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">200<\/span><\/td>\n<td><span style=\"font-weight: 400;\">14<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.12<\/span><\/td>\n<td><span style=\"font-weight: 400;\">84.54<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.99<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">500<\/span><\/td>\n<td><span style=\"font-weight: 400;\">22<\/span><\/td>\n<td><span style=\"font-weight: 400;\">3.23<\/span><\/td>\n<td><span style=\"font-weight: 400;\">52.80<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.988<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">1000<\/span><\/td>\n<td><span style=\"font-weight: 400;\">31<\/span><\/td>\n<td><span style=\"font-weight: 400;\">10.033<\/span><\/td>\n<td><span style=\"font-weight: 400;\">37.79<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.988<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">2000<\/span><\/td>\n<td><span style=\"font-weight: 400;\">44<\/span><\/td>\n<td><span style=\"font-weight: 400;\">36.36<\/span><\/td>\n<td><span style=\"font-weight: 400;\">27.61<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.985<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">3000<\/span><\/td>\n<td><span style=\"font-weight: 400;\">54<\/span><\/td>\n<td><span style=\"font-weight: 400;\">80.94<\/span><\/td>\n<td><span style=\"font-weight: 400;\">22.74<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.985<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">3906 (1M\/256)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">62<\/span><\/td>\n<td><span style=\"font-weight: 400;\">134.61<\/span><\/td>\n<td><span style=\"font-weight: 400;\">20s<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.984<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">4000<\/span><\/td>\n<td><span style=\"font-weight: 400;\">32<\/span><\/td>\n<td><span style=\"font-weight: 400;\">136.71<\/span><\/td>\n<td><span style=\"font-weight: 400;\">10.09<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.956<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">4000<\/span><\/td>\n<td><span style=\"font-weight: 400;\">64<\/span><\/td>\n<td><span style=\"font-weight: 400;\">138.57<\/span><\/td>\n<td><span style=\"font-weight: 400;\">20.36<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.987<\/b><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Sift10k - <\/span>100 consultas<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>nlist<\/strong><\/td>\n<td><strong>nprobe<\/strong><\/td>\n<td><strong>Tiempo de formaci\u00f3n<\/strong><\/td>\n<td><strong>Tiempo total de b\u00fasqueda<\/strong><\/td>\n<td><strong>retirada@100<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">10<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">33,85 ms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.52s<\/span><\/td>\n<td><span style=\"color: #99cc00;\"><b>0.82<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">39 (10000\/256)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">6<\/span><\/td>\n<td><span style=\"font-weight: 400;\">70,6 ms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.91s<\/span><\/td>\n<td><span style=\"color: #99cc00;\"><b>0.96<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">50<\/span><\/td>\n<td><span style=\"font-weight: 400;\">7<\/span><\/td>\n<td><span style=\"font-weight: 400;\">70,26 ms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.68s<\/span><\/td>\n<td><span style=\"color: #008000;\"><b>0.99<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">100<\/span><\/td>\n<td><span style=\"font-weight: 400;\">5<\/span><\/td>\n<td><span style=\"font-weight: 400;\">91,5 ms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">677,14 ms<\/span><\/td>\n<td><span style=\"color: #339966;\"><b>0.9<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">100<\/span><\/td>\n<td><span style=\"font-weight: 400;\">10<\/span><\/td>\n<td><span style=\"font-weight: 400;\">99ms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1.317s<\/span><\/td>\n<td><span style=\"color: #99cc00;\"><b>0.96<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">200<\/span><\/td>\n<td><span style=\"font-weight: 400;\">14<\/span><\/td>\n<td><span style=\"font-weight: 400;\">133,26 ms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">930,2 ms<\/span><\/td>\n<td><span style=\"color: #339966;\"><b>1.0<\/b><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Perspectivas<\/strong><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Para el conjunto de datos 1M, la recuperaci\u00f3n de referencia es baja debido a <em>nprobe = 1<\/em>.<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Una vez solucionado, la recuperaci\u00f3n aumenta r\u00e1pidamente y deja de ser un problema, a pesar del submuestreo.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Sin embargo, <\/span><i><span style=\"font-weight: 400;\">una gran capacidad de recuperaci\u00f3n conlleva una mayor latencia de b\u00fasqueda.<\/span><\/i><span style=\"font-weight: 400;\">\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">En el caso del conjunto de datos de 10.000, la recuperaci\u00f3n de referencia, aunque no es tan baja como la del conjunto de datos de 1.000, sigue siendo preocupante.<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Esto tambi\u00e9n se remedia f\u00e1cilmente aumentando <em>nprobe<\/em>.\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Los valores por defecto para determinar nlist y nprobe se cambiaron entonces a:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">si nVecs &gt;= 1M:\r\n     nlist = 4 * \u221anVecs\r\n     \/\/ A partir de un cierto n\u00famero de vectores,\r\n       \/\/ aumentar nlist no aumenta la recuperaci\u00f3n.\r\nsi nVecs &gt;= 1000:\r\n     nlist = nVecs\/100\r\n     \/\/ 100 puntos por cluster parece un\r\n       \/\/ punto medio razonable entre el m\u00ednimo\r\n       \/\/ y el m\u00e1ximo de puntos por cluster.\r\nnprobe = \u221anlist<\/pre>\n<p><span style=\"font-weight: 400;\">Basta decir que as\u00ed es como se sinti\u00f3 el equipo una vez que encontramos una soluci\u00f3n al problema de la retirada:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-15721\" style=\"border: solid 1px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/Screenshot-2024-05-15-at-3.49.17\u202fPM-732x1024.png\" alt=\"\" width=\"349\" height=\"488\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.49.17\u202fPM-732x1024.png 732w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.49.17\u202fPM-214x300.png 214w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.49.17\u202fPM-768x1074.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.49.17\u202fPM-300x420.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.49.17\u202fPM.png 862w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><br style=\"font-weight: 400;\" \/><br style=\"font-weight: 400;\" \/><\/p>\n<h3><span style=\"font-weight: 400;\">Ajuste de un \u00edndice vectorial<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Afinar un \u00edndice vectorial Couchbase definitivamente no es algo para sudar.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-15722\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/Screenshot-2024-05-15-at-3.55.07\u202fPM.png\" alt=\"\" width=\"278\" height=\"385\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.55.07\u202fPM.png 582w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.55.07\u202fPM-217x300.png 217w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/Screenshot-2024-05-15-at-3.55.07\u202fPM-300x415.png 300w\" sizes=\"auto, (max-width: 278px) 100vw, 278px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Dado que el equilibrio entre recuperaci\u00f3n y latencia es crucial en la b\u00fasqueda vectorial, quer\u00edamos que el usuario tuviera cierta flexibilidad a la hora de inclinarse. Adem\u00e1s de las consideraciones relativas al usuario, como la facilidad de comprensi\u00f3n y la intuitividad, la compatibilidad con el futuro y la arquitectura segmentada implicaban algunas limitaciones en la API.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Cada segmento es un \u00edndice vectorial con un n\u00famero diferente de vectores. En el momento de la consulta, un <\/span><i><span style=\"font-weight: 400;\">el usuario no es consciente de la distribuci\u00f3n de los datos<\/span><\/i><span style=\"font-weight: 400;\"> a nivel de partici\u00f3n, y mucho menos a nivel de segmento. Dependiendo de la naturaleza de las mutaciones (gran n\u00famero de borrados, por ejemplo), el <\/span><i><span style=\"font-weight: 400;\">el n\u00famero de vectores puede variar bastante<\/span><\/i><span style=\"font-weight: 400;\"> al fusionar segmentos. Por lo tanto, un <\/span><i><span style=\"font-weight: 400;\">no se puede aplicar un enfoque \u00fanico para todos los segmentos<\/span><\/i><span style=\"font-weight: 400;\">.\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Adem\u00e1s, la compatibilidad con el futuro exige que el<\/span><i><span style=\"font-weight: 400;\"> los mandos no son espec\u00edficos de un tipo de \u00edndice FAISS<\/span><\/i><span style=\"font-weight: 400;\"> ya que se trata de un \u00e1rea que, en su mayor parte, deber\u00eda abstraerse del usuario, a pesar de cambiar los tipos de \u00edndice que se utilizan en la implementaci\u00f3n. Por ejemplo, si el usuario especifica <em>nprobe<\/em> o <em>nlist<\/em> ser\u00eda muy espec\u00edfico del \u00edndice IVF y supondr\u00eda un cambio radical si cambiasen los tipos de \u00edndice que alimentan la b\u00fasqueda vectorial.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Permitir al usuario <\/span><i><span style=\"font-weight: 400;\">alternar qu\u00e9 m\u00e9trica optimizar <\/span><\/i><span style=\"font-weight: 400;\">(recall\/latencia) se ajusta a la perfecci\u00f3n. Aunque el ajuste de la recuperaci\u00f3n se realiza de forma diferente para un \u00edndice IVF y, por ejemplo, para un \u00edndice HNSW, la recuperaci\u00f3n es aplicable a ambos y puede ajustarse a nivel de segmento. En los datos anteriores, si se duplica nprobe, se duplica el tiempo de b\u00fasqueda, pero el aumento correspondiente de la recuperaci\u00f3n es de unos pocos puntos. Por tanto, al optimizar la latencia, reducir a la mitad el \u00edndice <em>nprobe<\/em> mejora la latencia sin afectar demasiado a la capacidad de recuperaci\u00f3n.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El ajuste de definici\u00f3n del \u00edndice en el que el usuario puede alternar entre recuperaci\u00f3n y latencia puede modificarse es <em>vector_index_optimized_for<\/em>. Esta configuraci\u00f3n est\u00e1 documentada en la documentaci\u00f3n oficial.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Permanezca atento para conocer m\u00e1s detalles y novedades sobre Couchbase Vector Search.<\/span><\/p>\n<p><br style=\"font-weight: 400;\" \/><br style=\"font-weight: 400;\" \/><\/p>","protected":false},"excerpt":{"rendered":"<p>Introducing vector search (KNN), with its distance-based similarity scoring, into the existing Search paradigm necessitated a shift in how we thought about \u201crelevant\u201d results and how to measure them.\u00a0 Text based indexes use tf-idf as their scoring mechanism with the [&hellip;]<\/p>","protected":false},"author":85141,"featured_media":15725,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[10122,1821,2225,1816,9417,9936,9937],"tags":[9961,1696],"ppma_author":[9962],"class_list":["post-15720","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artificial-intelligence-ai","category-couchbase-architecture","category-cloud","category-couchbase-server","category-performance","category-search","category-vector-search","tag-faiss","tag-indexing"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vector Search Performance: The Rise of Recall - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Since the recall\/latency tradeoff is a crucial one in vector search, we wanted to allow the user some flexibility in which way they wanted to lean.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/vector-search-indexing-recall-faiss\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vector Search Performance: The Rise of Recall\" \/>\n<meta property=\"og:description\" content=\"Since the recall\/latency tradeoff is a crucial one in vector search, we wanted to allow the user some flexibility in which way they wanted to lean.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/vector-search-indexing-recall-faiss\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-15T22:19:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T23:36:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"625\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Aditi Ahuja, Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Aditi Ahuja, Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/\"},\"author\":{\"name\":\"Aditi Ahuja, Software Engineer\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/efea1290226a380570a7a86c651090a0\"},\"headline\":\"Vector Search Performance: The Rise of Recall\",\"datePublished\":\"2024-05-15T22:19:30+00:00\",\"dateModified\":\"2025-06-13T23:36:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/\"},\"wordCount\":1576,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png\",\"keywords\":[\"FAISS\",\"Indexing\"],\"articleSection\":[\"Artificial Intelligence (AI)\",\"Couchbase Architecture\",\"Couchbase Capella\",\"Couchbase Server\",\"High Performance\",\"Search\",\"Vector Search\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/\",\"name\":\"Vector Search Performance: The Rise of Recall - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png\",\"datePublished\":\"2024-05-15T22:19:30+00:00\",\"dateModified\":\"2025-06-13T23:36:57+00:00\",\"description\":\"Since the recall\/latency tradeoff is a crucial one in vector search, we wanted to allow the user some flexibility in which way they wanted to lean.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png\",\"width\":1200,\"height\":625},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vector Search Performance: The Rise of Recall\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/efea1290226a380570a7a86c651090a0\",\"name\":\"Aditi Ahuja, Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a3eb898818ce7bdfc1b89af35c10b1f5\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c7e80b3dd70704a52cc5d032f55449eb2bc253009a8495c7a53ea50a14a014a8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c7e80b3dd70704a52cc5d032f55449eb2bc253009a8495c7a53ea50a14a014a8?s=96&d=mm&r=g\",\"caption\":\"Aditi Ahuja, Software Engineer\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/aditi\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vector Search Performance: The Rise of Recall - The Couchbase Blog","description":"Since the recall\/latency tradeoff is a crucial one in vector search, we wanted to allow the user some flexibility in which way they wanted to lean.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/vector-search-indexing-recall-faiss\/","og_locale":"es_MX","og_type":"article","og_title":"Vector Search Performance: The Rise of Recall","og_description":"Since the recall\/latency tradeoff is a crucial one in vector search, we wanted to allow the user some flexibility in which way they wanted to lean.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/vector-search-indexing-recall-faiss\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-05-15T22:19:30+00:00","article_modified_time":"2025-06-13T23:36:57+00:00","og_image":[{"width":1200,"height":625,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png","type":"image\/png"}],"author":"Aditi Ahuja, Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Aditi Ahuja, Software Engineer","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/"},"author":{"name":"Aditi Ahuja, Software Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/efea1290226a380570a7a86c651090a0"},"headline":"Vector Search Performance: The Rise of Recall","datePublished":"2024-05-15T22:19:30+00:00","dateModified":"2025-06-13T23:36:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/"},"wordCount":1576,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png","keywords":["FAISS","Indexing"],"articleSection":["Artificial Intelligence (AI)","Couchbase Architecture","Couchbase Capella","Couchbase Server","High Performance","Search","Vector Search"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/","url":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/","name":"Vector Search Performance: The Rise of Recall - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png","datePublished":"2024-05-15T22:19:30+00:00","dateModified":"2025-06-13T23:36:57+00:00","description":"Since the recall\/latency tradeoff is a crucial one in vector search, we wanted to allow the user some flexibility in which way they wanted to lean.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/latency-no-sweat-1.png","width":1200,"height":625},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/vector-search-indexing-recall-faiss\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vector Search Performance: The Rise of Recall"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/efea1290226a380570a7a86c651090a0","name":"Aditi Ahuja, Ingeniera de Software","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a3eb898818ce7bdfc1b89af35c10b1f5","url":"https:\/\/secure.gravatar.com\/avatar\/c7e80b3dd70704a52cc5d032f55449eb2bc253009a8495c7a53ea50a14a014a8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c7e80b3dd70704a52cc5d032f55449eb2bc253009a8495c7a53ea50a14a014a8?s=96&d=mm&r=g","caption":"Aditi Ahuja, Software Engineer"},"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/aditi\/"}]}},"authors":[{"term_id":9962,"user_id":85141,"is_guest":0,"slug":"aditi","display_name":"Aditi Ahuja, Software Engineer","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/c7e80b3dd70704a52cc5d032f55449eb2bc253009a8495c7a53ea50a14a014a8?s=96&d=mm&r=g","author_category":"","last_name":"Ahuja, Software Engineer","first_name":"Aditi","job_title":"","user_url":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/15720","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/85141"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=15720"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/15720\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/15725"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=15720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=15720"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=15720"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=15720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}