{"id":8362,"date":"2020-03-26T18:08:28","date_gmt":"2020-03-27T01:08:28","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8362"},"modified":"2025-06-13T20:59:06","modified_gmt":"2025-06-14T03:59:06","slug":"fts-and-n1ql-improving-performance-when-querying-multiple-arrays","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/","title":{"rendered":"FTS y N1QL: Mejor rendimiento de MongoDB en el operador Consulta de m\u00faltiples matrices"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p><span style=\"font-weight: 400\">Couchbase Full Text Search (FTS) es ideal para indexar m\u00faltiples arrays y ejecutar consultas con m\u00faltiples filtros predicados en arrays.  En este art\u00edculo, demostrar\u00e9 las ventajas de usar FTS sobre GSI (Global Secondary Index) para la indexaci\u00f3n de arrays mientras trabajo a trav\u00e9s de un caso de uso de ejemplo que requiere la consulta de m\u00faltiples arrays.  Crearemos un \u00edndice multi-array FTS y consultaremos el \u00edndice con N1QL usando la nueva funci\u00f3n SEARCH() introducida en Couchbase Server 6.5.\u00a0\u00a0<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Cubo de muestras de viaje<\/span><\/h4>\n<p><span style=\"font-weight: 400\">En este art\u00edculo, haremos referencia a la funci\u00f3n <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-settings\/install-sample-buckets.html\"><span style=\"font-weight: 400\">Viajes Conjunto de datos de muestra disponible para instalar<\/span><\/a><span style=\"font-weight: 400\"> en cualquier instancia de Couchbase Server. El bucket travel-sample tiene varios tipos de documentos distintos: aerol\u00ednea, ruta, aeropuerto, punto de referencia y hotel.  El modelo de documento para cada tipo de documento contiene:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Una clave que act\u00faa como clave primaria<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Un campo id que identifica el documento<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Un campo de tipo que identifica el tipo de documento<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">En los ejemplos de este art\u00edculo se utilizar\u00e1n los documentos de un hotel. El documento de ejemplo que figura a continuaci\u00f3n le dar\u00e1 una idea de la estructura de un documento de hotel:\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8364 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-1-sample-doc.png\" alt=\"\" width=\"495\" height=\"554\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-1-sample-doc.png 495w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-1-sample-doc-268x300.png 268w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-1-sample-doc-300x336.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-1-sample-doc-18x20.png 18w\" sizes=\"auto, (max-width: 495px) 100vw, 495px\" \/><\/p>\n<p style=\"text-align: center\"><i><span style=\"font-weight: 400\">Figura 1 - Ejemplo de documento hotelero<\/span><\/i><\/p>\n<h2><span style=\"font-weight: 400\">El problema<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Nuestro ejemplo es un caso de uso en el que un usuario puede buscar hoteles que hayan sido rese\u00f1ados o que le hayan gustado a una persona con un nombre concreto. Para ello, es necesario consultar los documentos del hotel en funci\u00f3n de las opiniones y los gustos p\u00fablicos, que son matrices dentro del modelo de documentos del hotel:\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8365 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-2-arrays.png\" alt=\"\" width=\"608\" height=\"595\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-2-arrays.png 608w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-2-arrays-300x294.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-2-arrays-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-2-arrays-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-2-arrays-20x20.png 20w\" sizes=\"auto, (max-width: 608px) 100vw, 608px\" \/><\/p>\n<p style=\"text-align: center\"><i><span style=\"font-weight: 400\">Figura 2 - Matrices \"public_likes\" y \"reviews\" en el documento de ejemplo del hotel<\/span><\/i><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Veamos primero c\u00f3mo implementar este caso de uso con N1QL y GSI (Global Secondary Index). Para encontrar hoteles que hayan gustado o hayan sido rese\u00f1ados por alguien llamado Ozella, la consulta podr\u00eda ser la siguiente:\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECCIONE nombre, direcci\u00f3n, ciudad, pa\u00eds,\r\n       tel\u00e9fono, public_likes, opiniones\r\nDE `viajes-muestra\r\nWHERE type=\"hotel\"\r\n    AND (ANY l IN public_likes SATISFIES l LIKE \"%Ozella%\" END\r\n        OR ANY r IN reviews SATISFIES r.author LIKE \"%Ozella%\" END);<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Necesitamos crear un \u00edndice apropiado para esta consulta.  Tal vez algo como esto que indexa ambas matrices de inter\u00e9s para los documentos del hotel:\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true\">CREAR \u00cdNDICE idx_hotel_public_likes_review_author EN `viajes-muestra`.\r\n(DISTINCT ARRAY `l` FOR l IN `public_likes` END,\r\nDISTINCT ARRAY `r`.`author` FOR r IN `reviews` END)\r\nWHERE `type` = 'hotel';<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Esto no funciona, y obtenemos el error que se muestra en la Figura 3:<\/span><\/p>\n<p style=\"text-align: center\"><span style=\"font-weight: 400\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8366 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-3-error-creating-index.png\" alt=\"\" width=\"771\" height=\"481\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-3-error-creating-index.png 771w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-3-error-creating-index-300x187.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-3-error-creating-index-768x479.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-3-error-creating-index-20x12.png 20w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/span><i><span style=\"font-weight: 400\">Figura 3 - Error al crear un \u00edndice con varias matrices<\/span><\/i><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Como escribi\u00f3 Keshav Murthy en su blog <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/search-and-rescue-7-reasons-for-n1ql-sql-developers-to-use-search\/\"><span style=\"font-weight: 400\">B\u00fasqueda y Rescate: 7 razones para que los desarrolladores de N1QL (SQL) utilicen la b\u00fasqueda<\/span><\/a><span style=\"font-weight: 400\"> (problema #6), con N1QL en Couchbase, \"<\/span><i><span style=\"font-weight: 400\">para obtener el mejor rendimiento durante la b\u00fasqueda dentro de matrices, es necesario <\/span><\/i><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/indexing-arrays.html\"><i><span style=\"font-weight: 400\">crear \u00edndices con claves de matriz<\/span><\/i><\/a><i><span style=\"font-weight: 400\">. El \u00edndice de matriz tiene una limitaci\u00f3n: cada \u00edndice de matriz s\u00f3lo puede tener una clave de matriz por \u00edndice. Por lo tanto, cuando tienes un objeto cliente con varios campos de matriz, no puedes buscar en todos ellos utilizando un \u00fanico \u00edndice... lo que provoca consultas costosas.<\/span><\/i><span style=\"font-weight: 400\">\" Como se\u00f1ala Keshav en ese art\u00edculo, se trata de una limitaci\u00f3n de los \u00edndices b-tree en las bases de datos en general.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Probemos ahora con dos \u00edndices de array distintos.  Los \u00edndices para soportar esta consulta podr\u00edan parecerse a estos, que fueron creados usando el m\u00e9todo <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql-index-advisor-improve-query-performance-and-productivity\/\"><span style=\"font-weight: 400\">Asesor de \u00edndices N1QL de Couchbase<\/span><\/a><span style=\"font-weight: 400\">una nueva caracter\u00edstica (DP) en Couchbase 6.5:<\/span><\/p>\n<p><span style=\"font-weight: 400\">\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true\">CREAR \u00cdNDICE adv_DISTINCT_public_likes_type\r\nON `viajes-muestra`(DISTINCT ARRAY `l` FOR l in `gustos_p\u00fablicos` END)\r\nWHERE `type` = 'hotel';\r\n\r\n\r\nCREATE INDEX adv_DISTINCT_reviews_author_type\r\nON `viajes-muestra`(DISTINCT ARRAY `r`.`autor` FOR r in `rese\u00f1as` END)\r\nWHERE `type` = 'hotel';<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Con estos 2 \u00edndices, nuestra consulta se ejecuta correctamente con 5 resultados (hotel_26020, hotel_10025, hotel_5081, hotel_20425, hotel_25327) y el siguiente plan de ejecuci\u00f3n:\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8367 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan.png\" alt=\"\" width=\"1936\" height=\"378\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan.png 1936w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan-300x59.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan-1024x200.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan-768x150.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan-1536x300.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-4-IndexScan-plan-1320x258.png 1320w\" sizes=\"auto, (max-width: 1936px) 100vw, 1936px\" \/><\/p>\n<p style=\"text-align: center\"><i><span style=\"font-weight: 400\">Figura 4 - Plan de ejecuci\u00f3n con \u00edndices m\u00faltiples (GSI)<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400\">Mismo plan en JSON:<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"#operator\": \"Secuencia\",\r\n  \"#stats\": {\r\n    \"#phaseSwitches\": 1,\r\n    \"execTime\": \"1.321\u00b5s\"\r\n  },\r\n  \"~children\": [\r\n    {\r\n      \"#operator\": \"Authorize\",\r\n      \"#stats\": {\r\n        \"#phaseSwitches\": 3,\r\n        \"execTime\": \"3.034\u00b5s\",\r\n        \"servTime\": \"1.037859ms\"\r\n      },\r\n      \"privilegios\": {\r\n        \"Lista\": [\r\n          {\r\n            \"Objetivo\": \"default:muestra-viaje\",\r\n            \"Priv\": 7\r\n          }\r\n        ]\r\n      },\r\n      \"~child\": {\r\n        \"#operator\": \"Sequence\",\r\n        \"#stats\": {\r\n          \"#phaseSwitches\": 1,\r\n          \"execTime\": \"2.235\u00b5s\"\r\n        },\r\n        \"~children\": [\r\n          {\r\n            \"#operator\": \"UnionScan\",\r\n            \"#stats\": {\r\n              \"#itemsIn\": 1646,\r\n              \"#itemsOut\": 904,\r\n              \"#phaseSwitches\": 5107,\r\n              \"execTime\": \"1.32474ms\",\r\n              \"kernTime\": \"113.495553ms\"\r\n            },\r\n            \"scans\": [\r\n              {\r\n                \"#operator\": \"DistinctScan\",\r\n                \"#stats\": {\r\n                  \"#itemsIn\": 4004,\r\n                  \"#itemsOut\": 813,\r\n                  \"#phaseSwitches\": 9641,\r\n                  \"execTime\": \"1.381997ms\",\r\n                  \"kernTime\": \"69.065425ms\"\r\n                },\r\n                \"scan\": {\r\n                  \"#operator\": \"IndexScan3\",\r\n                  \"#stats\": {\r\n                    \"#itemsOut\": 4004,\r\n                    \"#phaseSwitches\": 16021,\r\n                    \"execTime\": \"19.678094ms\",\r\n                    \"kernTime\": \"30.973177ms\",\r\n                    \"servTime\": \"17.461885ms\"\r\n                  },\r\n                  \"index\": \"adv_DISTINCT_public_likes_type\",\r\n                  \"index_id\": \"288083a758973630\",\r\n                  \"index_projection\": {\r\n                    \"primary_key\": true\r\n                  },\r\n                  \"keyspace\": \"muestra-viaje\",\r\n                  \"namespace\": \"default\",\r\n                  \"spans\": [\r\n                    {\r\n                      \"range\": [\r\n                        {\r\n                          \"alto\": \"[]\",\r\n                          \"inclusi\u00f3n\": 1,\r\n                          \"low\": \"\\\"\\\"\"\r\n                        }\r\n                      ]\r\n                    }\r\n                  ],\r\n                  \"using\": \"gsi\",\r\n                  \"#ime_normal\": \"00:00.037\",\r\n                  \"#ime_absolute\": 0.037139979000000004\r\n                },\r\n                \"#ime_normal\": \"00:00.001\",\r\n                \"#ime_absolute\": 0.0013819969999999998\r\n              },\r\n              {\r\n                \"#operator\": \"DistinctScan\",\r\n                \"#stats\": {\r\n                  \"#itemsIn\": 4104,\r\n                  \"#itemsOut\": 833,\r\n                  \"#phaseSwitches\": 9881,\r\n                  \"execTime\": \"2.475034ms\",\r\n                  \"kernTime\": \"80.914158ms\"\r\n                },\r\n                \"scan\": {\r\n                  \"#operator\": \"IndexScan3\",\r\n                  \"#stats\": {\r\n                    \"#itemsOut\": 4104,\r\n                    \"#phaseSwitches\": 16421,\r\n                    \"execTime\": \"8.610445ms\",\r\n                    \"kernTime\": \"52.02497ms\",\r\n                    \"servTime\": \"22.586149ms\"\r\n                  },\r\n                  \"index\": \"adv_DISTINCT_reviews_author_type\",\r\n                  \"index_id\": \"cca7f912cab1a4c6\",\r\n                  \"index_projection\": {\r\n                    \"primary_key\": true\r\n                  },\r\n                  \"keyspace\": \"muestra-viaje\",\r\n                  \"namespace\": \"default\",\r\n                  \"spans\": [\r\n                    {\r\n                      \"range\": [\r\n                        {\r\n                          \"alto\": \"[]\",\r\n                          \"inclusi\u00f3n\": 1,\r\n                          \"low\": \"\\\"\\\"\"\r\n                        }\r\n                      ]\r\n                    }\r\n                  ],\r\n                  \"using\": \"gsi\",\r\n                  \"#ime_normal\": \"00:00.031\",\r\n                  \"#ime_absolute\": 0.031196594\r\n                },\r\n                \"#ime_normal\": \"00:00.002\",\r\n                \"#ime_absolute\": 0.002475034\r\n              }\r\n            ],\r\n            \"#ime_normal\": \"00:00.001\",\r\n            \"#ime_absolute\": 0.00132474\r\n          },\r\n          {\r\n            \"#operator\": \"Fetch\",\r\n            \"#stats\": {\r\n              \"#itemsIn\": 904,\r\n              \"#itemsOut\": 904,\r\n              \"#phaseSwitches\": 3733,\r\n              \"execTime\": \"2.887995ms\",\r\n              \"kernTime\": \"8.826606ms\",\r\n              \"servTime\": \"170.010321ms\"\r\n            },\r\n            \"keyspace\": \"muestra-viaje\",\r\n            \"namespace\": \"default\",\r\n            \"#ime_normal\": \"00:00.172\",\r\n            \"#ime_absolute\": 0.172898316\r\n          },\r\n          {\r\n            \"#operator\": \"Parallel\",\r\n            \"#stats\": {\r\n              \"#phaseSwitches\": 1,\r\n              \"execTime\": \"6.134\u00b5s\"\r\n            },\r\n            \"copies\": 2,\r\n            \"~child\": {\r\n              \"#operator\": \"Sequence\",\r\n              \"#stats\": {\r\n                \"#phaseSwitches\": 2,\r\n                \"execTime\": \"3.621\u00b5s\"\r\n              },\r\n              \"~children\": [\r\n                {\r\n                  \"#operator\": \"Filter\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 904,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 1824,\r\n                    \"execTime\": \"279.461548ms\",\r\n                    \"kernTime\": \"85.245883ms\"\r\n                  },\r\n                  \"condition\": \"(((`travel-sample`.`type`) = \\\"hotel\\\") and (any `l` in (`travel-sample`.`public_likes`) satisfies (`l` like \\\"%Ozella%\\\") end or any `r` in (`travel-sample`.`reviews`) satisfies ((`r`.`author`) like \\\"%Ozella%\\\") end))\",\r\n                  \"#ime_normal\": \"00:00.279\",\r\n                  \"#ime_absolute\": 0.279461548\r\n                },\r\n                {\r\n                  \"#operator\": \"InitialProject\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 25,\r\n                    \"execTime\": \"7.156613ms\",\r\n                    \"kernTime\": \"357.453351ms\"\r\n                  },\r\n                  \"result_terms\": [\r\n                    {\r\n                      \"expr\": \"(`viaje-muestra`.`nombre`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`muestra-de-viaje`.`direcci\u00f3n`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`muestra-de-viaje`.`ciudad`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`viaje-muestra`.`pa\u00eds`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`muestra-de-viaje`.`tel\u00e9fono`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`muestra-de-viaje`.`gustos_publicos`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`muestra-de-viaje`.`reviews`)\"\r\n                    }\r\n                  ],\r\n                  \"#ime_normal\": \"00:00.007\",\r\n                  \"#ime_absolute\": 0.007156613\r\n                },\r\n                {\r\n                  \"#operator\": \"FinalProject\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 17,\r\n                    \"execTime\": \"12.167\u00b5s\",\r\n                    \"kernTime\": \"98.849\u00b5s\"\r\n                  },\r\n                  \"#ime_normal\": \"00:00.000\",\r\n                  \"#ime_absolute\": 0.000012167\r\n                }\r\n              ],\r\n              \"#ime_normal\": \"00:00.000\",\r\n              \"#ime_absolute\": 0.000003621\r\n            },\r\n            \"#ime_normal\": \"00:00.000\",\r\n            \"#ime_absolute\": 0.000006134\r\n          }\r\n        ],\r\n        \"#ime_normal\": \"00:00.000\",\r\n        \"#ime_absolute\": 0.0000022349999999999998\r\n      },\r\n      \"#ime_normal\": \"00:00.001\",\r\n      \"#ime_absolute\": 0.0010408930000000002\r\n    },\r\n    {\r\n      \"#operator\": \"Stream\",\r\n      \"#stats\": {\r\n        \"#itemsIn\": 5,\r\n        \"#itemsOut\": 5,\r\n        \"#phaseSwitches\": 13,\r\n        \"execTime\": \"939.145\u00b5s\",\r\n        \"kernTime\": \"182.523171ms\"\r\n      },\r\n      \"#ime_normal\": \"00:00.000\",\r\n      \"#ime_absolute\": 0.000939145\r\n    }\r\n  ],\r\n  \"~versiones\": [\r\n    \"2.0.0-N1QL\",\r\n    \"6.5.0-4960-enterprise\"\r\n  ],\r\n  \"#iempo_normal\": \"00:00.000\",\r\n  \"#ime_absolute\": 0.000001321\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">En el cluster de un solo nodo que se utiliza para estos ejemplos, el tiempo transcurrido de la consulta es de unos 190-200 milisegundos para devolver los 5 documentos resultantes.  Como se puede ver en el plan, hay dos operadores IndexScan3 que utilizan cada uno de los dos \u00edndices de array que hemos creado, seguidos de un DistinctScan para los resultados de cada escaneo de \u00edndice y, a continuaci\u00f3n, un UnionScan.  El UnionScan muestra un valor de #itemsIn de 1646 documentos y un valor de #itemsOut de 904 documentos, el operador Fetch tambi\u00e9n obtiene 904 documentos, y finalmente con el operador Filter obtenemos un valor de #ItemsOut de 5.  La obtenci\u00f3n de 904 documentos es un despilfarro si tenemos en cuenta que al final la consulta nos devuelve 5 documentos, y de hecho unos 170 milisegundos del tiempo total transcurrido se emplean en obtener los 905 documentos cuando s\u00f3lo se necesitan 5.\u00a0\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400\">La soluci\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Por el contrario, un \u00edndice invertido FTS se puede crear f\u00e1cilmente para m\u00faltiples matrices y es muy adecuado para los casos en los que se necesita buscar campos en m\u00faltiples matrices. Vamos a crear un \u00edndice FTS en documentos de hotel tanto para la matriz public_likes como para el campo author de la matriz reviews.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"font-weight: 400\">Pasos para la creaci\u00f3n de \u00edndices:\u00a0<\/span><\/h4>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">En la interfaz de b\u00fasqueda de texto completo, haga clic en \"A\u00f1adir \u00edndice\".<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Especifique un nombre de \u00edndice, por ejemplo \"hotel_mult_arrays\", y seleccione el bucket de muestras de viajes.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Dado que cada documento del bucket de muestras de viajes tiene un campo \"type\" que indica el tipo de documento, deje \"JSON type field\" establecido en \"type\".<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">En asignaciones de tipos:\u00a0\u00a0<\/span>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Haga clic en \"+ A\u00f1adir asignaci\u00f3n de tipos\" y especifique \"hotel\" como nombre del tipo, ya que el requisito es buscar en todos los documentos de hoteles.\u00a0\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Se puede acceder a una lista de analizadores disponibles mediante el men\u00fa desplegable situado a la derecha del campo de nombre de tipo.  Para este caso de uso, deje seleccionado \"heredar\" para que la asignaci\u00f3n de tipos herede el analizador por defecto del \u00edndice.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Dado que el requisito es buscar en los gustos p\u00fablicos del hotel y revisar los campos del autor, marque \"indexar s\u00f3lo campos especificados\".  Con esta opci\u00f3n marcada, s\u00f3lo los campos especificados por el usuario del documento se incluir\u00e1n en el \u00edndice para el mapeo del tipo de hotel (el mapeo no ser\u00e1 din\u00e1mico, lo que significa que todos los campos se considerar\u00e1n disponibles para la indexaci\u00f3n).\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Haga clic en Aceptar.\u00a0\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Sit\u00fae el rat\u00f3n sobre la fila con la asignaci\u00f3n del tipo de hotel, haga clic en el bot\u00f3n + y, a continuaci\u00f3n, en \"<\/span><b>insertar campo hijo<\/b><span style=\"font-weight: 400\">\".  Esto permitir\u00e1 que la matriz public_likes se incluya individualmente en el \u00edndice.  Especifique lo siguiente:\u00a0<\/span>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">campo: Introduce el nombre del campo a indexar, \"public_likes\".<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">tipo: Deja esto establecido en texto para la matriz public_likes.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">buscable como: D\u00e9jelo igual que el nombre del campo para el caso de uso actual.  Puede utilizarse para indicar un nombre de campo alternativo.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">analizador: Como se hizo para el mapeo de tipos, <\/span><span style=\"font-weight: 400\">para este caso de uso, <\/span><span style=\"font-weight: 400\">dejar seleccionado \"heredar\" para que <\/span><span style=\"font-weight: 400\">que la asignaci\u00f3n de tipos hereda el analizador por defecto.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">\u00edndice: D\u00e9jela marcada para que el campo se incluya en el \u00edndice.  Si desmarca la casilla, el campo se eliminar\u00e1 expl\u00edcitamente del \u00edndice.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">almacenar: Marque esta opci\u00f3n para incluir el contenido del campo en los resultados de la b\u00fasqueda, lo que permite resaltar las expresiones coincidentes en los resultados.  Esto es \u00fatil para probar el \u00edndice, pero no se recomienda en Prod si el resaltado no es necesario, ya que aumenta el tama\u00f1o del \u00edndice.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">casilla \"incluir en _todos los campos\": D\u00e9jela marcada ya que el requisito del caso de uso es buscar en varios campos.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">casilla \"incluir vectores de t\u00e9rminos\": D\u00e9jela marcada tambi\u00e9n durante el desarrollo y las pruebas de nuestro \u00edndice para poder resaltar los resultados.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">casilla docvalues: Desmarque esta opci\u00f3n.  Esta configuraci\u00f3n almacena los valores de campo en el \u00edndice, lo que proporciona soporte para las Facetas de b\u00fasqueda y para la ordenaci\u00f3n de los resultados de b\u00fasqueda basados en los valores de campo, ninguno de los cuales necesitamos en este caso de uso.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Haga clic en Aceptar.<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Sit\u00fae el rat\u00f3n sobre la fila con la asignaci\u00f3n del tipo de hotel, haga clic en el bot\u00f3n + y, a continuaci\u00f3n, en \"<\/span><b>insertar asignaci\u00f3n de hijos<\/b><span style=\"font-weight: 400\">\".  Esto permitir\u00e1 que la matriz de subdocumentos de revisi\u00f3n se incluya en el \u00edndice.  Introduzca el nombre de la propiedad \"revisiones\", deje seleccionado \"heredar\" en el desplegable del analizador, marque \"s\u00f3lo indexar campos especificados\" y haga clic en Aceptar.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Sit\u00fae el rat\u00f3n sobre la fila con la asignaci\u00f3n de los hijos de las revisiones, haga clic en el bot\u00f3n + y, a continuaci\u00f3n, haga clic en \"<\/span><b>insertar campo hijo<\/b><span style=\"font-weight: 400\">\".  Esto permitir\u00e1 incluir en el \u00edndice el campo autor de la matriz de subdocumentos de revisi\u00f3n.  Especifique lo siguiente:\u00a0<\/span>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">campo: Introduce el nombre del campo a indexar, \"autor\".<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Tipo: Deje esto establecido en texto para el campo de autor.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">buscable como: D\u00e9jelo igual que el nombre del campo para el caso de uso actual.  Puede utilizarse para indicar un nombre de campo alternativo.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">analizador: Como se hizo para el mapeo de tipos, <\/span><span style=\"font-weight: 400\">para este caso de uso, <\/span><span style=\"font-weight: 400\">dejar seleccionado \"heredar\" para que <\/span><span style=\"font-weight: 400\">que la asignaci\u00f3n de tipos hereda el analizador por defecto.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">\u00edndice: D\u00e9jela marcada para que el campo se incluya en el \u00edndice.  Si desmarca la casilla, el campo se eliminar\u00e1 expl\u00edcitamente del \u00edndice.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">almacenar: Marque esta opci\u00f3n para incluir el contenido del campo en los resultados de la b\u00fasqueda, lo que permite resaltar las expresiones coincidentes en los resultados.  Esto es \u00fatil para probar el \u00edndice, pero no se recomienda en Prod si el resaltado no es necesario, ya que aumenta el tama\u00f1o del \u00edndice.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">casilla \"incluir en _todos los campos\": D\u00e9jela marcada ya que el requisito del caso de uso es buscar en varios campos.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">casilla \"incluir vectores de t\u00e9rminos\": D\u00e9jela marcada tambi\u00e9n durante el desarrollo y las pruebas de nuestro \u00edndice para poder resaltar los resultados.\u00a0\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">casilla docvalues: Desmarque esta opci\u00f3n.  Esta configuraci\u00f3n almacena los valores de campo en el \u00edndice, lo que proporciona soporte para las Facetas de b\u00fasqueda y para la ordenaci\u00f3n de los resultados de b\u00fasqueda basados en los valores de campo, ninguno de los cuales necesitamos en este caso de uso.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Haga clic en Aceptar.<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Por \u00faltimo, desmarque la casilla situada junto a la correspondencia de tipos \"por defecto\".  Si se deja activada la correspondencia por defecto, todos los documentos del bucket se incluir\u00e1n en el \u00edndice, independientemente de si el usuario especifica activamente correspondencias de tipos. S\u00f3lo se requieren los documentos del hotel, que se incluyen mediante la correspondencia de tipos del hotel a\u00f1adida anteriormente.\u00a0<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Los valores por defecto son suficientes para el resto de paneles contra\u00eddos (Analizadores, Filtros personalizados, Analizadores de fecha\/hora y Avanzado).\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Las r\u00e9plicas de \u00edndice pueden establecerse en 1, 2 \u00f3 3, siempre que el cl\u00faster est\u00e9 ejecutando el servicio de b\u00fasqueda en n+1 nodos. Con un entorno de desarrollo de un solo nodo, mantenga el valor predeterminado de 0.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Para Tipo de \u00edndice, el valor por defecto de \"Versi\u00f3n 6.0 (Scorch)\" es apropiado para cualquier \u00edndice reci\u00e9n creado. Scorch reduce el tama\u00f1o del \u00edndice en disco y proporciona un rendimiento mejorado de MongoDB en el operador para la indexaci\u00f3n y la gesti\u00f3n de mutaciones.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Las particiones de \u00edndice pueden dejarse en el valor predeterminado de 6.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">En este punto, la p\u00e1gina de creaci\u00f3n del \u00edndice deber\u00eda tener el siguiente aspecto <\/span><span style=\"font-weight: 400\">el \u00faltimo fotograma capturado en<\/span><span style=\"font-weight: 400\"> Figura 5.  Haga clic en \"Crear \u00edndice\" para completar el proceso.\u00a0<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8368 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-5-creating-FTS-index-capture.gif\" alt=\"\" width=\"772\" height=\"785\" \/>\u00a0<\/span><\/p>\n<p style=\"text-align: center\"><i><span style=\"font-weight: 400\">Figura 5 - Creaci\u00f3n de un \u00edndice FTS con varias matrices<\/span><\/i><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Nota: Consulte en el Ap\u00e9ndice la carga \u00fatil JSON utilizada para crear este \u00edndice a trav\u00e9s de la API REST.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Pruebas de consultas sobre el \u00edndice:\u00a0<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">En la interfaz de b\u00fasqueda de texto completo, espere a que el progreso de indexaci\u00f3n muestre 100% y, a continuaci\u00f3n, haga clic en el nombre del \u00edndice \"hotel_mult_arrays\".\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Para buscar cualquier hotel con \"me gusta\" o \"opiniones\" de alguien llamado \"Ozella\", en el cuadro de texto \"buscar en este \u00edndice...\", introduce \"Ozella\" y haz clic en Buscar.  No es necesario delimitar el campo de la b\u00fasqueda porque ambos campos indexados est\u00e1n incluidos en el campo por defecto \"<\/span><span style=\"font-weight: 400\">todos\".<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Los resultados se muestran (de forma similar a la Figura 6) con la clave de cada documento coincidente y los campos coincidentes resaltados.  Los ID de los documentos devueltos son los mismos que los de nuestra consulta N1QL anterior.\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8369 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index-.png\" alt=\"\" width=\"1558\" height=\"1658\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index-.png 1558w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--282x300.png 282w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--962x1024.png 962w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--768x817.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--1443x1536.png 1443w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--300x319.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--20x20.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-6-testing-FTS-index--1320x1405.png 1320w\" sizes=\"auto, (max-width: 1558px) 100vw, 1558px\" \/><\/p>\n<p style=\"text-align: center\"><i><span style=\"font-weight: 400\">Figura 6 - Resultados de la b\u00fasqueda \"hotel_mult_arrays\" de \"Ozella\" en el \u00edndice<\/span><\/i><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Este es un \u00edndice \u00fanico en 2 claves de array, que, como se mencion\u00f3 anteriormente, es algo que nunca se podr\u00eda hacer en un \u00edndice basado en b-tree.  Ahora aprovechemos este \u00edndice FTS en una consulta N1QL usando la funci\u00f3n SEARCH(). Nuestra consulta podr\u00eda verse as\u00ed:\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECCIONE nombre, direcci\u00f3n, ciudad, pa\u00eds,\r\n       tel\u00e9fono, public_likes, opiniones\r\nFROM `viajes-muestra` AS t USE INDEX(hotel_mult_arrays USING FTS)\r\nWHERE t.type=\"hotel\"\r\nAND SEARCH(t, {\"query\": {\"match\": \"Ozella\"}}, {\"index\": \"hotel_mult_arrays\"});<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Algunas cosas a tener en cuenta sobre la consulta:\u00a0<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">La cl\u00e1usula USE INDEX...USING FTS especifica que debe utilizarse el \u00edndice FTS en lugar de un \u00edndice GSI, por lo que esta consulta no utiliza el servicio de \u00edndices. (<\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/hints.html#use-index-clause\"><span style=\"font-weight: 400\">Documentaci\u00f3n<\/span><\/a><span style=\"font-weight: 400\">)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Dado que nuestro \u00edndice FTS utiliza una asignaci\u00f3n de tipos personalizada, la consulta debe tener el tipo coincidente especificado en la cl\u00e1usula WHERE (t.type=\"hotel\").\u00a0\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">El nombre del \u00edndice FTS se especifica en el campo \"index\" de la funci\u00f3n SEARCH() como pista, pero es opcional, ya que la cl\u00e1usula USE INDEX tiene prioridad sobre una pista proporcionada en el campo \"index\".  (<\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/searchfun.html#search\"><span style=\"font-weight: 400\">Documentaci\u00f3n<\/span><\/a><span style=\"font-weight: 400\">)\u00a0\u00a0<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Utilizando el \u00edndice FTS que hemos creado, nuestra consulta N1QL se ejecuta correctamente y devuelve 5 resultados (hotel_5081, hotel_26020, hotel_10025, hotel_20425, hotel_25327) y el siguiente plan de ejecuci\u00f3n:\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8370 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/03\/BKane-FTS-Array-Figure-7-IndexFtsSearch-plan.png\" alt=\"\" width=\"934\" height=\"69\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-7-IndexFtsSearch-plan.png 934w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-7-IndexFtsSearch-plan-300x22.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-7-IndexFtsSearch-plan-768x57.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-Figure-7-IndexFtsSearch-plan-20x1.png 20w\" sizes=\"auto, (max-width: 934px) 100vw, 934px\" \/><\/p>\n<p style=\"text-align: center\"><i><span style=\"font-weight: 400\">Figura 7 - Plan de ejecuci\u00f3n con \u00edndices m\u00faltiples (FTS)<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400\">Mismo plan en JSON:<\/span><\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"#operator\": \"Secuencia\",\r\n  \"#stats\": {\r\n    \"#phaseSwitches\": 1,\r\n    \"execTime\": \"18.8\u00b5s\"\r\n  },\r\n  \"~children\": [\r\n    {\r\n      \"#operator\": \"Authorize\",\r\n      \"#stats\": {\r\n        \"#phaseSwitches\": 3,\r\n        \"execTime\": \"32.1\u00b5s\",\r\n        \"servTime\": \"3.421ms\"\r\n      },\r\n      \"privilegios\": {\r\n        \"Lista\": [\r\n          {\r\n            \"Objetivo\": \"default:muestra-viaje\",\r\n            \"Priv\": 7\r\n          }\r\n        ]\r\n      },\r\n      \"~child\": {\r\n        \"#operator\": \"Sequence\",\r\n        \"#stats\": {\r\n          \"#phaseSwitches\": 1,\r\n          \"execTime\": \"122.8\u00b5s\"\r\n        },\r\n        \"~children\": [\r\n          {\r\n            \"#operator\": \"IndexFtsSearch\",\r\n            \"#stats\": {\r\n              \"#itemsOut\": 5,\r\n              \"#phaseSwitches\": 23,\r\n              \"execTime\": \"239.3\u00b5s\",\r\n              \"kernTime\": \"84.5\u00b5s\",\r\n              \"servTime\": \"3.9146ms\"\r\n            },\r\n            \"as\": \"t\",\r\n            \"index\": \"hotel_mult_arrays\",\r\n            \"index_id\": \"7a28a8346fad6118\",\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\",\r\n            \"search_info\": {\r\n              \"field\": \"\\\"\\\"\",\r\n              \"options\": \"{\\\"index\\\": \\\"hotel_mult_arrays\\\"}\",\r\n              \"outname\": \"out\",\r\n              \"query\": \"{\\\"query\\\\\": {\\\"match\\\": \\Ozella\".}\r\n            },\r\n            \"using\": \"fts\",\r\n            \"#ime_normal\": \"00:00.004\",\r\n            \"#ime_absolute\": 0.0041539\r\n          },\r\n          {\r\n            \"#operator\": \"Fetch\",\r\n            \"#stats\": {\r\n              \"#itemsIn\": 5,\r\n              \"#itemsOut\": 5,\r\n              \"#phaseSwitches\": 25,\r\n              \"execTime\": \"334.8\u00b5s\",\r\n              \"kernTime\": \"4.4328ms\",\r\n              \"servTime\": \"1.5272ms\"\r\n            },\r\n            \"as\": \"t\",\r\n            \"keyspace\": \"muestra-viaje\",\r\n            \"namespace\": \"default\",\r\n            \"#iempo_normal\": \"00:00.001\",\r\n            \"#ime_absolute\": 0.001862\r\n          },\r\n          {\r\n            \"#operator\": \"Parallel\",\r\n            \"#stats\": {\r\n              \"#phaseSwitches\": 1,\r\n              \"execTime\": \"21.1\u00b5s\"\r\n            },\r\n            \"copies\": 2,\r\n            \"~child\": {\r\n              \"#operator\": \"Sequence\",\r\n              \"#stats\": {\r\n                \"#phaseSwitches\": 2,\r\n                \"execTime\": \"49.1\u00b5s\"\r\n              },\r\n              \"~children\": [\r\n                {\r\n                  \"#operator\": \"Filter\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 26,\r\n                    \"execTime\": \"6.8953ms\",\r\n                    \"kernTime\": \"14.8149ms\"\r\n                  },\r\n                  \"condition\": \"((`t`.`type`) = \\\"hotel\\\") and search(`t`, {\\\"query\\\": {\\\"match\\\": \\Ozella\", \"index\": \\\"hotel_mult_arrays\\\"}))\",\r\n                  \"#ime_normal\": \"00:00.006\",\r\n                  \"#ime_absolute\": 0.0068953\r\n                },\r\n                {\r\n                  \"#operator\": \"InitialProject\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 25,\r\n                    \"execTime\": \"2.3597ms\",\r\n                    \"kernTime\": \"20.7458ms\"\r\n                  },\r\n                  \"result_terms\": [\r\n                    {\r\n                      \"expr\": \"(`t`.`nombre`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`dress`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`ciudad`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`country`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`phone`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`public_likes`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`reviews`)\"\r\n                    }\r\n                  ],\r\n                  \"#ime_normal\": \"00:00.002\",\r\n                  \"#ime_absolute\": 0.0023597\r\n                },\r\n                {\r\n                  \"#operator\": \"FinalProject\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 17,\r\n                    \"execTime\": \"300\u00b5s\",\r\n                    \"kernTime\": \"375.9\u00b5s\"\r\n                  },\r\n                  \"#ime_normal\": \"00:00\",\r\n                  \"#ime_absolute\": 0\r\n                }\r\n              ],\r\n              \"#ime_normal\": \"00:00.000\",\r\n              \"#ime_absolute\": 0.0000491\r\n            },\r\n            \"#ime_normal\": \"00:00.000\",\r\n            \"#ime_absolute\": 0.0000211\r\n          }\r\n        ],\r\n        \"#ime_normal\": \"00:00.000\",\r\n        \"#ime_absolute\": 0.0001228\r\n      },\r\n      \"#ime_normal\": \"00:00.003\",\r\n      \"#ime_absolute\": 0.0034531\r\n    },\r\n    {\r\n      \"#operator\": \"Stream\",\r\n      \"#stats\": {\r\n        \"#itemsIn\": 5,\r\n        \"#itemsOut\": 5,\r\n        \"#phaseSwitches\": 13,\r\n        \"execTime\": \"1.3409ms\",\r\n        \"kernTime\": \"14.8586ms\"\r\n      },\r\n      \"#ime_normal\": \"00:00.001\",\r\n      \"#ime_absolute\": 0.0013409\r\n    }\r\n  ],\r\n  \"~versiones\": [\r\n    \"2.0.0-N1QL\",\r\n    \"6.5.0-4960-enterprise\"\r\n  ],\r\n  \"#iempo_normal\": \"00:00.000\",\r\n  \"#ime_absolute\": 0.0000188\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">En el cluster de un solo nodo que se utiliza para estos ejemplos, el tiempo transcurrido de la consulta es de unos 20 milisegundos para devolver los mismos 5 documentos.  Como se puede ver en el plan, hay un operador IndexFtsSearch pero no hay operadores IndexScan3, DistinctScan, UnionScan o IntersectScan.  La consulta global es mucho m\u00e1s eficiente sin estos costosos operadores GSI. El operador IndexFtsSearch env\u00eda los 5 documentos coincidentes del \u00edndice FTS al operador Fetch, que s\u00f3lo obtiene esos 5 documentos.  La obtenci\u00f3n es mucho m\u00e1s eficiente aqu\u00ed que en la consulta anterior, ya que s\u00f3lo obtiene 5 documentos frente a 904. Esto tambi\u00e9n puede observarse en la comparaci\u00f3n de los tiempos totales transcurridos (y el servTime de los operadores de obtenci\u00f3n: 170 ms en la consulta 1 y 1,5 ms en la consulta 2) entre las consultas.\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Conclusi\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Con GSI puede mezclar y combinar m\u00faltiples \u00edndices de matrices en una sola consulta, pero con FTS puede mezclar y combinar m\u00faltiples matrices en un solo \u00edndice FTS (y con FTS no hay problema de clave principal como en GSI con respecto al orden de los campos en el \u00edndice).  Como hemos demostrado en este sencillo ejemplo de consulta de 2 matrices en los documentos del hotel, la utilizaci\u00f3n de la nueva funci\u00f3n SEARCH() en N1QL puede dar lugar a consultas de matrices m\u00e1s sencillas y eficaces. El mismo concepto podr\u00eda aplicarse a las consultas que utilizan varias matrices, lo que tendr\u00eda resultados a\u00fan m\u00e1s favorables sobre las consultas N1QL que utilizan m\u00faltiples \u00edndices de matrices GSI.  Este enfoque utiliza menos recursos del sistema y proporciona un mayor rendimiento, lo que se traduce en un aumento de la eficiencia general del sistema.\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Este es s\u00f3lo un ejemplo de los beneficios de la integraci\u00f3n entre N1QL y FTS, y otros beneficios est\u00e1n documentados en las entradas de blog en la secci\u00f3n de referencias a continuaci\u00f3n.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Referencias<\/span><\/h2>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Recursos de b\u00fasqueda de Couchbase: <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/full-text-search\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/products\/full-text-search<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Documentaci\u00f3n de Couchbase FTS: <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/fts\/full-text-intro.html\"><span style=\"font-weight: 400\">https:\/\/docs.couchbase.com\/server\/current\/fts\/full-text-intro.html<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Documentaci\u00f3n de b\u00fasqueda N1QL de Couchbase: <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/searchfun.html\"><span style=\"font-weight: 400\">https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/searchfun.html<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Entradas en el blog de Couchbase FTS: <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/category\/full-text-search\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/category\/full-text-search\/<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Formaci\u00f3n online de Couchbase FTS: <\/span><a href=\"https:\/\/learn.couchbase.com\/store\/509465-cb121-intro-to-couchbase-full-text-search-fts\"><span style=\"font-weight: 400\">https:\/\/learn.couchbase.com\/store\/509465-cb121-intro-to-couchbase-full-text-search-fts<\/span><\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Anexo<\/span><\/h2>\n<h3><span style=\"font-weight: 400\">\u00cdndice Definici\u00f3n JSON: hotel_mult_arrays<\/span><\/h3>\n<p>&nbsp;<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"#operator\": \"Secuencia\",\r\n  \"#stats\": {\r\n    \"#phaseSwitches\": 1,\r\n    \"execTime\": \"18.8\u00b5s\"\r\n  },\r\n  \"~children\": [\r\n    {\r\n      \"#operator\": \"Authorize\",\r\n      \"#stats\": {\r\n        \"#phaseSwitches\": 3,\r\n        \"execTime\": \"32.1\u00b5s\",\r\n        \"servTime\": \"3.421ms\"\r\n      },\r\n      \"privilegios\": {\r\n        \"Lista\": [\r\n          {\r\n            \"Objetivo\": \"default:muestra-viaje\",\r\n            \"Priv\": 7\r\n          }\r\n        ]\r\n      },\r\n      \"~child\": {\r\n        \"#operator\": \"Sequence\",\r\n        \"#stats\": {\r\n          \"#phaseSwitches\": 1,\r\n          \"execTime\": \"122.8\u00b5s\"\r\n        },\r\n        \"~children\": [\r\n          {\r\n            \"#operator\": \"IndexFtsSearch\",\r\n            \"#stats\": {\r\n              \"#itemsOut\": 5,\r\n              \"#phaseSwitches\": 23,\r\n              \"execTime\": \"239.3\u00b5s\",\r\n              \"kernTime\": \"84.5\u00b5s\",\r\n              \"servTime\": \"3.9146ms\"\r\n            },\r\n            \"as\": \"t\",\r\n            \"index\": \"hotel_mult_arrays\",\r\n            \"index_id\": \"7a28a8346fad6118\",\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\",\r\n            \"search_info\": {\r\n              \"field\": \"\\\"\\\"\",\r\n              \"options\": \"{\\\"index\\\": \\\"hotel_mult_arrays\\\"}\",\r\n              \"outname\": \"out\",\r\n              \"query\": \"{\\\"query\\\\\": {\\\"match\\\": \\Ozella\".}\r\n            },\r\n            \"using\": \"fts\",\r\n            \"#ime_normal\": \"00:00.004\",\r\n            \"#ime_absolute\": 0.0041539\r\n          },\r\n          {\r\n            \"#operator\": \"Fetch\",\r\n            \"#stats\": {\r\n              \"#itemsIn\": 5,\r\n              \"#itemsOut\": 5,\r\n              \"#phaseSwitches\": 25,\r\n              \"execTime\": \"334.8\u00b5s\",\r\n              \"kernTime\": \"4.4328ms\",\r\n              \"servTime\": \"1.5272ms\"\r\n            },\r\n            \"as\": \"t\",\r\n            \"keyspace\": \"muestra-viaje\",\r\n            \"namespace\": \"default\",\r\n            \"#iempo_normal\": \"00:00.001\",\r\n            \"#ime_absolute\": 0.001862\r\n          },\r\n          {\r\n            \"#operator\": \"Parallel\",\r\n            \"#stats\": {\r\n              \"#phaseSwitches\": 1,\r\n              \"execTime\": \"21.1\u00b5s\"\r\n            },\r\n            \"copies\": 2,\r\n            \"~child\": {\r\n              \"#operator\": \"Sequence\",\r\n              \"#stats\": {\r\n                \"#phaseSwitches\": 2,\r\n                \"execTime\": \"49.1\u00b5s\"\r\n              },\r\n              \"~children\": [\r\n                {\r\n                  \"#operator\": \"Filter\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 26,\r\n                    \"execTime\": \"6.8953ms\",\r\n                    \"kernTime\": \"14.8149ms\"\r\n                  },\r\n                  \"condition\": \"((`t`.`type`) = \\\"hotel\\\") and search(`t`, {\\\"query\\\": {\\\"match\\\": \\Ozella\", \"index\": \\\"hotel_mult_arrays\\\"}))\",\r\n                  \"#ime_normal\": \"00:00.006\",\r\n                  \"#ime_absolute\": 0.0068953\r\n                },\r\n                {\r\n                  \"#operator\": \"InitialProject\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 25,\r\n                    \"execTime\": \"2.3597ms\",\r\n                    \"kernTime\": \"20.7458ms\"\r\n                  },\r\n                  \"result_terms\": [\r\n                    {\r\n                      \"expr\": \"(`t`.`nombre`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`dress`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`ciudad`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`country`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`phone`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`public_likes`)\"\r\n                    },\r\n                    {\r\n                      \"expr\": \"(`t`.`reviews`)\"\r\n                    }\r\n                  ],\r\n                  \"#ime_normal\": \"00:00.002\",\r\n                  \"#ime_absolute\": 0.0023597\r\n                },\r\n                {\r\n                  \"#operator\": \"FinalProject\",\r\n                  \"#stats\": {\r\n                    \"#itemsIn\": 5,\r\n                    \"#itemsOut\": 5,\r\n                    \"#phaseSwitches\": 17,\r\n                    \"execTime\": \"300\u00b5s\",\r\n                    \"kernTime\": \"375.9\u00b5s\"\r\n                  },\r\n                  \"#ime_normal\": \"00:00\",\r\n                  \"#ime_absolute\": 0\r\n                }\r\n              ],\r\n              \"#ime_normal\": \"00:00.000\",\r\n              \"#ime_absolute\": 0.0000491\r\n            },\r\n            \"#ime_normal\": \"00:00.000\",\r\n            \"#ime_absolute\": 0.0000211\r\n          }\r\n        ],\r\n        \"#ime_normal\": \"00:00.000\",\r\n        \"#ime_absolute\": 0.0001228\r\n      },\r\n      \"#ime_normal\": \"00:00.003\",\r\n      \"#ime_absolute\": 0.0034531\r\n    },\r\n    {\r\n      \"#operator\": \"Stream\",\r\n      \"#stats\": {\r\n        \"#itemsIn\": 5,\r\n        \"#itemsOut\": 5,\r\n        \"#phaseSwitches\": 13,\r\n        \"execTime\": \"1.3409ms\",\r\n        \"kernTime\": \"14.8586ms\"\r\n      },\r\n      \"#ime_normal\": \"00:00.001\",\r\n      \"#ime_absolute\": 0.0013409\r\n    }\r\n  ],\r\n  \"~versiones\": [\r\n    \"2.0.0-N1QL\",\r\n    \"6.5.0-4960-enterprise\"\r\n  ],\r\n  \"#iempo_normal\": \"00:00.000\",\r\n  \"#ime_absolute\": 0.0000188\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction Couchbase Full Text Search (FTS) is a great fit for indexing multiple arrays and executing queries with multiple filter predicates in arrays.\u00a0 In this article, I\u2019ll demonstrate the advantages of using FTS over GSI (Global Secondary Index) for array [&hellip;]<\/p>","protected":false},"author":16362,"featured_media":8371,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2165,2453,1812],"tags":[1505],"ppma_author":[9100],"class_list":["post-8362","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-full-text-search","category-global-secondary-index","category-n1ql-query","tag-index"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MongoDB in Operator Performance: Querying Multiple Arrays<\/title>\n<meta name=\"description\" content=\"Learn the advantage of using FTS over GSI for array indexing with an example that requires querying multiple arrays with MongoDB in operator performance.\" \/>\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\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FTS and N1QL: Better MongoDB in Operator Performance Querying Multiple Arrays\" \/>\n<meta property=\"og:description\" content=\"Learn the advantage of using FTS over GSI for array indexing with an example that requires querying multiple arrays with MongoDB in operator performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-27T01:08:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:59:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1279\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Brian Kane, Solutions Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Brian Kane, Solutions Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\"},\"author\":{\"name\":\"Brian Kane, Solutions Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/69569e5446e8ee83e32f8e5ed50a250e\"},\"headline\":\"FTS and N1QL: Better MongoDB in Operator Performance Querying Multiple Arrays\",\"datePublished\":\"2020-03-27T01:08:28+00:00\",\"dateModified\":\"2025-06-14T03:59:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\"},\"wordCount\":2277,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg\",\"keywords\":[\"Index\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Full-Text Search\",\"Global Secondary Index\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\",\"name\":\"MongoDB in Operator Performance: Querying Multiple Arrays\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg\",\"datePublished\":\"2020-03-27T01:08:28+00:00\",\"dateModified\":\"2025-06-14T03:59:06+00:00\",\"description\":\"Learn the advantage of using FTS over GSI for array indexing with an example that requires querying multiple arrays with MongoDB in operator performance.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg\",\"width\":1920,\"height\":1279},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FTS and N1QL: Better MongoDB in Operator Performance Querying Multiple Arrays\"}]},{\"@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\/69569e5446e8ee83e32f8e5ed50a250e\",\"name\":\"Brian Kane, Solutions Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d6ceb7493ed6dce23e12c34a4d31643e\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/366c828464bd7bc90174aca4473a71c317f4578e440915acf85a1de7e170c1e0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/366c828464bd7bc90174aca4473a71c317f4578e440915acf85a1de7e170c1e0?s=96&d=mm&r=g\",\"caption\":\"Brian Kane, Solutions Engineer, Couchbase\"},\"description\":\"Brian Kane is a Solutions Engineer at Couchbase and has been working in application development and with database technologies since 1996. He is based in the Houston, Texas area.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/brian-kanecouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MongoDB in Operator Performance: Querying Multiple Arrays","description":"Aprenda la ventaja de utilizar FTS sobre GSI para la indexaci\u00f3n de matrices con un ejemplo que requiere la consulta de m\u00faltiples matrices con MongoDB en el rendimiento del operador.","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\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/","og_locale":"es_MX","og_type":"article","og_title":"FTS and N1QL: Better MongoDB in Operator Performance Querying Multiple Arrays","og_description":"Learn the advantage of using FTS over GSI for array indexing with an example that requires querying multiple arrays with MongoDB in operator performance.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-03-27T01:08:28+00:00","article_modified_time":"2025-06-14T03:59:06+00:00","og_image":[{"width":1920,"height":1279,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg","type":"image\/jpeg"}],"author":"Brian Kane, Solutions Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Brian Kane, Solutions Engineer, Couchbase","Est. reading time":"16 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/"},"author":{"name":"Brian Kane, Solutions Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/69569e5446e8ee83e32f8e5ed50a250e"},"headline":"FTS and N1QL: Better MongoDB in Operator Performance Querying Multiple Arrays","datePublished":"2020-03-27T01:08:28+00:00","dateModified":"2025-06-14T03:59:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/"},"wordCount":2277,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg","keywords":["Index"],"articleSection":["Best Practices and Tutorials","Full-Text Search","Global Secondary Index","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/","url":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/","name":"MongoDB in Operator Performance: Querying Multiple Arrays","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg","datePublished":"2020-03-27T01:08:28+00:00","dateModified":"2025-06-14T03:59:06+00:00","description":"Aprenda la ventaja de utilizar FTS sobre GSI para la indexaci\u00f3n de matrices con un ejemplo que requiere la consulta de m\u00faltiples matrices con MongoDB en el rendimiento del operador.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/03\/BKane-FTS-Array-scrabble.jpg","width":1920,"height":1279},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/fts-and-n1ql-improving-performance-when-querying-multiple-arrays\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FTS and N1QL: Better MongoDB in Operator Performance Querying Multiple Arrays"}]},{"@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\/69569e5446e8ee83e32f8e5ed50a250e","name":"Brian Kane, Ingeniero de soluciones, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d6ceb7493ed6dce23e12c34a4d31643e","url":"https:\/\/secure.gravatar.com\/avatar\/366c828464bd7bc90174aca4473a71c317f4578e440915acf85a1de7e170c1e0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/366c828464bd7bc90174aca4473a71c317f4578e440915acf85a1de7e170c1e0?s=96&d=mm&r=g","caption":"Brian Kane, Solutions Engineer, Couchbase"},"description":"Brian Kane es Ingeniero de Soluciones en Couchbase y lleva trabajando en el desarrollo de aplicaciones y con tecnolog\u00edas de bases de datos desde 1996. Reside en el \u00e1rea de Houston, Texas.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/brian-kanecouchbase-com\/"}]}},"authors":[{"term_id":9100,"user_id":16362,"is_guest":0,"slug":"brian-kanecouchbase-com","display_name":"Brian Kane, Solutions Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/366c828464bd7bc90174aca4473a71c317f4578e440915acf85a1de7e170c1e0?s=96&d=mm&r=g","author_category":"","last_name":"Kane, Solutions Engineer, Couchbase","first_name":"Brian","job_title":"","user_url":"","description":"Brian Kane es Ingeniero de Soluciones en Couchbase y lleva trabajando en el desarrollo de aplicaciones y con tecnolog\u00edas de bases de datos desde 1996. Reside en el \u00e1rea de Houston, Texas."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/8362","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\/16362"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=8362"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/8362\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/8371"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=8362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=8362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=8362"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=8362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}