En aquest tema, explorarem diverses tècniques i estratègies per optimitzar el rendiment de les cerques a Elasticsearch. A mesura que les dades creixen i les cerques es tornen més complexes, és crucial assegurar-se que el sistema pugui respondre de manera eficient. Aquest mòdul cobreix els següents aspectes:

  1. Estructura de les Dades
  2. Configuració d'Índexs
  3. Optimització de les Consultes
  4. Caché i Memòria
  5. Monitorització i Anàlisi de Rendiment

  1. Estructura de les Dades

1.1. Normalització vs. Desnormalització

  • Normalització: Emmagatzemar dades en múltiples índexs o tipus per reduir la redundància.
  • Desnormalització: Emmagatzemar dades en un sol índex per reduir el nombre de cerques necessàries.

Exemple:

{
  "user": {
    "id": "1",
    "name": "John Doe",
    "posts": [
      {
        "id": "101",
        "title": "First Post",
        "content": "This is my first post."
      },
      {
        "id": "102",
        "title": "Second Post",
        "content": "This is my second post."
      }
    ]
  }
}

Desnormalització: Les dades de l'usuari i les seves publicacions es troben en un sol document.

1.2. Elecció de Tipus de Dades

  • Utilitza tipus de dades adequats per a cada camp (text, keyword, integer, date, etc.).
  • Evita l'ús excessiu de camps de text analitzats si no és necessari.

  1. Configuració d'Índexs

2.1. Configuració de Shards i Replicació

  • Shards: Divideixen les dades en parts més petites per distribuir la càrrega.
  • Replicació: Còpies de seguretat dels shards per a la tolerància a fallades.

Exemple de Configuració:

PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

2.2. Mapeig i Analitzadors

  • Defineix mapejos personalitzats per optimitzar la indexació i la cerca.
  • Utilitza analitzadors adequats per a les necessitats específiques de cerca.

Exemple de Mapeig:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "date": {
        "type": "date"
      }
    }
  }
}

  1. Optimització de les Consultes

3.1. Utilització de Filtratge

  • Utilitza filtres en lloc de cerques quan sigui possible, ja que els filtres no es tornen a calcular per cada consulta.

Exemple:

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status": "active" } }
      ]
    }
  }
}

3.2. Evitar Consultes Costoses

  • Evita l'ús de consultes que requereixin un processament intensiu, com ara wildcard o regexp.

3.3. Paginació Eficient

  • Utilitza search_after en lloc de from i size per paginar grans conjunts de dades.

Exemple:

GET /my_index/_search
{
  "size": 10,
  "search_after": [1463538857, "654323"]
}

  1. Caché i Memòria

4.1. Utilització de Caché

  • Configura la caché de consultes per millorar el rendiment de cerques repetitives.

Exemple:

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status": "active" } }
      ]
    }
  },
  "request_cache": true
}

4.2. Gestió de la Memòria

  • Assegura't que Elasticsearch tingui suficient memòria heap assignada.
  • Monitoritza l'ús de la memòria i ajusta els paràmetres segons sigui necessari.

  1. Monitorització i Anàlisi de Rendiment

5.1. Eines de Monitorització

  • Utilitza Kibana i altres eines per monitoritzar el rendiment de les cerques i identificar colls d'ampolla.

5.2. Anàlisi de Logs

  • Analitza els logs de Elasticsearch per detectar problemes de rendiment.

Exemple:

tail -f /var/log/elasticsearch/elasticsearch.log

Exercicis Pràctics

Exercici 1: Configuració d'Índexs

  1. Crea un índex amb 5 shards i 2 rèpliques.
  2. Defineix un mapeig per a un camp de text i un camp de data.

Solució:

PUT /my_index
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "date": {
        "type": "date"
      }
    }
  }
}

Exercici 2: Optimització de Consultes

  1. Escriu una consulta que utilitzi un filtre per cercar documents amb un camp status igual a active.
  2. Utilitza search_after per paginar els resultats.

Solució:

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status": "active" } }
      ]
    }
  },
  "size": 10,
  "search_after": [1463538857, "654323"]
}

Conclusió

En aquest tema, hem explorat diverses tècniques per optimitzar el rendiment de les cerques a Elasticsearch. Hem après sobre l'estructura de les dades, la configuració d'índexs, l'optimització de les consultes, la gestió de la memòria i la monitorització del rendiment. Amb aquestes eines i coneixements, estaràs millor preparat per gestionar cerques eficients i escalables en Elasticsearch.

© Copyright 2024. Tots els drets reservats