> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-locadex-parallel-t9n-main-irpovz79o3kkpgs4.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Centre d’assistance

> Consultez et recherchez dans la base de connaissances ClickHouse

export const kbIndex = {
  categories: ["Cloud", "Configuration & settings", "Data import & export", "Data management", "General & FAQs", "Integrations & client libraries", "Materialized views & projections", "Monitoring & debugging", "Performance & optimization", "Queries & SQL", "Security & access control", "Setup & installation", "Tables & schema", "Troubleshooting & errors"],
  tags: ["Best Practices", "Community", "Concepts", "Core Data Concepts", "Data Export", "Data Formats", "Data Ingestion", "Data Modelling", "Data Sources", "Deployments and Scaling", "Errors and Exceptions", "Functions", "Language Clients", "Managing Cloud", "Managing Data", "Native Clients and Interfaces", "Performance and Optimizations", "Security and Authentication", "Server Admin", "Settings", "System Tables", "Tools and Utilities", "Troubleshooting", "Use Cases"],
  articles: [{
    id: "integrations/python-clickhouse-connect-example",
    title: "Exemple fonctionnel de client Python pour se connecter à ClickHouse Cloud Service",
    description: "Learn how to connect to ClickHouse Cloud Service using Python with a step-by-step example using the clickhouse-connect driver.",
    href: "/resources/support-center/knowledge-base/integrations/python-clickhouse-connect-example",
    category: "Integrations & client libraries",
    tags: ["Language Clients"]
  }, {
    id: "configuration-settings/about-quotas-and-query-complexity",
    title: "À propos des quotas et de la complexité des requêtes",
    description: "Quotas and Query Complexity are powerful ways to limit and restrict what users can do in ClickHouse. This KB article shows examples on how to apply these two different approaches.",
    href: "/resources/support-center/knowledge-base/configuration-settings/about-quotas-and-query-complexity",
    category: "Configuration & settings",
    tags: ["Managing Cloud"]
  }, {
    id: "data-import-export/achieving-atomic-inserts",
    title: "Achieving atomic inserts and multi-table consistency in ClickHouse Cloud",
    description: "How to load data atomically and keep multiple tables consistent in ClickHouse Cloud without multi-statement transactions, using staging tables and partition-level operations.",
    href: "/resources/support-center/knowledge-base/data-import-export/achieving-atomic-inserts",
    category: "Data import & export",
    tags: ["Data Ingestion", "Best Practices"]
  }, {
    id: "tables-schema/add-column",
    title: "Adding a column to a table",
    description: "In this guide, we'll learn how to add a column to an existing table.",
    href: "/resources/support-center/knowledge-base/tables-schema/add-column",
    category: "Tables & schema",
    tags: ["Data Modelling"]
  }, {
    id: "configuration-settings/alter-user-settings-exception",
    title: "Exception lors de la modification des paramètres utilisateur",
    description: "Handing the an exception thrown when altering user settings",
    href: "/resources/support-center/knowledge-base/configuration-settings/alter-user-settings-exception",
    category: "Configuration & settings",
    tags: ["Settings", "Errors and Exceptions"]
  }, {
    id: "materialized-views/are-materialized-views-inserted-asynchronously",
    title: "Are Materialized Views inserted synchronously?",
    description: "This KB article explores whether Materialized Views are inserted synchronously",
    href: "/resources/support-center/knowledge-base/materialized-views/are-materialized-views-inserted-asynchronously",
    category: "Materialized views & projections",
    tags: ["Data Modelling"]
  }, {
    id: "tables-schema/schema-migration-tools",
    title: "Automatic schema migration tools for ClickHouse",
    description: "Learn about automatic schema migration tools for ClickHouse and how to manage changing database schemas over time.",
    href: "/resources/support-center/knowledge-base/tables-schema/schema-migration-tools",
    category: "Tables & schema",
    tags: ["Tools and Utilities"]
  }, {
    id: "cloud-services/aws-privatelink-setup-for-msk-clickpipes",
    title: "AWS PrivateLink setup to expose MSK for ClickPipes",
    description: "Setup steps to expose a private MSK via MSK multi-VPC connectivity to ClickPipes.",
    href: "/resources/support-center/knowledge-base/cloud-services/aws-privatelink-setup-for-msk-clickpipes",
    category: "Cloud",
    tags: ["Security and Authentication", "Managing Cloud"]
  }, {
    id: "cloud-services/aws-privatelink-setup-for-clickpipes",
    title: "AWS PrivateLink setup to expose private RDS for ClickPipes",
    description: "Setup steps to expose a private RDS via AWS PrivateLink to ClickPipes.",
    href: "/resources/support-center/knowledge-base/cloud-services/aws-privatelink-setup-for-clickpipes",
    category: "Cloud",
    tags: ["Security and Authentication", "Managing Cloud"]
  }, {
    id: "data-management/backing-up-a-specific-partition",
    title: "Backing up a specific partition",
    description: "How can I backup a specific partition in ClickHouse?",
    href: "/resources/support-center/knowledge-base/data-management/backing-up-a-specific-partition",
    category: "Data management",
    tags: ["Managing Data"]
  }, {
    id: "general-faqs/key-value",
    title: "Can I use ClickHouse as a key-value storage?",
    description: "Answers the frequently asked question of whether or not ClickHouse can be used as a key-value storage?",
    href: "/resources/support-center/knowledge-base/general-faqs/key-value",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/time-series",
    title: "Can I use ClickHouse as a time-series database?",
    description: "Page describing how to use ClickHouse as a time-series database",
    href: "/resources/support-center/knowledge-base/general-faqs/time-series",
    category: "General & FAQs",
    tags: []
  }, {
    id: "queries-sql/pivot",
    title: "Can you PIVOT in ClickHouse?",
    description: "ClickHouse doesn't have a PIVOT clause, but we can get close to this functionality using aggregate function combinators. Let's see how to do this using the UK housing prices dataset.",
    href: "/resources/support-center/knowledge-base/queries-sql/pivot",
    category: "Queries & SQL",
    tags: ["Data Modelling", "Core Data Concepts"]
  }, {
    id: "general-faqs/vector-search",
    title: "Can you use ClickHouse for vector search?",
    description: "Learn how to use ClickHouse for vector search, including storing embeddings and searching with distance functions like cosine similarity.",
    href: "/resources/support-center/knowledge-base/general-faqs/vector-search",
    category: "General & FAQs",
    tags: ["Use Cases", "Concepts"]
  }, {
    id: "monitoring-debugging/send-logs-level",
    title: "Capturing server logs of queries at the client",
    description: "Learn how to capture server logs at the client level, even with different log settings, using the `send_logs_level` client setting.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/send-logs-level",
    category: "Monitoring & debugging",
    tags: ["Server Admin"]
  }, {
    id: "configuration-settings/change-the-prompt-in-clickhouse-client",
    title: "Change the prompt in clickhouse-client",
    description: "This article explains how to change the prompt in your Clickhouse client and clickhouse-local terminal window from :) to a prefix followed by :)",
    href: "/resources/support-center/knowledge-base/configuration-settings/change-the-prompt-in-clickhouse-client",
    category: "Configuration & settings",
    tags: ["Settings", "Native Clients and Interfaces"]
  }, {
    id: "security/common-rbac-queries",
    title: "Common RBAC queries",
    description: "Queries to help grant specific permissions to users.",
    href: "/resources/support-center/knowledge-base/security/common-rbac-queries",
    category: "Security & access control",
    tags: ["Security and Authentication", "Managing Cloud"]
  }, {
    id: "queries-sql/comparing-metrics-between-queries",
    title: "Comparing metrics between queries in decibels",
    description: "A query to compare metrics between two queries in ClickHouse.",
    href: "/resources/support-center/knowledge-base/queries-sql/comparing-metrics-between-queries",
    category: "Queries & SQL",
    tags: ["Performance and Optimizations"]
  }, {
    id: "configuration-settings/configure-cap-ipc-lock-and-cap-sys-nice-in-docker",
    title: "Configuring CAP_IPC_LOCK and CAP_SYS_NICE Capabilities in Docker",
    description: "Learn how to resolve Docker capability warnings for `CAP_IPC_LOCK` and `CAP_SYS_NICE` when running ClickHouse in a container.",
    href: "/resources/support-center/knowledge-base/configuration-settings/configure-cap-ipc-lock-and-cap-sys-nice-in-docker",
    category: "Configuration & settings",
    tags: ["Errors and Exceptions"]
  }, {
    id: "troubleshooting/configure-cap-ipc-lock-and-cap-sys-nice-in-docker",
    title: "Configuring CAP_IPC_LOCK and CAP_SYS_NICE Capabilities in Docker",
    description: "Learn how to resolve Docker capability warnings for `CAP_IPC_LOCK` and `CAP_SYS_NICE` when running ClickHouse in a container.",
    href: "/resources/support-center/knowledge-base/troubleshooting/configure-cap-ipc-lock-and-cap-sys-nice-in-docker",
    category: "Troubleshooting & errors",
    tags: ["Errors and Exceptions"]
  }, {
    id: "cloud-services/custom-dns-alias-for-instance",
    title: "Create a custom DNS alias by setting up a reverse proxy",
    description: "Learn how to set up a custom DNS alias for your instance using a reverse proxy",
    href: "/resources/support-center/knowledge-base/cloud-services/custom-dns-alias-for-instance",
    category: "Cloud",
    tags: ["Server Admin", "Security and Authentication"]
  }, {
    id: "troubleshooting/part-intersects-previous-part",
    title: "DB::Exception: Part XXXXX intersects previous part YYYYY. It is a bug or a result of manual intervention in the ZooKeeper data.",
    description: "This article explains how to resolve the DB::Exception error related to intersecting parts in ClickHouse, often caused by a race condition or manual intervention in the ZooKeeper data.",
    href: "/resources/support-center/knowledge-base/troubleshooting/part-intersects-previous-part",
    category: "Troubleshooting & errors",
    tags: ["Errors and Exceptions", "System Tables"]
  }, {
    id: "setup-installation/difference-between-official-builds-and-3rd-party",
    title: "Differences Between Official and 3rd-Party ClickHouse Builds",
    description: "Understand the key differences between official ClickHouse builds and 3rd-party builds, including updates, compatibility, and security considerations.",
    href: "/resources/support-center/knowledge-base/setup-installation/difference-between-official-builds-and-3rd-party",
    category: "Setup & installation",
    tags: ["Concepts"]
  }, {
    id: "general-faqs/cost-based",
    title: "Does ClickHouse have a cost-based optimizer",
    description: "ClickHouse has certain cost-based optimization mechanics",
    href: "/resources/support-center/knowledge-base/general-faqs/cost-based",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/datalake",
    title: "Does ClickHouse support data lakes?",
    description: "ClickHouse supports data lakes, including Iceberg, Delta Lake, Apache Hudi, Apache Paimon, Hive",
    href: "/resources/support-center/knowledge-base/general-faqs/datalake",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/distributed-join",
    title: "Does ClickHouse support distributed JOIN?",
    description: "ClickHouse supports distributed JOIN",
    href: "/resources/support-center/knowledge-base/general-faqs/distributed-join",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/federated",
    title: "Does ClickHouse support federated queries?",
    description: "ClickHouse supports a wide range for federated and hybrid queries",
    href: "/resources/support-center/knowledge-base/general-faqs/federated",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/concurrency",
    title: "Does ClickHouse support frequent, concurrent queries?",
    description: "ClickHouse supports high QPS and high concurrency",
    href: "/resources/support-center/knowledge-base/general-faqs/concurrency",
    category: "General & FAQs",
    tags: []
  }, {
    id: "cloud-services/multi-region-replication",
    title: "Does ClickHouse support multi-region replication?",
    description: "This page answers whether ClickHouse supports multi-region replication",
    href: "/resources/support-center/knowledge-base/cloud-services/multi-region-replication",
    category: "Cloud",
    tags: []
  }, {
    id: "general-faqs/updates",
    title: "Does ClickHouse support real-time updates?",
    description: "ClickHouse supports lightweight real-time updates",
    href: "/resources/support-center/knowledge-base/general-faqs/updates",
    category: "General & FAQs",
    tags: []
  }, {
    id: "security/row-column-policy",
    title: "Does ClickHouse support row-level and column-level security?",
    description: "Learn about row-level and column-level access restrictions in ClickHouse and ClickHouse Cloud, and how to implement role-based access control (RBAC) with policies.",
    href: "/resources/support-center/knowledge-base/security/row-column-policy",
    category: "Security & access control",
    tags: ["Security and Authentication"]
  }, {
    id: "cloud-services/execute-system-queries-in-cloud",
    title: "Exécuter des instructions SYSTEM sur tous les nœuds dans ClickHouse Cloud",
    description: "Learn how to use `ON CLUSTER` and `clusterAllReplicas` to execute SYSTEM statements and queries across all nodes in a ClickHouse Cloud service.",
    href: "/resources/support-center/knowledge-base/cloud-services/execute-system-queries-in-cloud",
    category: "Cloud",
    tags: ["Deployments and Scaling"]
  }, {
    id: "troubleshooting/count-parts-by-type",
    title: "Find counts and sizes of wide or compact parts",
    description: "This knowledgebase article shows you how to find part counts by the type of part - wide or compact.",
    href: "/resources/support-center/knowledge-base/troubleshooting/count-parts-by-type",
    category: "Troubleshooting & errors",
    tags: ["Troubleshooting"]
  }, {
    id: "troubleshooting/fix-developer-verification-error-in-macos",
    title: "Corriger l'erreur de vérification du développeur dans macOS",
    description: "Learn how to resolve the MacOS developer verification error when running ClickHouse commands, using either System Settings or the terminal.",
    href: "/resources/support-center/knowledge-base/troubleshooting/fix-developer-verification-error-in-macos",
    category: "Troubleshooting & errors",
    tags: ["Errors and Exceptions"]
  }, {
    id: "data-import-export/s3-export-data-year-month-folders",
    title: "How can I do partitioned writes by year and month on S3?",
    description: "Learn how to write partitioned data by year and month to an S3 bucket in ClickHouse, using a custom path structure for organizing the data.",
    href: "/resources/support-center/knowledge-base/data-import-export/s3-export-data-year-month-folders",
    category: "Data import & export",
    tags: ["Data Export", "Native Clients and Interfaces"]
  }, {
    id: "data-import-export/kafka-clickhouse-json",
    title: "Comment utiliser le nouveau type de données JSON avec Kafka ?",
    description: "Learn how to load JSON messages from Apache Kafka directly into a single JSON column in ClickHouse using the Kafka table engine and JSON data type.",
    href: "/resources/support-center/knowledge-base/data-import-export/kafka-clickhouse-json",
    category: "Data import & export",
    tags: ["Data Formats", "Data Ingestion"]
  }, {
    id: "cloud-services/change-billing-email",
    title: "Comment modifier mon contact de facturation dans ClickHouse Cloud ?",
    description: "Let's learn how to change your billing address in ClickHouse Cloud.",
    href: "/resources/support-center/knowledge-base/cloud-services/change-billing-email",
    category: "Cloud",
    tags: ["Managing Cloud"]
  }, {
    id: "general-faqs/how-do-i-contribute-code-to-clickhouse",
    title: "How do I contribute code to ClickHouse?",
    description: "ClickHouse is an open-source project developed on GitHub. As customary, contribution instructions are published in CONTRIBUTING file in the root of the source code repository.",
    href: "/resources/support-center/knowledge-base/general-faqs/how-do-i-contribute-code-to-clickhouse",
    category: "General & FAQs",
    tags: ["Community"]
  }, {
    id: "data-import-export/parquet-to-csv-json",
    title: "Comment convertir des fichiers Parquet en CSV ou JSON ?",
    description: "Learn how to use ClickHouse's `clickhouse-local` tool to easily convert Parquet files to CSV or JSON formats.",
    href: "/resources/support-center/knowledge-base/data-import-export/parquet-to-csv-json",
    category: "Data import & export",
    tags: ["Data Sources", "Data Formats"]
  }, {
    id: "data-import-export/mysql-to-parquet-csv-json",
    title: "Comment exporter des données MySQL vers Parquet, CSV ou JSON avec ClickHouse",
    description: "Learn how to use the `clickhouse-local` tool to export MySQL data into formats like Parquet, CSV, or JSON quickly and efficiently.",
    href: "/resources/support-center/knowledge-base/data-import-export/mysql-to-parquet-csv-json",
    category: "Data import & export",
    tags: ["Data Formats", "Data Export"]
  }, {
    id: "data-import-export/postgresql-to-parquet-csv-json",
    title: "How do I export PostgreSQL data to Parquet, CSV or JSON?",
    description: "Learn how to export PostgreSQL data to Parquet, CSV, or JSON formats using `clickhouse-local` with various examples.",
    href: "/resources/support-center/knowledge-base/data-import-export/postgresql-to-parquet-csv-json",
    category: "Data import & export",
    tags: ["Data Export", "Data Formats"]
  }, {
    id: "setup-installation/install-clickhouse-windows10",
    title: "Comment installer ClickHouse sur Windows 10 ?",
    description: "Learn how to install and test ClickHouse on Windows 10 using WSL 2. Includes setup, troubleshooting, and running a test environment.",
    href: "/resources/support-center/knowledge-base/setup-installation/install-clickhouse-windows10",
    category: "Setup & installation",
    tags: ["Tools and Utilities"]
  }, {
    id: "security/remove-default-user",
    title: "How do I remove the default user?",
    description: "Learn how to remove the default user when running ClickHouse Server.",
    href: "/resources/support-center/knowledge-base/security/remove-default-user",
    category: "Security & access control",
    tags: ["Server Admin"]
  }, {
    id: "cloud-services/ingest-failures-23-9-release",
    title: "Comment résoudre les échecs d'ingestion après la version 23.9 de ClickHouse ?",
    description: "Learn how to resolve ingest failures caused by stricter grant checking introduced in ClickHouse 23.9 for tables using `async_inserts`. Update grants to fix errors.",
    href: "/resources/support-center/knowledge-base/cloud-services/ingest-failures-23-9-release",
    category: "Cloud",
    tags: ["Errors and Exceptions"]
  }, {
    id: "performance-optimization/insert-select-settings-tuning",
    title: "How do I solve TOO MANY PARTS error during an INSERT...SELECT?",
    description: "Resolve the TOO_MANY_PARTS error in ClickHouse during an `INSERT...SELECT` by tuning expert-level settings for larger blocks and increasing partition thresholds.",
    href: "/resources/support-center/knowledge-base/performance-optimization/insert-select-settings-tuning",
    category: "Performance & optimization",
    tags: ["Settings", "Errors and Exceptions"]
  }, {
    id: "integrations/node-js-example",
    title: "How do I use NodeJS with @clickhouse/client",
    description: "Learn how to use @clickhouse/client in a Node.js application to interact with ClickHouse and perform queries.",
    href: "/resources/support-center/knowledge-base/integrations/node-js-example",
    category: "Integrations & client libraries",
    tags: ["Language Clients"]
  }, {
    id: "monitoring-debugging/view-number-of-active-mutations",
    title: "How do I view the number of active or queued mutations?",
    description: "Monitor the number of active or queued mutations in ClickHouse, especially when performing `ALTER` or `UPDATE` operations. Use the `system.mutations` table for tracking mutations.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/view-number-of-active-mutations",
    category: "Monitoring & debugging",
    tags: ["System Tables"]
  }, {
    id: "data-management/read-consistency",
    title: "How to achieve data read consistency in ClickHouse?",
    description: "Learn how to ensure data consistency when reading from ClickHouse, whether you're connected to the same node or a random node.",
    href: "/resources/support-center/knowledge-base/data-management/read-consistency",
    category: "Data management",
    tags: ["Performance and Optimizations"]
  }, {
    id: "setup-installation/llvm-clang-up-to-date",
    title: "How to build LLVM and clang on Linux",
    description: "Commands to build LLVM and clang on Linux.",
    href: "/resources/support-center/knowledge-base/setup-installation/llvm-clang-up-to-date",
    category: "Setup & installation",
    tags: ["Community", "Tools and Utilities"]
  }, {
    id: "data-management/calculate-ratio-of-zero-sparse-serialization",
    title: "How to calculate the ratio of empty/zero values in every column in a table",
    description: "Learn how to calculate the ratio of empty or zero values in every column of a ClickHouse table to optimize sparse column serialization.",
    href: "/resources/support-center/knowledge-base/data-management/calculate-ratio-of-zero-sparse-serialization",
    category: "Data management",
    tags: ["Performance and Optimizations"]
  }, {
    id: "security/check-users-roles",
    title: "How to Check Users Assigned to Roles and Vice Versa",
    description: "Learn how to query ClickHouse's `system.role_grants` to find users assigned to roles and roles assigned to specific users.",
    href: "/resources/support-center/knowledge-base/security/check-users-roles",
    category: "Security & access control",
    tags: ["Server Admin", "System Tables", "Managing Cloud"]
  }, {
    id: "monitoring-debugging/which-processes-are-currently-running",
    title: "How to check what code is currently running on a server?",
    description: "ClickHouse provides introspection tools like `system.stack_trace` for inspecting what code is currently running on each server thread, helping with debugging and performance monitoring.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/which-processes-are-currently-running",
    category: "Monitoring & debugging",
    tags: ["Server Admin"]
  }, {
    id: "cloud-services/how-to-check-my-clickhouse-cloud-sevice-state",
    title: "Comment vérifier l'état de votre service ClickHouse Cloud",
    description: "Learn how to use the ClickHouse Cloud API to check if your service is stopped, idle, or running without waking it up.",
    href: "/resources/support-center/knowledge-base/cloud-services/how-to-check-my-clickhouse-cloud-sevice-state",
    category: "Cloud",
    tags: ["Managing Cloud"]
  }, {
    id: "configuration-settings/configure-a-user-setting",
    title: "Comment configurer les paramètres d'un utilisateur dans ClickHouse",
    description: "Learn how to define settings in ClickHouse for individual queries, client sessions, or specific users using `SET` and `ALTER USER` commands.",
    href: "/resources/support-center/knowledge-base/configuration-settings/configure-a-user-setting",
    category: "Configuration & settings",
    tags: ["Settings"]
  }, {
    id: "materialized-views/projection-example",
    title: "How to confirm if a Projection is used by the query?",
    description: "Learn how to check if a projection is used in ClickHouse queries by testing with sample data and using EXPLAIN to verify projection usage.",
    href: "/resources/support-center/knowledge-base/materialized-views/projection-example",
    category: "Materialized views & projections",
    tags: ["Data Modelling"]
  }, {
    id: "cloud-services/how-to-connect-to-ch-cloud-using-ssh-keys",
    title: "Comment se connecter à ClickHouse avec des clés SSH",
    description: "How to connect to ClickHouse and ClickHouse Cloud using SSH Keys",
    href: "/resources/support-center/knowledge-base/cloud-services/how-to-connect-to-ch-cloud-using-ssh-keys",
    category: "Cloud",
    tags: ["Managing Cloud", "Security and Authentication"]
  }, {
    id: "data-management/dictionary-using-strings",
    title: "How to Create a ClickHouse Dictionary with String Keys and Values",
    description: "Learn how to create a ClickHouse dictionary using string keys and values from a MergeTree table as the source, with examples of setup and usage.",
    href: "/resources/support-center/knowledge-base/data-management/dictionary-using-strings",
    category: "Data management",
    tags: ["Data Modelling"]
  }, {
    id: "tables-schema/how-to-create-table-to-query-multiple-remote-clusters",
    title: "How to create a table that can query multiple remote clusters",
    description: "How to create a table that can query multiple remote clusters",
    href: "/resources/support-center/knowledge-base/tables-schema/how-to-create-table-to-query-multiple-remote-clusters",
    category: "Tables & schema",
    tags: ["Deployments and Scaling"]
  }, {
    id: "setup-installation/enabling-ssl-with-lets-encrypt",
    title: "How to enable SSL with Let's Encrypt on a single ClickHouse server",
    description: "Learn how to set up SSL for a single ClickHouse server using Let's Encrypt, including certificate issuance, configuration, and validation.",
    href: "/resources/support-center/knowledge-base/setup-installation/enabling-ssl-with-lets-encrypt",
    category: "Setup & installation",
    tags: ["Security and Authentication"]
  }, {
    id: "data-import-export/file-export",
    title: "How to export data from ClickHouse to a file",
    description: "Learn various methods to export data from ClickHouse, including `INTO OUTFILE`, the File table engine, and command-line redirection.",
    href: "/resources/support-center/knowledge-base/data-import-export/file-export",
    category: "Data import & export",
    tags: ["Data Export"]
  }, {
    id: "queries-sql/how-to-filter-a-clickhouse-table-by-an-array-column",
    title: "How to filter a ClickHouse table by an array-column?",
    description: "Knowledgebase article on how to filter a ClickHouse table by an array-column.",
    href: "/resources/support-center/knowledge-base/queries-sql/how-to-filter-a-clickhouse-table-by-an-array-column",
    category: "Queries & SQL",
    tags: ["Data Modelling", "Functions"]
  }, {
    id: "monitoring-debugging/generate-har-file",
    title: "How to generate a HAR file for support",
    description: "A HAR (HTTP Archive) file captures the network activity in your browser. It can help our support team diagnose slow page loads, failed requests, or other network issues.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/generate-har-file",
    category: "Monitoring & debugging",
    tags: ["Tools and Utilities"]
  }, {
    id: "materialized-views/how-to-display-queries-using-mv",
    title: "How to Identify Queries Using Materialized Views in ClickHouse",
    description: "Learn how to query ClickHouse logs to identify all queries involving Materialized Views within a specified time range.",
    href: "/resources/support-center/knowledge-base/materialized-views/how-to-display-queries-using-mv",
    category: "Materialized views & projections",
    tags: ["System Tables"]
  }, {
    id: "performance-optimization/find-expensive-queries",
    title: "How to identify the most expensive queries in ClickHouse",
    description: "Learn how to use the `query_log` table in ClickHouse to identify the most memory and CPU-intensive queries across distributed nodes.",
    href: "/resources/support-center/knowledge-base/performance-optimization/find-expensive-queries",
    category: "Performance & optimization",
    tags: ["Performance and Optimizations"]
  }, {
    id: "configuration-settings/ignoring-incorrect-settings",
    title: "How to ignore incorrect settings in ClickHouse",
    description: "Learn how to use the `skip_check_for_incorrect_settings` option to allow ClickHouse to start even when user-level settings are specified incorrectly.",
    href: "/resources/support-center/knowledge-base/configuration-settings/ignoring-incorrect-settings",
    category: "Configuration & settings",
    tags: ["Settings"]
  }, {
    id: "data-import-export/json-import",
    title: "How to import JSON into ClickHouse?",
    description: "This page shows you how to import JSON into ClickHouse",
    href: "/resources/support-center/knowledge-base/data-import-export/json-import",
    category: "Data import & export",
    tags: []
  }, {
    id: "setup-installation/how-to-increase-thread-pool-size",
    title: "How to increase the number of threads in ClickHouse",
    description: "Learn how to configure the Global Thread pool in ClickHouse by adjusting settings like `max_thread_pool_size`, `thread_pool_queue_size`, and `max_thread_pool_free_size`.",
    href: "/resources/support-center/knowledge-base/setup-installation/how-to-increase-thread-pool-size",
    category: "Setup & installation",
    tags: ["Performance and Optimizations"]
  }, {
    id: "data-import-export/kafka-to-clickhouse-setup",
    title: "How to ingest data from Kafka into ClickHouse",
    description: "Learn how to ingest data from a Kafka topic into ClickHouse using the Kafka table engine, materialized views, and MergeTree tables.",
    href: "/resources/support-center/knowledge-base/data-import-export/kafka-to-clickhouse-setup",
    category: "Data import & export",
    tags: ["Data Ingestion"]
  }, {
    id: "data-import-export/ingest-parquet-files-in-s3",
    title: "How to ingest Parquet files from an S3 bucket",
    description: "Learn the basics of using the S3 table engine in ClickHouse to ingest and query Parquet files from an S3 bucket, including setup, access permissions, and data import examples.",
    href: "/resources/support-center/knowledge-base/data-import-export/ingest-parquet-files-in-s3",
    category: "Data import & export",
    tags: ["Data Ingestion"]
  }, {
    id: "queries-sql/how-to-insert-all-rows-from-another-table",
    title: "How to insert all rows from one table to another?",
    description: "Knowledgebase article on how to insert all rows from one table to another.",
    href: "/resources/support-center/knowledge-base/queries-sql/how-to-insert-all-rows-from-another-table",
    category: "Queries & SQL",
    tags: ["Data Ingestion"]
  }, {
    id: "performance-optimization/check-query-processing-time-only",
    title: "How to Measure Query Processing Time Without Returning Rows",
    description: "Learn how to use the `FORMAT Null` option in ClickHouse to measure query processing time without returning any rows to the client.",
    href: "/resources/support-center/knowledge-base/performance-optimization/check-query-processing-time-only",
    category: "Performance & optimization",
    tags: ["Performance and Optimizations"]
  }, {
    id: "monitoring-debugging/outputSendLogsLevelTracesToFile",
    title: "How to output send logs level traces to file using the clickhouse-client",
    description: "How to output send logs level traces to file using the clickhouse-client",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/outputSendLogsLevelTracesToFile",
    category: "Monitoring & debugging",
    tags: ["Data Export"]
  }, {
    id: "tables-schema/recreate-table-across-terminals",
    title: "How to quickly recreate a small table across different terminals",
    description: "Learn how to quickly recreate a small table and its data across different terminals using copy/paste for development environments.",
    href: "/resources/support-center/knowledge-base/tables-schema/recreate-table-across-terminals",
    category: "Tables & schema",
    tags: ["Tools and Utilities"]
  }, {
    id: "integrations/how-to-set-up-ch-on-docker-odbc-connect-mssql",
    title: "How to set up ClickHouse on Docker with ODBC to connect to a Microsoft SQL Server (MSSQL) database",
    description: "How to set up ClickHouse on Docker with ODBC to connect to a Microsoft SQL Server (MSSQL) database",
    href: "/resources/support-center/knowledge-base/integrations/how-to-set-up-ch-on-docker-odbc-connect-mssql",
    category: "Integrations & client libraries",
    tags: ["Native Clients and Interfaces"]
  }, {
    id: "queries-sql/using-array-join-to-extract-and-query-attributes",
    title: "How to use array join to extract and query varying attributes using map keys and values",
    description: "Exemple simple illustrant comment utiliser array join pour extraire et interroger des attributs variables à l'aide de clés et de valeurs de map",
    href: "/resources/support-center/knowledge-base/queries-sql/using-array-join-to-extract-and-query-attributes",
    category: "Queries & SQL",
    tags: ["Functions"]
  }, {
    id: "materialized-views/how-to-use-parametrised-views",
    title: "Comment utiliser les vues paramétrées dans ClickHouse",
    description: "Apprenez à créer et à interroger des vues paramétrées dans ClickHouse pour le découpage dynamique des données basé sur des paramètres au moment de la requête.",
    href: "/resources/support-center/knowledge-base/materialized-views/how-to-use-parametrised-views",
    category: "Materialized views & projections",
    tags: ["Use Cases"]
  }, {
    id: "tables-schema/exchangeStatementToSwitchTables",
    title: "Comment utiliser la commande exchange pour permuter des tables",
    description: "Comment utiliser la commande exchange pour permuter des tables",
    href: "/resources/support-center/knowledge-base/tables-schema/exchangeStatementToSwitchTables",
    category: "Tables & schema",
    tags: ["Managing Data"]
  }, {
    id: "queries-sql/compare-resultsets",
    title: "Comment valider si deux requêtes retournent les mêmes ensembles de résultats",
    description: "Apprenez à valider que deux requêtes ClickHouse produisent des ensembles de résultats identiques à l'aide de fonctions de hachage et de techniques de comparaison.",
    href: "/resources/support-center/knowledge-base/queries-sql/compare-resultsets",
    category: "Queries & SQL",
    tags: ["Functions"]
  }, {
    id: "monitoring-debugging/check-query-cache-in-use",
    title: "Comment vérifier l'utilisation du cache de requêtes dans ClickHouse",
    description: "Apprenez à vérifier si le cache de requêtes est utilisé dans ClickHouse à l'aide des journaux de trace `clickhouse-client` ou de commandes SQL.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/check-query-cache-in-use",
    category: "Monitoring & debugging",
    tags: ["Performance and Optimizations"]
  }, {
    id: "cloud-services/unable-to-access-cloud-service",
    title: "Je n'arrive pas à accéder à un service ClickHouse Cloud",
    description: "Résolution des problèmes d'accès aux services ClickHouse Cloud, y compris la configuration de la liste d'accès IP",
    href: "/resources/support-center/knowledge-base/cloud-services/unable-to-access-cloud-service",
    category: "Cloud",
    tags: ["Errors and Exceptions", "Managing Cloud"]
  }, {
    id: "performance-optimization/finding-expensive-queries-by-memory-usage",
    title: "Identification des requêtes coûteuses par utilisation de la mémoire dans ClickHouse",
    description: "Apprenez à utiliser la table `system.query_log` pour trouver les requêtes les plus gourmandes en mémoire dans ClickHouse, avec des exemples pour les configurations en cluster et autonomes.",
    href: "/resources/support-center/knowledge-base/performance-optimization/finding-expensive-queries-by-memory-usage",
    category: "Performance & optimization",
    tags: ["Performance and Optimizations"]
  }, {
    id: "data-import-export/importing-and-working-with-json-array-objects",
    title: "Importation et interrogation d'objets de tableau JSON dans ClickHouse",
    description: "Apprenez à importer des objets de tableau JSON dans ClickHouse et à effectuer des requêtes avancées à l'aide de fonctions JSON et d'opérations sur les tableaux.",
    href: "/resources/support-center/knowledge-base/data-import-export/importing-and-working-with-json-array-objects",
    category: "Data import & export",
    tags: ["Data Formats"]
  }, {
    id: "data-import-export/importing-geojason-with-nested-object-array",
    title: "Importation de GeoJSON avec un tableau d'objets profondément imbriqué",
    description: "Apprenez à importer des fichiers GeoJSON avec des tableaux d'objets profondément imbriqués dans ClickHouse et à interroger les données de fonctionnalités imbriquées.",
    href: "/resources/support-center/knowledge-base/data-import-export/importing-geojason-with-nested-object-array",
    category: "Data import & export",
    tags: ["Data Formats"]
  }, {
    id: "performance-optimization/improve-map-performance",
    title: "Amélioration des performances de recherche dans les colonnes Map dans ClickHouse",
    description: "Apprenez à optimiser les recherches dans les colonnes Map dans ClickHouse pour de meilleures performances de requête en matérialisant des clés spécifiques en colonnes autonomes.",
    href: "/resources/support-center/knowledge-base/performance-optimization/improve-map-performance",
    category: "Performance & optimization",
    tags: ["Performance and Optimizations"]
  }, {
    id: "tables-schema/delete-old-data",
    title: "Est-il possible de supprimer d'anciens enregistrements d'une table ClickHouse ?",
    description: "Cette page répond à la question de savoir s'il est possible de supprimer d'anciens enregistrements d'une table ClickHouse",
    href: "/resources/support-center/knowledge-base/tables-schema/delete-old-data",
    category: "Tables & schema",
    tags: []
  }, {
    id: "general-faqs/separate-storage",
    title: "Est-il possible de déployer ClickHouse avec un stockage et un calcul séparés ?",
    description: "Cette page fournit une réponse à la question de savoir s'il est possible de déployer ClickHouse avec un stockage et un calcul séparés",
    href: "/resources/support-center/knowledge-base/general-faqs/separate-storage",
    category: "General & FAQs",
    tags: []
  }, {
    id: "data-import-export/json-extract-example",
    title: "Exemple d'extraction JSON",
    description: "Un court exemple sur la façon d'extraire des types de base à partir de JSON",
    href: "/resources/support-center/knowledge-base/data-import-export/json-extract-example",
    category: "Data import & export",
    tags: ["Data Formats"]
  }, {
    id: "queries-sql/calculate-pi-using-sql",
    title: "Calculons pi avec SQL",
    description: "C'est le jour de Pi ! Calculons pi avec ClickHouse SQL",
    href: "/resources/support-center/knowledge-base/queries-sql/calculate-pi-using-sql",
    category: "Queries & SQL",
    tags: ["Use Cases"]
  }, {
    id: "cloud-services/clickhouse-cloud-api-usage",
    title: "Gestion du service ClickHouse Cloud avec l'API et cURL",
    description: "Apprenez à démarrer, arrêter et reprendre un service ClickHouse Cloud à l'aide des points de terminaison API et des commandes cURL.",
    href: "/resources/support-center/knowledge-base/cloud-services/clickhouse-cloud-api-usage",
    category: "Cloud",
    tags: ["Managing Cloud", "Tools and Utilities"]
  }, {
    id: "monitoring-debugging/mapping-of-system-metrics-to-prometheus-metrics",
    title: "Correspondance des métriques utilisées dans system.dashboards avec les métriques Prometheus dans `system.custom_metrics`",
    description: "Correspondance des métriques utilisées dans system.dashboards avec les métriques Prometheus dans system.custom_metrics",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/mapping-of-system-metrics-to-prometheus-metrics",
    category: "Monitoring & debugging",
    tags: ["System Tables"]
  }, {
    id: "security/windows-active-directory-to-ch-roles",
    title: "Correspondance des groupes de sécurité Windows Active Directory avec les rôles ClickHouse",
    description: "Exemple de correspondance des groupes de sécurité Windows Active Directory avec les rôles ClickHouse",
    href: "/resources/support-center/knowledge-base/security/windows-active-directory-to-ch-roles",
    category: "Security & access control",
    tags: ["Tools and Utilities"]
  }, {
    id: "performance-optimization/memory-limit-exceeded-for-query",
    title: "Limite de mémoire dépassée pour la requête",
    description: "Résolution des erreurs de dépassement de limite de mémoire pour une requête",
    href: "/resources/support-center/knowledge-base/performance-optimization/memory-limit-exceeded-for-query",
    category: "Performance & optimization",
    tags: ["Errors and Exceptions"]
  }, {
    id: "integrations/ODBC-authentication-failed-error-using-PowerBI-CH-connector",
    title: "Erreur d'échec d'authentification ODBC lors de l'utilisation du connecteur Power BI ClickHouse",
    description: "Erreur d'échec d'authentification ODBC lors de l'utilisation du connecteur Power BI ClickHouse",
    href: "/resources/support-center/knowledge-base/integrations/ODBC-authentication-failed-error-using-PowerBI-CH-connector",
    category: "Integrations & client libraries",
    tags: ["Native Clients and Interfaces", "Errors and Exceptions"]
  }, {
    id: "monitoring-debugging/profiling-clickhouse-with-llvm-xray",
    title: "Profilage de ClickHouse avec XRay de LLVM",
    description: "Apprenez à profiler ClickHouse à l'aide du profileur d'instrumentation XRay de LLVM, à visualiser les traces et à analyser les performances.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/profiling-clickhouse-with-llvm-xray",
    category: "Monitoring & debugging",
    tags: ["Performance and Optimizations", "Tools and Utilities"]
  }, {
    id: "integrations/python-http-requests",
    title: "Exemple rapide en Python avec le module requests",
    description: "Un exemple utilisant Python et le module requests pour écrire dans ClickHouse et lire des données",
    href: "/resources/support-center/knowledge-base/integrations/python-http-requests",
    category: "Integrations & client libraries",
    tags: ["Native Clients and Interfaces"]
  }, {
    id: "configuration-settings/maximum-number-of-tables-and-databases",
    title: "Recommended Maximum Databases, Tables, Partitions, and Parts in ClickHouse",
    description: "Learn the recommended maximum limits for databases, tables, partitions, and parts in a ClickHouse cluster to ensure optimal performance.",
    href: "/resources/support-center/knowledge-base/configuration-settings/maximum-number-of-tables-and-databases",
    category: "Configuration & settings",
    tags: ["Performance and Optimizations", "Deployments and Scaling"]
  }, {
    id: "data-import-export/cannot-append-data-to-parquet-format",
    title: 'Résolution de l\'erreur « Cannot Append Data in Parquet Format » dans ClickHouse',
    description: 'Vous obtenez l\'erreur « Cannot append data in format Parquet to file » dans ClickHouse ? Voyons comment la résoudre.',
    href: "/resources/support-center/knowledge-base/data-import-export/cannot-append-data-to-parquet-format",
    category: "Data import & export",
    tags: ["Errors and Exceptions", "Data Formats"]
  }, {
    id: "troubleshooting/exception-too-many-parts",
    title: 'Résolution de l\'erreur « Too Many Parts » dans ClickHouse',
    description: 'Apprenez à résoudre l\'erreur « Too many parts » dans ClickHouse en optimisant les taux d\'insertion, en configurant les paramètres MergeTree et en gérant efficacement les partitions.',
    href: "/resources/support-center/knowledge-base/troubleshooting/exception-too-many-parts",
    category: "Troubleshooting & errors",
    tags: ["Errors and Exceptions"]
  }, {
    id: "troubleshooting/certificate-verify-failed-error",
    title: "Résolution de l'erreur de vérification du certificat SSL dans ClickHouse",
    description: "Découvrez comment résoudre l'erreur SSL Exception CERTIFICATE_VERIFY_FAILED.",
    href: "/resources/support-center/knowledge-base/troubleshooting/certificate-verify-failed-error",
    category: "Troubleshooting & errors",
    tags: ["Security and Authentication", "Errors and Exceptions"]
  }, {
    id: "troubleshooting/connection-timeout-remote-remoteSecure",
    title: "Résolution des erreurs de délai d'attente avec les fonctions de table `remote` et `remoteSecure`",
    description: "Apprenez à corriger les erreurs de délai d'attente lors de l'utilisation des fonctions de table `remote` ou `remoteSecure` dans ClickHouse en ajustant les paramètres de délai d'attente de connexion.",
    href: "/resources/support-center/knowledge-base/troubleshooting/connection-timeout-remote-remoteSecure",
    category: "Troubleshooting & errors",
    tags: ["Errors and Exceptions"]
  }, {
    id: "tables-schema/search-across-node-for-tables-with-a-wildcard",
    title: "Recherche de tables sur plusieurs nœuds avec un caractère générique",
    description: "Apprenez à rechercher des tables sur plusieurs nœuds avec un caractère générique.",
    href: "/resources/support-center/knowledge-base/tables-schema/search-across-node-for-tables-with-a-wildcard",
    category: "Tables & schema",
    tags: ["Deployments and Scaling"]
  }, {
    id: "performance-optimization/query-max-execution-time",
    title: "Définir une limite de temps d'exécution des requêtes",
    description: "Comment imposer une limite au temps d'exécution maximal des requêtes",
    href: "/resources/support-center/knowledge-base/performance-optimization/query-max-execution-time",
    category: "Performance & optimization",
    tags: ["Managing Cloud", "Settings"]
  }, {
    id: "data-import-export/json-simple-example",
    title: "Exemple simple de workflow pour extraire des données JSON à l'aide d'une table d'atterrissage avec une vue matérialisée",
    description: "Exemple simple de workflow pour extraire des données JSON à l'aide d'une table d'atterrissage avec une vue matérialisée",
    href: "/resources/support-center/knowledge-base/data-import-export/json-simple-example",
    category: "Data import & export",
    tags: ["Data Formats"]
  }, {
    id: "performance-optimization/async-vs-optimize-read-in-order",
    title: "Lecture synchrone des données",
    description: "Le nouveau paramètre `allow_asynchronous_read_from_io_pool_for_merge_tree` permet au nombre de threads de lecture (flux) d'être supérieur à celui des threads dans le reste du pipeline d'exécution de la requête.",
    href: "/resources/support-center/knowledge-base/performance-optimization/async-vs-optimize-read-in-order",
    category: "Performance & optimization",
    tags: ["Settings", "Performance and Optimizations"]
  }, {
    id: "integrations/terraform-example",
    title: "Exemple Terraform montrant comment utiliser l'API Cloud",
    description: "Cet exemple montre comment utiliser Terraform pour créer et supprimer des clusters à l'aide de l'API",
    href: "/resources/support-center/knowledge-base/integrations/terraform-example",
    category: "Integrations & client libraries",
    tags: ["Native Clients and Interfaces"]
  }, {
    id: "performance-optimization/tips-tricks-optimizing-basic-data-types-in-clickhouse",
    title: "Conseils et astuces pour optimiser les types de données de base dans ClickHouse",
    description: "Conseils et astuces pour optimiser les types de données de base dans ClickHouse",
    href: "/resources/support-center/knowledge-base/performance-optimization/tips-tricks-optimizing-basic-data-types-in-clickhouse",
    category: "Performance & optimization",
    tags: ["Performance and Optimizations"]
  }, {
    id: "queries-sql/useful-queries-for-troubleshooting",
    title: "Requêtes utiles pour le dépannage",
    description: "Une collection de requêtes pratiques pour dépanner ClickHouse, notamment pour surveiller la taille des tables, les requêtes longues et les erreurs.",
    href: "/resources/support-center/knowledge-base/queries-sql/useful-queries-for-troubleshooting",
    category: "Queries & SQL",
    tags: ["Settings"]
  }, {
    id: "general-faqs/use-clickhouse-for-log-analytics",
    title: "Utiliser ClickHouse pour l'analyse de logs",
    description: "ClickHouse est populaire pour l'analyse des logs et des métriques grâce à ses capacités d'analyse en temps réel. Envie d'en savoir plus ?",
    href: "/resources/support-center/knowledge-base/general-faqs/use-clickhouse-for-log-analytics",
    category: "General & FAQs",
    tags: ["Use Cases"]
  }, {
    id: "queries-sql/filtered-aggregates",
    title: "Utiliser les agrégats filtrés dans ClickHouse",
    description: "Apprenez à utiliser les agrégats filtrés dans ClickHouse avec les combinateurs d'agrégats `-If` et `-Distinct` pour simplifier la syntaxe des requêtes et améliorer l'analyse.",
    href: "/resources/support-center/knowledge-base/queries-sql/filtered-aggregates",
    category: "Queries & SQL",
    tags: ["Functions"]
  }, {
    id: "general-faqs/dependencies",
    title: "Quelles sont les dépendances tierces nécessaires pour exécuter ClickHouse ?",
    description: "ClickHouse est autonome et n'a aucune dépendance à l'exécution",
    href: "/resources/support-center/knowledge-base/general-faqs/dependencies",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/dbms-naming",
    title: 'Que signifie « ClickHouse » ?',
    description: 'Découvrez ce que signifie « ClickHouse »',
    href: "/resources/support-center/knowledge-base/general-faqs/dbms-naming",
    category: "General & FAQs",
    tags: []
  }, {
    id: "general-faqs/ne-tormozit",
    title: "Que signifie « не тормозит » ?",
    description: 'Cette page explique ce que signifie « Не тормозит »',
    href: "/resources/support-center/knowledge-base/general-faqs/ne-tormozit",
    category: "General & FAQs",
    tags: []
  }, {
    id: "integrations/oracle-odbc",
    title: "Que faire si j'ai un problème d'encodage lors de l'utilisation d'Oracle via ODBC ?",
    description: "Cette page explique quoi faire si vous rencontrez un problème d'encodage lors de l'utilisation d'Oracle via ODBC",
    href: "/resources/support-center/knowledge-base/integrations/oracle-odbc",
    category: "Integrations & client libraries",
    tags: []
  }, {
    id: "general-faqs/columnar-database",
    title: "Qu'est-ce qu'une base de données en colonnes ?",
    description: "Une base de données en colonnes stocke les données de chaque colonne de manière indépendante. Cela permet de lire depuis le disque uniquement les colonnes utilisées dans une requête donnée.",
    href: "/resources/support-center/knowledge-base/general-faqs/columnar-database",
    category: "General & FAQs",
    tags: ["Core Data Concepts"]
  }, {
    id: "general-faqs/olap",
    title: "What is OLAP?",
    description: "An explainer on what Online Analytical Processing is",
    href: "/resources/support-center/knowledge-base/general-faqs/olap",
    category: "General & FAQs",
    tags: []
  }, {
    id: "performance-optimization/optimize-final-vs-final",
    title: "What is the difference between OPTIMIZE FINAL and FINAL?",
    description: "Discusses the differences between OPTIMIZE FINAL and FINAL, and when to use and avoid them.",
    href: "/resources/support-center/knowledge-base/performance-optimization/optimize-final-vs-final",
    category: "Performance & optimization",
    tags: ["Core Data Concepts"]
  }, {
    id: "general-faqs/sql",
    title: "What SQL syntax does ClickHouse support?",
    description: "ClickHouse supports 100% of SQL syntax",
    href: "/resources/support-center/knowledge-base/general-faqs/sql",
    category: "General & FAQs",
    tags: []
  }, {
    id: "data-management/when-is-ttl-applied",
    title: "When are TTL rules applied, and do we have control over it?",
    description: "TTL rules in ClickHouse are eventually applied, and you can control when they are executed using the `merge_with_ttl_timeout` setting. Learn how to force TTL application and manage background threads for TTL execution.",
    href: "/resources/support-center/knowledge-base/data-management/when-is-ttl-applied",
    category: "Data management",
    tags: ["Core Data Concepts"]
  }, {
    id: "setup-installation/production",
    title: "Which ClickHouse version to use in production?",
    description: "This page provides guidance on which ClickHouse version to use in production",
    href: "/resources/support-center/knowledge-base/setup-installation/production",
    category: "Setup & installation",
    tags: []
  }, {
    id: "general-faqs/who-is-using-clickhouse",
    title: "Who is using ClickHouse?",
    description: "Describes who is using ClickHouse",
    href: "/resources/support-center/knowledge-base/general-faqs/who-is-using-clickhouse",
    category: "General & FAQs",
    tags: []
  }, {
    id: "data-management/dictionaries-consistent-state",
    title: "Why can't I see my data in a dictionary in ClickHouse Cloud?",
    description: "There is an issue where data in dictionaries may not be visible immediately after creation.",
    href: "/resources/support-center/knowledge-base/data-management/dictionaries-consistent-state",
    category: "Data management",
    tags: ["Managing Cloud", "Data Modelling"]
  }, {
    id: "general-faqs/why-recommend-clickhouse-keeper-over-zookeeper",
    title: "Why is ClickHouse Keeper recommended over ZooKeeper?",
    description: "ClickHouse Keeper improves upon ZooKeeper with features like reduced disk space usage, faster recovery, and less memory consumption, offering better performance for ClickHouse clusters.",
    href: "/resources/support-center/knowledge-base/general-faqs/why-recommend-clickhouse-keeper-over-zookeeper",
    category: "General & FAQs",
    tags: ["Core Data Concepts"]
  }, {
    id: "monitoring-debugging/why-default-logging-verbose",
    title: "Why is ClickHouse logging so verbose by default?",
    description: "Learn why the ClickHouse developers chose to set a verbose logging level by default.",
    href: "/resources/support-center/knowledge-base/monitoring-debugging/why-default-logging-verbose",
    category: "Monitoring & debugging",
    tags: ["Settings"]
  }, {
    id: "performance-optimization/why-is-my-primary-key-not-used",
    title: "Why is my primary key not used? How can I check?",
    description: "Covers a common reason why a primary key is not used in ordering and how we can confirm",
    href: "/resources/support-center/knowledge-base/performance-optimization/why-is-my-primary-key-not-used",
    category: "Performance & optimization",
    tags: ["Performance and Optimizations"]
  }, {
    id: "general-faqs/mapreduce",
    title: "Why not use something like MapReduce?",
    description: "This page explains why you would use ClickHouse over MapReduce",
    href: "/resources/support-center/knowledge-base/general-faqs/mapreduce",
    category: "General & FAQs",
    tags: []
  }]
};

export const KBExplorer = ({index, featured = []}) => {
  const featuredIds = featured.map(f => f.id);
  const assetBase = typeof window !== "undefined" && window.location.pathname.startsWith("/docs") ? "/docs" : "";
  const withBase = p => p && p.startsWith("/") ? assetBase + p : p;
  const data = index || ({
    categories: [],
    tags: [],
    articles: []
  });
  const readStoredList = (key, fallback) => {
    if (typeof window === "undefined") return fallback;
    try {
      const raw = localStorage.getItem(key);
      if (!raw) return fallback;
      const parsed = JSON.parse(raw);
      return Array.isArray(parsed) ? parsed : fallback;
    } catch {
      return fallback;
    }
  };
  const [searchTerm, setSearchTerm] = useState(() => {
    if (typeof window !== "undefined") {
      return localStorage.getItem("kb-search") || "";
    }
    return "";
  });
  const [selectedCategories, setSelectedCategories] = useState(() => readStoredList("kb-categories", ["All"]));
  const [currentPage, setCurrentPage] = useState(1);
  const itemsPerPage = 6;
  const [categoriesDropdownOpen, setCategoriesDropdownOpen] = useState(true);
  const [showFilters, setShowFilters] = useState(() => {
    if (typeof window !== "undefined") {
      return localStorage.getItem("kb-show-filters") !== "false";
    }
    return true;
  });
  const [isDesktop, setIsDesktop] = useState(true);
  useEffect(() => {
    if (typeof window === "undefined" || !window.matchMedia) return;
    const mq = window.matchMedia("(min-width: 1024px)");
    const update = () => setIsDesktop(mq.matches);
    update();
    mq.addEventListener("change", update);
    return () => mq.removeEventListener("change", update);
  }, []);
  useEffect(() => {
    if (typeof window !== "undefined") localStorage.setItem("kb-search", searchTerm);
  }, [searchTerm]);
  useEffect(() => {
    if (typeof window !== "undefined") localStorage.setItem("kb-categories", JSON.stringify(selectedCategories));
  }, [selectedCategories]);
  useEffect(() => {
    if (typeof window !== "undefined") localStorage.setItem("kb-show-filters", String(showFilters));
  }, [showFilters]);
  useEffect(() => {
    setCurrentPage(1);
  }, [searchTerm, selectedCategories]);
  const makeToggle = setter => value => {
    setter(prev => {
      if (value === "All") return ["All"];
      const withoutAll = prev.filter(v => v !== "All");
      const result = withoutAll.includes(value) ? withoutAll.filter(v => v !== value) : [...withoutAll, value];
      return result.length === 0 ? ["All"] : result;
    });
  };
  const toggleCategory = makeToggle(setSelectedCategories);
  const categoryOptions = ["All", ...data.categories];
  const resetFilters = () => {
    setSearchTerm("");
    setSelectedCategories(["All"]);
  };
  const hasActiveFilters = searchTerm !== "" || !selectedCategories.includes("All");
  const filteredArticles = useMemo(() => {
    const term = searchTerm.toLowerCase();
    return data.articles.filter(article => {
      if (featuredIds.includes(article.id)) return false;
      const matchesSearch = term === "" || article.title.toLowerCase().includes(term) || (article.description || "").toLowerCase().includes(term) || (article.tags || []).some(t => t.toLowerCase().includes(term));
      const matchesCategory = selectedCategories.includes("All") || selectedCategories.includes(article.category);
      return matchesSearch && matchesCategory;
    });
  }, [data.articles, searchTerm, selectedCategories, featuredIds]);
  const handleCardClick = (e, href) => {
    if (e.defaultPrevented) return;
    if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0) return;
    e.preventDefault();
    window.location.assign(withBase(href));
  };
  const featuredArticles = featured.map(f => {
    const article = data.articles.find(a => a.id === f.id);
    return {
      id: f.id,
      href: article && article.href || `/resources/support-center/knowledge-base/${f.id}`,
      title: article && article.title || ""
    };
  }).filter(f => f.title);
  const Expandable = ({label, options, selectedOptions, onToggle, isOpen, setIsOpen}) => {
    const activeCount = selectedOptions.filter(o => o !== "All").length;
    const displayLabel = activeCount > 0 ? `${label} (${activeCount})` : label;
    return <div style={{
      minWidth: "160px"
    }}>
        <button onClick={() => setIsOpen(!isOpen)} className="text-sm font-medium transition-all cursor-pointer flex items-center justify-between w-full text-black dark:text-white" style={{
      padding: "4px 0",
      gap: "8px"
    }}>
          <span className="font-semibold">{displayLabel}</span>
          <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" className={`transition-transform duration-200 ${isOpen ? "rotate-180" : "rotate-0"}`}>
            <path d="M2.5 4.5L6 8L9.5 4.5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
          </svg>
        </button>
        {isOpen && <div className="mt-1">
            {options.map(option => <label key={option} className="flex items-center gap-2 py-1.5 cursor-pointer transition-colors" onClick={e => {
      e.preventDefault();
      onToggle(option);
    }}>
                <span className="flex items-center justify-center w-4 h-4 rounded border flex-shrink-0" style={{
      borderColor: selectedOptions.includes(option) ? "#FAFF69" : "rgba(156, 163, 175, 0.6)",
      backgroundColor: selectedOptions.includes(option) ? "#FAFF69" : "transparent"
    }}>
                  {selectedOptions.includes(option) && <svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
                      <path d="M2 5L4 7L8 3" stroke="black" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
                    </svg>}
                </span>
                <span className="text-sm text-black dark:text-white">{option}</span>
              </label>)}
          </div>}
      </div>;
  };
  return <>
      <div style={{
    maxWidth: "1312px",
    marginLeft: "max(0px, calc((100vw - 1312px) / 2 - 19rem))",
    marginRight: "auto",
    paddingLeft: "1.75rem",
    paddingRight: "1.75rem"
  }}>
        <div className="my-8">
          {}
          {featuredArticles.length > 0 && <div className="mb-12">
              <h2 className="text-2xl font-semibold text-gray-900 dark:text-zinc-50 mb-6">Articles à la une</h2>
              <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
                {featuredArticles.map(article => <a key={article.id} href={article.href} onClick={e => handleCardClick(e, article.href)} className="group block rounded-xl overflow-hidden border border-gray-200 dark:border-white/10 transition-all hover:border-black dark:hover:border-[#FAFF69] hover:shadow-md">
                    {}
                    <div className="relative w-full aspect-[16/9] overflow-hidden bg-[#FAFF69] flex flex-col justify-center px-6 transition-transform duration-200 group-hover:scale-[1.02]">
                      {}
                      <div className="pointer-events-none absolute inset-y-0 right-6 flex items-center gap-2.5" aria-hidden="true">
                        <span className="w-3 rounded-sm bg-[#C4CB54]" style={{
    height: "42%",
    transform: "translateY(-12%)"
  }} />
                        <span className="w-3 rounded-sm bg-[#C4CB54]" style={{
    height: "34%",
    transform: "translateY(18%)"
  }} />
                        <span className="w-3 rounded-sm bg-[#C4CB54]" style={{
    height: "64%",
    transform: "translateY(-14%)"
  }} />
                        <span className="w-3 rounded-sm bg-[#C4CB54]" style={{
    height: "46%",
    transform: "translateY(20%)"
  }} />
                      </div>
                      <span className="relative z-10 pr-24 text-base md:text-lg font-bold leading-snug text-black line-clamp-4">{article.title}</span>
                      {}
                      <svg viewBox="0 0 161 34" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" className="absolute bottom-5 left-6 h-5 w-auto text-black">
                        <rect width="3.77758" height="33.9982" rx="0.918881" fill="currentColor" />
                        <rect x="7.55554" width="3.77758" height="33.9982" rx="0.918881" fill="currentColor" />
                        <rect x="15.1112" width="3.77758" height="33.9982" rx="0.918881" fill="currentColor" />
                        <rect x="22.6649" width="3.77758" height="33.9982" rx="0.918881" fill="currentColor" />
                        <rect x="30.2223" y="13.2227" width="3.77758" height="7.55515" rx="0.918881" fill="currentColor" />
                        <path d="M59.464 25.208C58.472 25.864 57.096 26.192 55.336 26.192C52.92 26.192 50.944 25.44 49.408 23.936C47.872 22.432 47.104 20.416 47.104 17.888C47.104 15.44 47.872 13.448 49.408 11.912C50.96 10.376 52.92 9.608 55.288 9.608C57.016 9.608 58.4 9.904 59.44 10.496V12.92C58.736 12.536 58.096 12.272 57.52 12.128C56.96 11.968 56.24 11.888 55.36 11.888C53.744 11.888 52.392 12.44 51.304 13.544C50.232 14.632 49.696 16.08 49.696 17.888C49.696 19.728 50.232 21.192 51.304 22.28C52.376 23.368 53.792 23.912 55.552 23.912C57.104 23.912 58.408 23.512 59.464 22.712V25.208ZM64.6593 26H62.2833V9.032H64.6593V26ZM70.5421 26H68.1661V13.832H70.5421V26ZM70.8301 10.112C70.8301 10.512 70.6861 10.856 70.3981 11.144C70.1101 11.432 69.7581 11.576 69.3421 11.576C68.9261 11.576 68.5741 11.44 68.2861 11.168C68.0141 10.88 67.8781 10.528 67.8781 10.112C67.8781 9.696 68.0141 9.344 68.2861 9.056C68.5741 8.768 68.9261 8.624 69.3421 8.624C69.7581 8.624 70.1101 8.768 70.3981 9.056C70.6861 9.344 70.8301 9.696 70.8301 10.112ZM82.5449 25.52C81.7609 26 80.7609 26.24 79.5449 26.24C77.6409 26.24 76.1209 25.64 74.9849 24.44C73.8489 23.24 73.2809 21.744 73.2809 19.952C73.2809 18.208 73.8489 16.72 74.9849 15.488C76.1369 14.24 77.6889 13.616 79.6409 13.616C80.6969 13.616 81.6649 13.84 82.5449 14.288V16.448C81.7609 15.952 80.8729 15.704 79.8809 15.704C78.6169 15.704 77.6009 16.104 76.8329 16.904C76.0809 17.704 75.7049 18.728 75.7049 19.976C75.7369 21.208 76.1129 22.224 76.8329 23.024C77.5529 23.808 78.5609 24.2 79.8569 24.2C80.8169 24.2 81.7129 23.936 82.5449 23.408V25.52ZM87.6018 26H85.2498V9.2H87.6018V26ZM90.4098 19.64L95.1858 26H92.3778L87.6978 19.64L92.2818 13.832H95.0418L90.4098 19.64ZM109.562 26H107.09V18.92H99.8178V26H97.3458V9.824H99.8178V16.784H107.09V9.824H109.562V26ZM122.384 15.44C123.392 16.608 123.896 18.104 123.896 19.928C123.896 21.752 123.376 23.256 122.336 24.44C121.312 25.624 119.896 26.216 118.088 26.216C116.296 26.216 114.888 25.632 113.864 24.464C112.84 23.296 112.328 21.816 112.328 20.024C112.328 18.2 112.856 16.688 113.912 15.488C114.968 14.272 116.36 13.664 118.088 13.664C119.944 13.664 121.376 14.256 122.384 15.44ZM114.776 19.952C114.776 21.152 115.072 22.168 115.664 23C116.256 23.816 117.064 24.224 118.088 24.224C119.176 24.224 120 23.824 120.56 23.024C121.136 22.224 121.424 21.208 121.424 19.976C121.424 18.712 121.152 17.68 120.608 16.88C120.064 16.064 119.216 15.656 118.064 15.656C117.024 15.656 116.216 16.072 115.64 16.904C115.064 17.72 114.776 18.736 114.776 19.952ZM136.459 26H134.107V23.912C133.467 25.4 132.203 26.144 130.315 26.144C129.115 26.144 128.163 25.792 127.459 25.088C126.755 24.368 126.403 23.384 126.403 22.136V13.832H128.779V21.56C128.779 22.392 128.979 23.032 129.379 23.48C129.795 23.912 130.363 24.128 131.083 24.128C131.995 24.128 132.723 23.808 133.267 23.168C133.827 22.528 134.107 21.624 134.107 20.456V13.832H136.459V26ZM147.373 22.64C147.373 23.728 146.989 24.584 146.221 25.208C145.453 25.816 144.413 26.12 143.101 26.12C141.661 26.12 140.461 25.88 139.501 25.4V23.168C140.621 23.856 141.781 24.2 142.981 24.2C143.605 24.2 144.085 24.072 144.421 23.816C144.773 23.56 144.949 23.224 144.949 22.808C144.949 22.456 144.813 22.144 144.541 21.872C144.269 21.584 143.989 21.376 143.701 21.248C143.429 21.104 142.957 20.888 142.285 20.6C140.381 19.816 139.429 18.664 139.429 17.144C139.429 16.072 139.829 15.232 140.629 14.624C141.429 14.016 142.429 13.712 143.629 13.712C144.941 13.712 145.965 13.888 146.701 14.24V16.376C145.917 15.912 144.909 15.68 143.677 15.68C143.117 15.68 142.669 15.808 142.333 16.064C142.013 16.32 141.853 16.656 141.853 17.072C141.853 17.184 141.861 17.296 141.877 17.408C141.909 17.504 141.957 17.608 142.021 17.72C142.085 17.816 142.141 17.904 142.189 17.984C142.253 18.048 142.349 18.12 142.477 18.2C142.605 18.28 142.701 18.352 142.765 18.416C142.845 18.464 142.965 18.528 143.125 18.608C143.301 18.688 143.429 18.752 143.509 18.8C143.589 18.832 143.725 18.896 143.917 18.992C144.125 19.072 144.269 19.128 144.349 19.16C145.293 19.576 146.029 20.048 146.557 20.576C147.101 21.088 147.373 21.776 147.373 22.64ZM158.892 25.352C157.996 25.864 156.812 26.12 155.34 26.12C153.452 26.12 151.948 25.552 150.828 24.416C149.708 23.28 149.148 21.792 149.148 19.952C149.148 18 149.66 16.472 150.684 15.368C151.708 14.248 153.012 13.688 154.596 13.688C156.148 13.688 157.38 14.176 158.292 15.152C159.204 16.112 159.66 17.504 159.66 19.328C159.66 19.824 159.612 20.344 159.516 20.888H151.524C151.684 21.944 152.132 22.752 152.868 23.312C153.604 23.872 154.532 24.152 155.652 24.152C156.948 24.152 158.028 23.848 158.892 23.24V25.352ZM154.644 15.632C153.844 15.632 153.156 15.928 152.58 16.52C152.004 17.096 151.644 17.936 151.5 19.04H157.38V18.608C157.348 17.696 157.1 16.976 156.636 16.448C156.172 15.904 155.508 15.632 154.644 15.632Z" fill="currentColor" />
                      </svg>
                    </div>
                  </a>)}
              </div>
            </div>}

          {}
          <div className="flex flex-col lg:flex-row gap-8">
            {}
            <div className={isDesktop ? "flex-shrink-0 transition-[width] duration-300 ease-in-out" : "w-full"} style={isDesktop ? {
    width: showFilters ? "16rem" : "0px"
  } : undefined}>
              <div className="lg:sticky relative" style={isDesktop ? {
    top: "8.5rem"
  } : undefined}>
                {}
                <div aria-hidden="true" className="absolute bg-gray-200 dark:bg-white/10" style={isDesktop ? {
    left: "100%",
    top: 0,
    bottom: 0,
    width: "1px"
  } : {
    top: "100%",
    left: 0,
    right: 0,
    height: "1px"
  }} />
                {}
                <button onClick={() => setShowFilters(prev => !prev)} aria-label={showFilters ? "Masquer les filtres" : "Afficher les filtres"} title={showFilters ? "Masquer les filtres" : "Afficher les filtres"} className="flex items-center justify-center absolute z-20 cursor-pointer rounded-full border transition-colors border-gray-300 dark:border-white/20 hover:border-black dark:hover:border-[#FAFF69] bg-white dark:bg-[#1B1B18] text-gray-500 dark:text-gray-400 hover:text-black dark:hover:text-[#FAFF69] shadow-sm" style={isDesktop ? {
    left: "100%",
    top: "50%",
    width: "28px",
    height: "28px",
    transform: "translate(-50%, -50%)"
  } : {
    top: "100%",
    left: "50%",
    width: "28px",
    height: "28px",
    transform: "translate(-50%, -50%)"
  }}>
                  <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" className="transition-transform duration-300" style={{
    transform: `rotate(${isDesktop ? showFilters ? 0 : 180 : showFilters ? 90 : -90}deg)`
  }}>
                    <path d="M7.5 2.5L4 6L7.5 9.5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
                  </svg>
                </button>

                {}
                <div className="overflow-hidden transition-all duration-300" style={isDesktop ? {
    width: "16rem",
    paddingRight: "1.5rem",
    opacity: showFilters ? 1 : 0,
    pointerEvents: showFilters ? "auto" : "none"
  } : {
    width: "100%",
    maxHeight: showFilters ? "1500px" : "0px",
    paddingBottom: showFilters ? "1.5rem" : "0px",
    opacity: showFilters ? 1 : 0,
    pointerEvents: showFilters ? "auto" : "none"
  }}>
                  <div className="space-y-6">
                    {}
                    <div>
                      <label className="block text-sm font-semibold text-gray-900 dark:text-zinc-50 mb-3">Recherche</label>
                      <div className="relative w-full">
                        <svg className="absolute pointer-events-none z-10" style={{
    left: "12px",
    top: "50%",
    transform: "translateY(-50%)",
    width: "16px",
    height: "16px",
    color: "#666"
  }} fill="none" stroke="currentColor" viewBox="0 0 24 24">
                          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
                        </svg>
                        <input type="text" placeholder="Rechercher des articles..." value={searchTerm} onChange={e => setSearchTerm(e.target.value)} className="w-full text-sm border rounded-xl focus:outline-none bg-white dark:bg-[#1B1B18] text-black dark:text-white border-gray-300 dark:border-gray-600 focus:border-black dark:focus:border-[#FAFF69]" style={{
    height: "42px",
    padding: "0.5rem 0.75rem 0.5rem 2.75rem",
    lineHeight: "1.4",
    boxSizing: "border-box"
  }} />
                      </div>
                    </div>

                    {}
                    <div>
                      <div className="space-y-3">
                        <Expandable label="Catégorie" options={categoryOptions} selectedOptions={selectedCategories} onToggle={toggleCategory} isOpen={categoriesDropdownOpen} setIsOpen={setCategoriesDropdownOpen} />
                      </div>
                    </div>

                    {}
                    {hasActiveFilters && <button onClick={resetFilters} className="w-full text-sm font-medium px-4 py-2 rounded-lg transition-all cursor-pointer border border-gray-300 dark:border-white/20 hover:border-black dark:hover:border-[#FAFF69] bg-white dark:bg-[#1B1B18] text-black dark:text-white">
                        Réinitialiser les filtres
                      </button>}
                  </div>
                </div>
              </div>
            </div>

            {}
            <div className="flex-1 min-w-0">
              <h2 className="text-2xl font-semibold text-gray-900 dark:text-zinc-50 mb-6">Explorer les articles</h2>

              {filteredArticles.length > 0 ? <>
                  <div className="flex flex-col gap-2">
                    {filteredArticles.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage).map(article => <a key={article.id} href={article.href} onClick={e => handleCardClick(e, article.href)} className="group block rounded-lg border px-4 py-3 transition-all border-gray-200 dark:border-white/10 hover:border-black dark:hover:border-[#FAFF69] bg-white dark:bg-[#1B1B18]">
                        <div className="text-sm font-semibold text-gray-900 dark:text-zinc-50">{article.title}</div>
                        <div className="text-sm text-gray-600 dark:text-gray-400 mt-0.5 line-clamp-2">{article.description}</div>
                      </a>)}
                  </div>
                  {}
                  {(() => {
    const totalPages = Math.ceil(filteredArticles.length / itemsPerPage);
    if (totalPages <= 1) return null;
    const hasPrev = currentPage > 1;
    const hasNext = currentPage < totalPages;
    return <div className="flex items-center justify-center gap-3 mt-8">
                        <button onClick={() => hasPrev && setCurrentPage(prev => prev - 1)} disabled={!hasPrev} className={`p-2 rounded-lg border transition-all ${hasPrev ? "border-gray-300 dark:border-white/20 bg-white dark:bg-[#1B1B18] text-black dark:text-white hover:border-[#FAFF69] cursor-pointer" : "border-gray-200 dark:border-white/10 bg-gray-50 dark:bg-[#1B1B18]/50 text-gray-300 dark:text-white/20 cursor-not-allowed"}`} aria-label="Page précédente">
                          <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M10 12L6 8L10 4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
                          </svg>
                        </button>
                        <span className="text-sm text-gray-600 dark:text-gray-400">
                          Page {currentPage} / {totalPages}
                        </span>
                        <button onClick={() => hasNext && setCurrentPage(prev => prev + 1)} disabled={!hasNext} className={`p-2 rounded-lg border transition-all ${hasNext ? "border-gray-300 dark:border-white/20 bg-white dark:bg-[#1B1B18] text-black dark:text-white hover:border-[#FAFF69] cursor-pointer" : "border-gray-200 dark:border-white/10 bg-gray-50 dark:bg-[#1B1B18]/50 text-gray-300 dark:text-white/20 cursor-not-allowed"}`} aria-label="Page suivante">
                          <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M6 4L10 8L6 12" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
                          </svg>
                        </button>
                      </div>;
  })()}
                </> : <div className="text-center py-12 flex flex-col items-center">
                  <p className="text-gray-600 dark:text-gray-400 text-lg block">Aucun article ne correspond à vos critères.</p>
                  <p className="text-gray-500 dark:text-gray-500 text-sm mt-2 block">Essayez d'ajuster vos filtres ou votre terme de recherche.</p>
                </div>}
            </div>
          </div>
        </div>
      </div>
    </>;
};

export const featuredArticles = [{
  id: 'cloud-services/aws-privatelink-setup-for-clickpipes'
}, {
  id: 'tables-schema/schema-migration-tools'
}, {
  id: 'data-management/read-consistency'
}];

<div className="relative overflow-hidden">
  <div className="absolute top-0 left-0 right-0 opacity-80">
    <img src="https://mintcdn.com/private-7c7dfe99-locadex-parallel-t9n-main-irpovz79o3kkpgs4/mWhfPnbxx3iWq0pY/images/background-light.svg?fit=max&auto=format&n=mWhfPnbxx3iWq0pY&q=85&s=78eaf8f45dff21298811b02990f7de7f" className="block dark:hidden pointer-events-none w-full h-auto" alt="Image décorative d’arrière-plan." width="1152" height="388" data-path="images/background-light.svg" />

    <img src="https://mintcdn.com/private-7c7dfe99-locadex-parallel-t9n-main-irpovz79o3kkpgs4/mWhfPnbxx3iWq0pY/images/background-dark.svg?fit=max&auto=format&n=mWhfPnbxx3iWq0pY&q=85&s=b468646dab6fd6d4a6400b53c02135ba" className="hidden dark:block pointer-events-none w-full h-auto" alt="Image décorative d’arrière-plan." width="1152" height="388" data-path="images/background-dark.svg" />
  </div>

  <KBExplorer index={kbIndex} featured={featuredArticles} />
</div>
