{"id":7700,"date":"2019-09-25T14:07:00","date_gmt":"2019-09-25T21:07:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7700"},"modified":"2025-06-13T20:59:09","modified_gmt":"2025-06-14T03:59:09","slug":"introducing-fts-with-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/introducing-fts-with-n1ql\/","title":{"rendered":"Presentaci\u00f3n del FTS con N1QL"},"content":{"rendered":"<h5><b>Temas que tratar\u00e1 este art\u00edculo<\/b><\/h5>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">\u00bfQu\u00e9 tiene de bueno N1QL?<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">\u00bfY el FTS?<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Pero, \u00bfpor qu\u00e9 FTS dentro de N1QL?<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Consultas b\u00e1sicas N1QL+FTS<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Implantaci\u00f3n de N1QL+FTS<\/span>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Sintaxis<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Capacidades y limitaciones<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">N1QL+FTS Internos<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Consultas con \u00edndice cubierto frente a consultas sin \u00edndice cubierto<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">M\u00e1s ejemplos de consultas N1QL+FTS<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">\u00bfY ahora qu\u00e9?<\/span><\/li>\n<\/ol>\n<h4><strong>1. Couchbase <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/learn\/services-and-indexes\/services\/query-service.html\">N1QL<\/a><\/strong><\/h4>\n<ul>\n<li><span style=\"font-weight: 400;\">N1QL es la oferta SQL de Couchbase para manipular datos JSON almacenados en el servidor couchbase.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Las sentencias N1QL se pueden utilizar para crear, modificar, eliminar \u00edndices y seleccionar, insertar, actualizar, eliminar y volver a insertar datos en documentos JSON.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Las expresiones N1QL permiten al usuario realizar operaciones de agregaci\u00f3n, aritm\u00e9ticas, de colecci\u00f3n, de comparaci\u00f3n, condicionales y varias m\u00e1s.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Todo ello con el apoyo de \u00edndices secundarios que permiten realizar estas operaciones con gran eficacia.<\/span><\/li>\n<\/ul>\n<h4><strong>2. Couchbase <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/learn\/services-and-indexes\/services\/search-service.html\">FTS<\/a><\/strong><\/h4>\n<ul>\n<li><span style=\"font-weight: 400;\">La oferta de b\u00fasqueda de texto completo de Couchbase proporciona amplias capacidades de consulta en lenguaje natural y est\u00e1 pensada para permitir a los usuarios buscar texto en m\u00faltiples campos de documentos JSON almacenados en un servidor Couchbase.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Admite b\u00fasquedas en funci\u00f3n del idioma y resultados de puntuaci\u00f3n basados en la relevancia que puede configurar el usuario.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">El FTS crea \u00edndices r\u00e1pidos especialmente dise\u00f1ados para gestionar con gran eficacia una amplia gama de cargas de trabajo de b\u00fasqueda de texto.<\/span><\/li>\n<\/ul>\n<h4><b>3. \u00bfPor qu\u00e9 apoyar el FTS a trav\u00e9s de N1QL?<\/b><\/h4>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Las consultas N1QL pueden realizar b\u00fasquedas en cadenas, n\u00fameros, matrices, etc. y, con indexaci\u00f3n secundaria (\u00edndice b-tree), tambi\u00e9n admiten b\u00fasquedas puntuales y escaneos de rangos, pero FTS ofrece rendimiento para la b\u00fasqueda de texto (consultas compuestas simples y complejas) con el apoyo de su \u00edndice invertido subyacente.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Las aplicaciones necesitan poder aprovechar ambas capacidades utilizando una API y un lenguaje \u00fanicos.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Soporte de operaciones compuestas\/complejas como la aplicaci\u00f3n de agregaciones, operaciones aritm\u00e9ticas y otras operaciones SQL sobre resultados FTS para facilitar el desarrollo.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Ampliar la visibilidad de FTS (m\u00e1s all\u00e1 del SDK, curl o la interfaz de usuario de Couchbase).<\/span><\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-7703 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/n1ql_n1fty_flow-1.jpg\" alt=\"\" width=\"608\" height=\"266\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1ql_n1fty_flow-1.jpg 608w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1ql_n1fty_flow-1-300x131.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1ql_n1fty_flow-1-20x9.jpg 20w\" sizes=\"auto, (max-width: 608px) 100vw, 608px\" \/><b><\/b><\/p>\n<h4><b>4. N1QL + FTS<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Couchbase 6.5 soportar\u00e1 la interfaz propuesta entre N1QL y FTS. El usuario todav\u00eda tendr\u00e1 que configurar \u00edndices FTS para apoyar su caso de uso al igual que con <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/learn\/services-and-indexes\/services\/index-service.html\"><span style=\"font-weight: 400;\">GSI<\/span><\/a><span style=\"font-weight: 400;\"> (Indexaci\u00f3n Secundaria Global). Con esta nueva interfaz, los usuarios podr\u00e1n combinar y ejecutar consultas FTS desde consultas N1QL sin problemas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Un nuevo predicado SEARCH(..) ser\u00e1 ahora soportado como parte de la sintaxis de consulta N1QL. Antes de entrar en los aspectos internos de lo que sucede cuando se ejecuta una consulta N1QL con el predicado SEARCH(..), <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/fts\/fts-creating-indexes.html\">aqu\u00ed<\/a> hay algo de documentaci\u00f3n sobre c\u00f3mo crear y gestionar \u00edndices FTS y aqu\u00ed hay algunas consultas de ejemplo ..<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por ejemplo, digamos que tengo un \u00edndice FTS configurado sobre algunos documentos de viaje, y quiero obtener los resultados FTS (s\u00f3lo ids) de todos los documentos que lleven \"San Francisco\" en su campo de ciudad...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id\nFROM `travel-sample` as t\nWHERE SEARCH(t, \u2018city:\u201dSan Francisco\u201d\u2019);\n<\/pre>\n<p><span style=\"font-weight: 400;\">Como puede ver arriba, la cadena de consulta FTS 'city: \"San Francisco\"' est\u00e1 incrustada dentro de la consulta N1QL. Alternativamente, la consulta N1QL tambi\u00e9n soportar\u00e1 un objeto de consulta FTS como ...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cmatch_phrase\u201d: \u201cSan Francisco\u201d, \u201cfield\u201d: \u201ccity\u201d})\nLIMIT 10;\n<\/pre>\n<p><span style=\"font-weight: 400;\">El ejemplo anterior limitar\u00e1 el conjunto de resultados FTS a 10.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O incluso un objeto de solicitud de b\u00fasqueda FTS ..<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cquery\u201d: {\u201cmatch_phrase\u201d: \u201cSan Francisco\u201d, \u201cfield\u201d: \u201ccity\u201d}, \u201climit\u201d: 10});\n<\/pre>\n<p><span style=\"font-weight: 400;\">El ejemplo anterior tambi\u00e9n limita el conjunto de resultados a 10, pero FTS lo reforzar\u00e1.<\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">Los filtros OFFSET\/LIMIT pueden establecerse en la sintaxis de la consulta N1QL o en el objeto de petici\u00f3n de b\u00fasqueda FTS. Si estos par\u00e1metros se establecen dentro de la petici\u00f3n de b\u00fasqueda FTS, FTS enviar\u00e1 s\u00f3lo el n\u00famero solicitado de resultados. Los par\u00e1metros N1QL se aplicar\u00e1n sobre los resultados que FTS le haya enviado. Si estos par\u00e1metros no se establecen dentro del objeto FTS pero se establecen en la consulta N1QL - FTS transmitir\u00e1 todos los resultados a N1QL hasta el momento en que N1QL haya recibido todos los resultados que necesita.<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">Tambi\u00e9n, como en los \u00faltimos 3 ejemplos, uno no tiene que especificar expl\u00edcitamente el nombre del \u00edndice FTS a escoger - N1QL determinar\u00e1 cual es el mejor \u00edndice entre los disponibles para ejecutar la consulta FTS. Si uno quiere que N1QL use un \u00edndice espec\u00edfico (por ejemplo - un \u00edndice llamado \"travel\"), as\u00ed es como...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cmatch_phrase\u201d: \u201cSan Francisco\u201d, \u201cfield\u201d: \u201ccity\u201d}, {\u201cindex\u201d: \u201ctravel\u201d});\n<\/pre>\n<p><span style=\"font-weight: 400;\">Tenga en cuenta que para todas las consultas de ejemplo anteriores - los resultados se transmiten y no se ordenan en funci\u00f3n de la relevancia (puntuaci\u00f3n - comportamiento FTS por defecto). La ordenaci\u00f3n se puede realizar indic\u00e1ndolo expl\u00edcitamente en la petici\u00f3n de b\u00fasqueda o utilizando el comando de N1QLs <\/span><i><span style=\"font-weight: 400;\">ORDENAR POR<\/span><\/i><span style=\"font-weight: 400;\"> cl\u00e1usula. La paginaci\u00f3n de los resultados tambi\u00e9n puede lograrse indic\u00e1ndolo expl\u00edcitamente en la solicitud de b\u00fasqueda o utilizando la cl\u00e1usula de N1QL <\/span><i><span style=\"font-weight: 400;\">OFFSET<\/span><\/i><span style=\"font-weight: 400;\"> y <\/span><i><span style=\"font-weight: 400;\">L\u00cdMITE<\/span><\/i><span style=\"font-weight: 400;\"> cl\u00e1usulas.<\/span><\/p>\n<h4><strong>5. Despliegue de N1QL + FTS<\/strong><\/h4>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Para permitir consultas N1QL con la capacidad SEARCH(..), el cluster couchbase necesita tener al menos 1 nodo que ejecute el servicio Search y 1 nodo que ejecute el servicio Query (ambos servicios pueden ser configurados en el mismo nodo tambi\u00e9n).<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Los \u00edndices FTS deben ser configurados por el usuario para indexar el contenido necesario sobre el que se desea buscar.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Si N1QL no ha encontrado \u00edndices FTS para ejecutar la consulta, busca \u00edndices GSI que potencialmente puedan gestionar la consulta. En este caso, se aplica el predicado SEARCH(..) sobre los resultados intermedios obtenidos.  Aunque esto funcionar\u00eda, no es el enfoque recomendado ya que la evaluaci\u00f3n SEARCH(..) puede ser costosa.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Las consultas N1QL con SEARCH(..) pueden ejecutarse desde el banco de trabajo de consultas, curl, SDK o la interfaz de l\u00ednea de comandos que ofrece couchbase.<\/span><\/li>\n<\/ul>\n<h5><b>5.1 Sintaxis de b\u00fasqueda<\/b><\/h5>\n<p><span style=\"font-weight: 400;\">Esto es lo que admite la funci\u00f3n SEARCH(, , [opciones])...<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7706\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/Screen-Shot-2019-09-25-at-2.00.02-PM.png\" alt=\"\" width=\"1306\" height=\"558\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-2.00.02-PM.png 1306w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-2.00.02-PM-300x128.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-2.00.02-PM-1024x438.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-2.00.02-PM-768x328.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-2.00.02-PM-20x9.png 20w\" sizes=\"auto, (max-width: 1306px) 100vw, 1306px\" \/><\/p>\n<h5><b>5.2 Capacidades y limitaciones<\/b><\/h5>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Todas las funciones que ofrecen las peticiones de b\u00fasqueda FTS ser\u00e1n compatibles con las consultas N1QL.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/fts\/fts-searching-with-the-rest-api.html\">Aqu\u00ed<\/a> son algunos puntos destacados sobre lo que hay que lanzar en la secci\u00f3n \"query\" dentro de la funci\u00f3n SEARCH(..).<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">En la primera versi\u00f3n de la interfaz N1QL+FTS no se permitir\u00e1n los \u00edndices FTS que admitan asignaciones de tipos m\u00faltiples para que no se cuelen falsos positivos en el conjunto de resultados.<\/span><\/li>\n<\/ul>\n<h4><b style=\"color: #343e47; font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 30px;\">Aplicaci\u00f3n interna<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Internamente la interfaz N1QL+FTS soporta 4 APIs que el servicio N1QL invocar\u00e1 durante sus fases de preparaci\u00f3n y ejecuci\u00f3n para consultas con el predicado SEARCH(..).<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7707\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/Screen-Shot-2019-09-25-at-1.59.11-PM.png\" alt=\"\" width=\"1306\" height=\"324\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-1.59.11-PM.png 1306w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-1.59.11-PM-300x74.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-1.59.11-PM-1024x254.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-1.59.11-PM-768x191.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/Screen-Shot-2019-09-25-at-1.59.11-PM-20x5.png 20w\" sizes=\"auto, (max-width: 1306px) 100vw, 1306px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Antes de describir las API anteriores con m\u00e1s detalle, aqu\u00ed tienes un diagrama de flujo de las operaciones que se realizan en la interfaz ...<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-7704 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/n1fty_flow-1.jpg\" alt=\"\" width=\"602\" height=\"750\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1fty_flow-1.jpg 602w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1fty_flow-1-241x300.jpg 241w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1fty_flow-1-300x374.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1fty_flow-1-16x20.jpg 16w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/p>\n<h5><b>6.1 Sargable<\/b><\/h5>\n<p><span style=\"font-weight: 400;\">Esta API de \u00edndices FTS se utilizar\u00e1 para determinar si el \u00edndice es capaz de gestionar la solicitud de consulta sin devolver falsos negativos. En la primera versi\u00f3n, el \u00edndice s\u00f3lo se elige si todos los campos de la consulta est\u00e1n indexados en \u00e9l, o si el \u00edndice tiene en su definici\u00f3n un mapeo din\u00e1mico que podr\u00eda atender a todos los campos solicitados. Si varios \u00edndices son sargables para una consulta determinada, se elige el que tenga el menor n\u00famero de campos indexados que satisfagan la cl\u00e1usula de sargabilidad (por razones de rendimiento).<\/span><\/p>\n<h5><b>6.2 Paginable<\/b><\/h5>\n<p><span style=\"font-weight: 400;\">Esta API se utilizar\u00e1 para determinar si los resultados obtenidos del \u00edndice FTS subyacente ser\u00e1n paginables o no. Si el \u00edndice es paginable, N1QL aplicar\u00e1 los filtros (offset, l\u00edmite, informaci\u00f3n de ordenaci\u00f3n) para FTS antes de emitir el Search(..), de lo contrario los filtros se aplican sobre el conjunto de resultados despu\u00e9s de que FTS lo haya enviado.<\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">Tenga en cuenta que esta API no se invoca si no hay filtros (offset, limit, order by) en la consulta N1QL.<\/span><\/i><\/p>\n<h5><b>6.3 B\u00fasqueda<\/b><\/h5>\n<p><span style=\"font-weight: 400;\">Esta API se invoca para el \u00edndice m\u00e1s sargable, y es esencialmente responsable de obtener la solicitud de b\u00fasqueda a trav\u00e9s del \u00edndice FTS y la transmisi\u00f3n de los resultados a trav\u00e9s de un canal. Si la cantidad de datos a transmitir excede el tama\u00f1o del b\u00fafer disponible en el extremo N1QL del canal, FTS rellenar\u00e1 los datos a un archivo y una rutina separada es responsable de transmitir este contenido a N1QL. Esto se hace para que los recursos del FTS no se detengan por una conexi\u00f3n lenta del N1QL. Internamente, el protocolo gRPC se utiliza para la transmisi\u00f3n de datos de FTS a N1QL.<\/span><\/p>\n<h5><b>6.4 Verificar:Evaluar<\/b><\/h5>\n<p><span style=\"font-weight: 400;\">Esta API es utilizada por N1QL para asegurar que los resultados devueltos por un \u00edndice FTS son realmente v\u00e1lidos para la consulta. FTS s\u00f3lo devuelve los ID de las claves y algunos metadatos relacionados con FTS (si se solicitan), como la puntuaci\u00f3n, etc. N1QL obtiene los documentos de KV e invoca Verify para ellos si el predicado SELECT solicita algunos campos del documento.<\/span><\/p>\n<h4><b>Consultas con \u00edndice cubierto frente a consultas sin \u00edndice cubierto<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Si el predicado de la sentencia SELECT s\u00f3lo solicita claves o metadatos, no se invoca la API de verificaci\u00f3n. Este tipo de consulta se denomina consulta <\/span><i><span style=\"font-weight: 400;\">consulta de \u00edndice cubierto<\/span><\/i><span style=\"font-weight: 400;\">. Si la solicitud se refiere al contenido de alg\u00fan otro documento, N1QL utilizar\u00e1 las claves devueltas por FTS para obtener los datos del documento de KV, tras lo cual invocar\u00e1 el m\u00e9todo Verify para cada uno de los documentos obtenidos para volver a comprobar si los documentos recuperados son realmente coincidencias v\u00e1lidas. Este tipo de consulta se denomina <\/span><i><span style=\"font-weight: 400;\">consulta de \u00edndice no cubierto<\/span><\/i><span style=\"font-weight: 400;\">. Las consultas sin \u00edndice cubierto tienden a tener latencias m\u00e1s altas que las consultas con \u00edndice cubierto, ya que implican la b\u00fasqueda y verificaci\u00f3n de KV para cada resultado.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Si el usuario requiere que otros campos de los documentos formen parte del conjunto de resultados, un enfoque m\u00e1s r\u00e1pido ser\u00eda ajustar la definici\u00f3n del \u00edndice FTS para almacenar los campos deseados. Ahora, en la petici\u00f3n de b\u00fasqueda dentro de la funci\u00f3n SEARCH(..), incluya una secci\u00f3n llamada \"fields\": [\"*\"] para obtener todos los campos almacenados como parte del conjunto de resultados. De esta manera N1QL no tendr\u00e1 que hacer una b\u00fasqueda separada del documento y puede omitir la verificaci\u00f3n =&gt; esencialmente convirtiendo una consulta de \u00edndice no cubierto en una consulta de \u00edndice cubierto a costa de un \u00edndice FTS m\u00e1s grande.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Considere la siguiente definici\u00f3n de \u00edndice FTS con los campos \"pa\u00eds\" y \"contenido\" indexados..<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\n  \"name\": \"sample\",\n  \"type\": \"fulltext-index\",\n  \"params\": {\n    \"mapping\": {\n      \"default_mapping\": {\n        \"enabled\": true,\n        \"dynamic\": true,\n        \"properties\": {\n          \"country\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"country\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"include_term_vectors\": true,\n                \"docvalues\": true\n              }\n            ]\n          },\n          \"content\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"content\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"docvalues\": true\n              }\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n<\/pre>\n<p><span style=\"font-weight: 400;\">A continuaci\u00f3n se muestra un ejemplo de consulta de \u00edndice no cubierto m\u00e1s lenta que recupera el campo de documento \"contenido\" de los documentos que tienen \"estados unidos\" en su campo \"pa\u00eds\"...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id, t.content\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cquery\u201d: {\u201cmatch_phrase\u201d: \u201cunited states\u201d, \u201cfield\u201d: \u201ccountry\u201d}})\nORDER BY search_score() DESC\nLIMIT 10;\n<\/pre>\n<p><span style=\"font-weight: 400;\">Vamos a actualizar la definici\u00f3n del \u00edndice para almacenar tambi\u00e9n el campo \"contenido\" que es de inter\u00e9s ..<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\n  \"name\": \"sample\",\n  \"type\": \"fulltext-index\",\n  \"params\": {\n    \"mapping\": {\n      \"default_mapping\": {\n        \"enabled\": true,\n        \"dynamic\": true,\n        \"properties\": {\n          \"country\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"country\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"include_term_vectors\": true,\n                \"docvalues\": true\n              }\n            ]\n          },\n          \"content\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"content\",\n                \"type\": \"text\",\n                \"store\": true,\n                \"index\": true,\n                \"docvalues\": true\n              }\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n<\/pre>\n<p><span style=\"font-weight: 400;\">Ahora aqu\u00ed est\u00e1 la misma consulta que califica como una consulta de \u00edndice cubierto..<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta(t).id, meta.fields.content\nFROM `travel-sample` as t\nLET meta =\u00a0 search_meta(t)\nWHERE SEARCH(t, {\u201cquery\u201d: {\u201cmatch_phrase\u201d: \u201cunited states\u201d, \u201cfield\u201d: \u201ccountry\u201d}, \u201cfields\u201d: [\u201ccontent\u201d]})\nORDER BY search_score(t) DESC\nLIMIT 10;\n<\/pre>\n<h4><b>M\u00e1s ejemplos de N1QL+FTS<\/b><\/h4>\n<h5><b>8.1 Consultas m\u00e1s complejas<\/b><\/h5>\n<p><i><span style=\"font-weight: 400;\">Ejecuci\u00f3n de una b\u00fasqueda FTS de conjunci\u00f3n\/disyunci\u00f3n compuesta dentro de una consulta N1QL<\/span><\/i><span style=\"font-weight: 400;\"> ... los 100 documentos m\u00e1s importantes ordenados por puntuaci\u00f3n (tf-idf .. que es el algoritmo de puntuaci\u00f3n por defecto de FTS) de mayor a menor, cuya categor\u00eda es landmark y el pa\u00eds es Estados Unidos...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id, search_score() as score\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cconjuncts\u201d: [{\u201cmatch\u201d: \u201clandmark\u201d, \u201cfield\u201d: category\u201d}, {\u201cmatch_phrase\u201d: \u201cunited states\u201d, \u201cfield\u201d: \u201ccountry\u201d}]})\nORDER BY score DESC\nLIMIT 100;\n<\/pre>\n<p><span style=\"font-weight: 400;\">He aqu\u00ed una consulta equivalente con ajustes FTS integrados en la funci\u00f3n SEARCH(..) ...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id, search_score() as score\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cquery\u201d: {\u201cconjuncts\u201d: [{\u201cmatch\u201d: \u201clandmark\u201d, \u201cfield\u201d: category\u201d}, {\u201cmatch_phrase\u201d: \u201cunited states\u201d, \u201cfield\u201d: \u201ccountry\u201d}]}, \u201csort\u201d: [\u201c-_score\u201d], \u201climit\u201d: 10});\n<\/pre>\n<p><i><span style=\"font-weight: 400;\">Ejecuci\u00f3n de otra consulta con la configuraci\u00f3n FTS integrada en la funci\u00f3n SEARCH(..)<\/span><\/i><span style=\"font-weight: 400;\"> ... buscar todos los identificadores de documentos que contengan en su campo de descripci\u00f3n el t\u00e9rmino g\u00f3tico sin tener en cuenta la puntuaci\u00f3n. Aqu\u00ed podemos optimizar la petici\u00f3n de b\u00fasqueda FTS para no determinar la puntuaci\u00f3n en absoluto..<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id\nFROM `travel-sample` as t\nWHERE SEARCH(t, {\u201cquery\u201d: {\u201cmatch\u201d: \u201cgothic\u201d, \u201cfield\u201d: \u201cdescription\u201d}, \u201cscore\u201d: \u201cnone\u201d});\n<\/pre>\n<p><span style=\"font-weight: 400;\">A continuaci\u00f3n se describen con m\u00e1s detalle los distintos tipos de consulta FTS compatibles <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/fts\/fts-query-types.html\"><span style=\"font-weight: 400;\">aqu\u00ed<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h5><b>8.2 Sargabilidad de las consultas frente a definiciones de \u00edndices<\/b><\/h5>\n<p><span style=\"font-weight: 400;\">Antes de pasar a algunos ejemplos sobre c\u00f3mo las consultas se consideran sargables para las definiciones de \u00edndices FTS, aprenda m\u00e1s sobre las definiciones de \u00edndices FTS <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/fts\/fts-creating-indexes.html\"><span style=\"font-weight: 400;\">aqu\u00ed<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Considere la siguiente consulta, que busca el t\u00e9rmino \"g\u00f3tico\" en el campo \"descripci\u00f3n\"...<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT meta().id, search_score() \nFROM `travel-sample`\nWHERE SEARCH(`travel-sample`, {\u201cquery\u201d: {\u201cmatch\u201d: \u201cgothic\u201d, \u201cfield\u201d: \u201cdescription\u201d});\n<\/pre>\n<p><span style=\"font-weight: 400;\">En el sistema couchbase que nos ocupa, supongamos que hay varios \u00edndices FTS definidos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El primer \u00edndice FTS que encontramos tiene la siguiente definici\u00f3n ..<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\n  \"type\": \"fulltext-index\",\n  \"params\": {\n    \"mapping\": {\n      \"default_mapping\": {\n        \"enabled\": true,\n        \"dynamic\": true\n      }\n    }\n  }\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Este \u00edndice es lo que se denomina un \u00edndice din\u00e1mico por defecto que cubre todos los campos disponibles en todos los documentos y tambi\u00e9n incluye el contenido del campo por defecto \"_all\". Este campo por defecto es el que se consulta cuando una consulta FTS no contiene informaci\u00f3n de \"campo\" para un criterio de b\u00fasqueda. <span style=\"text-decoration: underline;\"><em>Este \u00edndice se considera SARGIBLE para la consulta anterior<\/em><\/span>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Un segundo \u00edndice FTS tiene la siguiente definici\u00f3n ..<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\n  \"type\": \"fulltext-index\",\n  \"params\": {\n    \"mapping\": {\n      \"default_mapping\": {\n        \"enabled\": true,\n        \"dynamic\": false,\n        \"properties\": {\n          \"description\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"description\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"include_term_vectors\": true,\n                \"include_in_all\": false,\n                \"docvalues\": true\n              }\n            ]\n          }\n        }\n      }\n    }\n  }\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Este \u00edndice s\u00f3lo tiene indexado el campo \"descripci\u00f3n\", que responder\u00eda a la petici\u00f3n de la consulta, y por tanto <em><span style=\"text-decoration: underline;\">el \u00edndice es SARGABLE para la consulta<\/span><\/em>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Un tercer \u00edndice FTS tiene la siguiente definici\u00f3n ..<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\n  \"type\": \"fulltext-index\",\n  \"params\": {\n    \"mapping\": {\n      \"default_mapping\": {\n        \"enabled\": true,\n        \"dynamic\": false,\n        \"properties\": {\n          \"city\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"city\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"include_term_vectors\": true,\n                \"include_in_all\": true,\n                \"docvalues\": true\n              }\n            ]\n          },\n          \"country\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"country\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"include_term_vectors\": true,\n                \"include_in_all\": true,\n                \"docvalues\": true\n              }\n            ]\n          },\n          \"name\": {\n            \"enabled\": true,\n            \"dynamic\": false,\n            \"fields\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"text\",\n                \"store\": false,\n                \"index\": true,\n                \"include_term_vectors\": true,\n                \"include_in_all\": false,\n                \"docvalues\": true\n              }\n            ]\n          }\n        }\n      }\n    }\n  }\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Este \u00edndice tiene algunos campos indexados, pero ninguno de ellos coincide con el campo solicitado \"descripci\u00f3n\". <em><span style=\"text-decoration: underline;\">Este \u00edndice se considera NO APTO para la consulta<\/span><\/em><em>.<\/em><\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">N1QL ahora tiene la opci\u00f3n de seleccionar entre los 2 primeros \u00edndices que ser\u00e1n capaces de entregar resultados precisos para la consulta. Dado que el n\u00famero de campos indexados dentro del segundo \u00edndice es preciso y m\u00e1s peque\u00f1o (y por lo tanto ya que la b\u00fasqueda a trav\u00e9s de este \u00edndice ser\u00eda m\u00e1s r\u00e1pida), N1QL elige el segundo \u00edndice para la ejecuci\u00f3n de la consulta.<\/span><\/i><\/p>\n<h4><b>Futuro<\/b><\/h4>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Establecer mejor la sargabilidad apoyando cierta flexibilidad de las definiciones de \u00edndice FTS - como en los \u00edndices FTS que no admiten todos los campos solicitados.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Compatibilidad con \u00edndices FTS con asignaciones de tipos m\u00faltiples.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Ampliaci\u00f3n de la interfaz de consulta N1QL para editar \u00edndices FTS.<\/span><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Topics this article will cover What\u2019s good with N1QL? What about FTS? But why FTS within N1QL? Basic N1QL+FTS queries Deploying N1QL+FTS Syntax(es) Abilities &amp; limitations N1QL+FTS Internals Covered-index vs Non-covered-index queries More N1QL+FTS query examples What&#8217;s next? 1. Couchbase&#8217;s [&hellip;]<\/p>","protected":false},"author":37266,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1821,2165,1812],"tags":[],"ppma_author":[8925],"class_list":["post-7700","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-architecture","category-full-text-search","category-n1ql-query"],"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>Introducing FTS with N1QL - The Couchbase Blog<\/title>\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\/introducing-fts-with-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing FTS with N1QL\" \/>\n<meta property=\"og:description\" content=\"Topics this article will cover What\u2019s good with N1QL? What about FTS? But why FTS within N1QL? Basic N1QL+FTS queries Deploying N1QL+FTS Syntax(es) Abilities &amp; limitations N1QL+FTS Internals Covered-index vs Non-covered-index queries More N1QL+FTS query examples What&#8217;s next? 1. Couchbase&#8217;s [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/introducing-fts-with-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-25T21:07:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:59:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1ql_n1fty_flow-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"608\" \/>\n\t<meta property=\"og:image:height\" content=\"266\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Abhinav Dangeti, 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=\"Abhinav Dangeti, Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/\"},\"author\":{\"name\":\"Abhinav Dangeti, Software Engineering, Couchbase inc.\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/574480df99d76a8837bba934d7324711\"},\"headline\":\"Introducing FTS with N1QL\",\"datePublished\":\"2019-09-25T21:07:00+00:00\",\"dateModified\":\"2025-06-14T03:59:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/\"},\"wordCount\":2041,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/\",\"name\":\"Introducing FTS with N1QL - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2019-09-25T21:07:00+00:00\",\"dateModified\":\"2025-06-14T03:59:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing FTS with N1QL\"}]},{\"@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\/574480df99d76a8837bba934d7324711\",\"name\":\"Abhinav Dangeti, Software Engineering, Couchbase inc.\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9fa9293925a63fb1fab65e43636c534b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6119ccf4cd5cba9ca4abd6f338d737445c23575e60f2b2729806c28185d0ee9b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6119ccf4cd5cba9ca4abd6f338d737445c23575e60f2b2729806c28185d0ee9b?s=96&d=mm&r=g\",\"caption\":\"Abhinav Dangeti, Software Engineering, Couchbase inc.\"},\"description\":\"Work on Couchbase's Distributed Full Text Search\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/abhinav\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing FTS with N1QL - The Couchbase Blog","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\/introducing-fts-with-n1ql\/","og_locale":"es_MX","og_type":"article","og_title":"Introducing FTS with N1QL","og_description":"Topics this article will cover What\u2019s good with N1QL? What about FTS? But why FTS within N1QL? Basic N1QL+FTS queries Deploying N1QL+FTS Syntax(es) Abilities &amp; limitations N1QL+FTS Internals Covered-index vs Non-covered-index queries More N1QL+FTS query examples What&#8217;s next? 1. Couchbase&#8217;s [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/introducing-fts-with-n1ql\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-09-25T21:07:00+00:00","article_modified_time":"2025-06-14T03:59:09+00:00","og_image":[{"width":608,"height":266,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/n1ql_n1fty_flow-1.jpg","type":"image\/jpeg"}],"author":"Abhinav Dangeti, Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Abhinav Dangeti, Software Engineer","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/"},"author":{"name":"Abhinav Dangeti, Software Engineering, Couchbase inc.","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/574480df99d76a8837bba934d7324711"},"headline":"Introducing FTS with N1QL","datePublished":"2019-09-25T21:07:00+00:00","dateModified":"2025-06-14T03:59:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/"},"wordCount":2041,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Best Practices and Tutorials","Couchbase Architecture","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/","name":"Introducing FTS with N1QL - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2019-09-25T21:07:00+00:00","dateModified":"2025-06-14T03:59:09+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/introducing-fts-with-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing FTS with N1QL"}]},{"@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\/574480df99d76a8837bba934d7324711","name":"Abhinav Dangeti, Ingenier\u00eda de software, Couchbase inc.","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9fa9293925a63fb1fab65e43636c534b","url":"https:\/\/secure.gravatar.com\/avatar\/6119ccf4cd5cba9ca4abd6f338d737445c23575e60f2b2729806c28185d0ee9b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6119ccf4cd5cba9ca4abd6f338d737445c23575e60f2b2729806c28185d0ee9b?s=96&d=mm&r=g","caption":"Abhinav Dangeti, Software Engineering, Couchbase inc."},"description":"Trabajar en la b\u00fasqueda distribuida de texto completo de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/abhinav\/"}]}},"authors":[{"term_id":8925,"user_id":37266,"is_guest":0,"slug":"abhinav","display_name":"Abhinav Dangeti, Software Engineer","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/6119ccf4cd5cba9ca4abd6f338d737445c23575e60f2b2729806c28185d0ee9b?s=96&d=mm&r=g","author_category":"","last_name":"Dangeti, Software Engineer","first_name":"Abhinav","job_title":"","user_url":"","description":"Trabajar en la b\u00fasqueda distribuida de texto completo de Couchbase"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7700","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\/37266"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=7700"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7700\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=7700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=7700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=7700"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=7700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}