编程知识 cdmana.com

Elasticsearch 7 - Dynamic Mapping and Explicit Mapping

[C'est ma participation11Le défi du mois de juin18Oh, mon Dieu.,Voir les détails de l'événement:2021Un dernier défi]


Un.、Qu'est - ce qu'une cartographie(Mapping)

Par 【Elasticsearch7——Index、type、Documents et champs】 Une section montre,ElasticsearchOù les données sont stockées sous forme de document,Les requêtes peuvent être faites par index après traitement.Et la cartographie(mapping)C'est primitif.JSONConvertisseur vers le document;Détermine également comment l'index est associé au document.

Comme suit:

Participant.png

Chaque document est une collection de champs, Chaque champ a son propre Type de données. Une carte peut être définie lors de la cartographie des données , Contient une liste des champs associés au document . La définition de la cartographie comprend également des champs de métadonnées ,Par exemple_source Les champs définissent la façon de traiter les Métadonnées.

Empêcher les champs d'augmenter indéfiniment

Si une cartographie dynamique est utilisée , Chaque nouveau document inséré peut introduire de nouveaux champs . Définir trop de champs dans l'index peut entraîner Cartographier l'explosion ,Et doncMémoire insuffisante Des erreurs et Difficile à récupérer Situation.Utiliser Configuration des limites de cartographie Pour limiter le nombre de cartes de champ ( Création manuelle ou dynamique ) Et empêcher l'explosion de la cartographie .

  • index.mapping.total_fields.limit: Limite le nombre maximum de champs dans l'index ;ChampCartographie des objetsEtAlias du champ Compte tenu de cette limite ,La valeur par défaut est1000. Le but de cette restriction est d'éviter que la cartographie et la recherche ne deviennent trop grandes . Des valeurs plus élevées peuvent entraîner une dégradation des performances et des problèmes de mémoire , En particulier dans les grappes à forte charge ou à faibles ressources .
  • index.mapping.depth.limit: Représente la profondeur de la cartographie .Par exemple, Si tous les champs sont définis au niveau de l'objet racine ,Alors la profondeur est1. S'il y a une cartographie d'objet ,Alors la profondeur est 2Attendez..Par défaut20.
  • index.mapping.nested_fields.limit:DéfininestedIndex Nombre maximum de cartes différentes dans ,nested Les types ne doivent être utilisés que lorsqu'il est nécessaire d'interroger les tableaux d'objets indépendamment les uns des autres ;Par défaut50.
  • index.mapping.nested_objects.limit: La nidification qu'un seul document peut contenir JSON Objet(nestedType)Nombre maximum de,Par défaut10000.
  • index.mapping.field_name_length.limit: Définir la longueur maximale du nom du champ ,Par défaut Long.MAX_VALUE(Illimité).
  • index.mapping.dimension_fields.limit:Uniquement Elastic Pour usage interne,Dimensions maximales des séries chronologiques de l'index;Par défaut16.

dynamic Paramètres

dynamic Les paramètres contrôlent si de nouveaux champs sont ajoutés dynamiquement , Les valeurs sont les suivantes :

Valeur
true Nouveau champ ajouté à la carte (Par défaut)
runtime Nouveau champ comme Champ d'exécution Ajouter à la carte , Ces champs ne sont pas indexés ,Et_source Charger lors de la requête
false Le nouveau champ sera Ignorer, Ces champs ne sont ni indexés ni consultables
strict Si un nouveau champ est détecté ,Oui. Lance une exception et rejette Documentation, Le nouveau champ doit être explicitement ajouté à la carte

La recherche se déroule en deux étapes : Recherche en entrant lors de la recherche 、 Recherche en entrant dans l'index , Creusez un trou ici pour l'instant [todo].Et Champ d'exécution Oui.Lors de la requête Champs calculés ,C'est bon.:

  • Ajouter des champs au document existant sans ré - indexer les données
  • Commencer le traitement des données sans connaître la structure des données
  • écraser la valeur retournée du champ index lors de la requête
  • Définir des champs à des fins spécifiques sans modifier l'architecture sous - jacente

Les avantages

  • Parce que le champ d'exécution n'est pas indexé , Par conséquent, l'ajout d'un champ d'exécution n'augmente pas la taille de l'index ;
  • Si vous définissez le champ d'exécution comme un champ index , Il n'est pas nécessaire de modifier une requête qui fait référence à un champ d'exécution ;
  • Simplification de la prise de décision en matière de cartographie , Il n'est pas nécessaire de décider à l'avance comment analyser les données ;
  • Utiliser la recherche asynchrone API Lancer une recherche contenant des champs d'exécution . Cette méthode de recherche aide à compenser l'impact sur le rendement des valeurs calculées pour les champs d'exécution dans chaque document qui contient ce champ .

Utiliser Champ d'exécution Pas besoin de Index Le schéma peut être modifié ,Peut être utilisé en combinaison Champ d'exécution EtChamp Index Pour équilibrer l'utilisation des ressources et le rendement . Cela rend l'index plus petit , Recherche plus lente .

2.、Cartographie dynamique

Cartographie dynamiqueAllow Elasticsearch Ajouter dynamiquement d'autres champs , Il suffit d'indexer le document .Elasticsearch Une des caractéristiques les plus importantes est Accord, Les documents indexés peuvent être ajoutés directement , Pas besoin de créer un index 、Définir le type de carte et définir les champs.

La détection automatique et l'ajout de nouveaux champs sont appelés  Cartographie dynamique, Vous pouvez également personnaliser les règles de cartographie dynamique :

  • Cartographie dynamique des champs : Gérer les règles pour détecter les champs dynamiques
  • Modèles dynamiques: Configurer les règles de cartographie personnalisées pour les champs ajoutés dynamiquement ; Les modèles d'index peuvent configurer la cartographie par défaut pour les nouveaux index 、 Paramètres et alias , Qu'il s'agisse d'une création automatique ou explicite .

Disponible dans la documentation et object Niveau désactiver la cartographie dynamique ,Oui.dynamicParamètre défini à false Ignorer le nouveau champ ,Set tostrictIl sera là. Elasticsearch Rejeter le document lorsqu'un champ inconnu est rencontré .

Cartographie dynamique des champs

Quand Elasticsearch Lorsqu'un nouveau champ est détecté dans le document , Il ajoute dynamiquement ce champ à la carte de type par défaut ;Peut passerdynamic Paramètres Contrôler ce comportement .

Activer la cartographie dynamique :

  • Quanddynamic=trueHeure, Recherche en entrant dans l'index
  • Quanddynamic=runtimeHeure, Recherche en entrant lors de la recherche

dynamic Les paramètres affectent JSONAnalyse des données, Le type de données par défaut est résolu comme suit :

jsonDonnées dynamic=true dynamic=runtime
null Ne pas ajouter Ne pas ajouter
true Ou false boolean boolean
double float double
integer long long
object object Ne pas ajouter de champs
array Dépend du premier non dans le tableau nullValeur Dépend du premier non dans le tableau nullValeur
string【 Test de date de réussite 】 date date
string【 Test numérique réussi float Ou long double Ou long
string【 Échec du test de date ou de valeur 】 textAvec.keywordSous - Champs keyword

date_detection( Date de détection )

Sidate_detection- Oui.enabled(Par défaut), Vérifiez le nouveau champ de chaîne pour voir si son contenu est compatible avec Tous les modèles de date spécifiés dans dynamic_date_formats.Si une correspondance est trouvée,date Un nouveau champ avec le format approprié est ajouté .

dynamic_date_formatsLa valeur par défaut pour est:

  • yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ
  • yyyy-MM-dd
  • yyyy/MM/dd HH:mm:ss Z
  • yyyy/MM/dd Z

Désactiver la détection de date :

PUT my-index-000001
{
  "mappings": {
    "date_detection": false
  }
}
Copier le Code

Détection de date personnalisée :

PUT my-index-000001
{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}

PUT my-index-000001/_doc/1
{
  "create_date": "09/25/2015"
}
Copier le Code

Détection numérique (numeric_detection):

PUT my-index-000001
{
  "mappings": {
    "numeric_detection": true
  }
}

PUT my-index-000001/_doc/1
{
  "my_float":   "1.0", 
  "my_integer": "1" 
}
Copier le Code

Modèle de cartographie dynamique

Sauf que Règles de cartographie dynamique des champs par défaut Au - delà,Oui.dynamicSet totrueOuruntime,Et vous pouvez passerModèles dynamiques Règles de cartographie personnalisées . Les modèles dynamiques peuvent être réorganisés ou supprimés après leur ajout ,Les règles de correspondance sont les suivantes:

  • match_mapping_type: Validation par type , Prise en charge du type de données par défaut
  • match/unmatch: Correspondance des motifs par nom de champ
  • path_match/path_unmatch: Pattern Matching by Property Access path
  • Non défini Lorsque les règles ci - dessus correspondent , Ne correspond à aucun champ

Valider la cartographie

Si la carte fournie contient un fragment de carte invalide , Erreur de validation retournée . Validation lors de l'application d'un modèle dynamique indexé , Et dans la plupart des cas, , Validation lors de la mise à jour du modèle dynamique .Dans certains cas, La fourniture d'un fragment de carte invalide peut entraîner l'échec de la mise à jour ou de la validation du modèle dynamique :

  • Simatch_mapping_typeNon spécifié, Mais le modèle peut correspondre à au moins un type de cartographie prédéfini , Le fragment de carte est considéré comme valide . Si un champ peut être indexé par différents types au moment de la correspondance ,Alors, dansLors de l'indexation Une erreur de validation est retournée .Alors...,Recommandationsmatch_mapping_type Configuré comme prévu JSONType.

  • Si vous l'utilisez dans un fragment de carte {name}Placeholder, Sauter la validation lors de la mise à jour du modèle dynamique , Parce que le nom est inconnu .

match_mapping_type、match/unmatch、path_match/path_unmatch

  1. Paramètres du modèle dynamique champ d'exécution

Les modèles dynamiques peuvent définir les champs d'exécution ,Comme suit. Quand ça correspond , Les champs sont mappés au type ipDe Champ d'exécution .

PUT my-index-000001/
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_ip": {
          "match_mapping_type": "string",
          "match": "ip*",
          "runtime": {
            "type": "ip"
          }
        }
      }
    ]
  }
}
Copier le Code
  1. match_mapping_type

match_mapping_type Les types de données peuvent être JSON Détection de l'analyseur .Parce que JSON Aucune distinction longEt integerOu doubleEt float, Il choisit donc toujours un plus large éventail de types de données ,Par exemplelongEntier etdoubleNombre de points flottants.

Par exemple,Oui.longMapping asinteger

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "fields": {
              "raw": {
                "type":  "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}
Copier le Code
  1. match/unmatch

match Parameter Use Pattern Matching Field name ;Etunmatch Utiliser le modèle pour exclure les champs correspondants .

  "match_pattern": "regex",
  "match": "^profit_\d+$"
Copier le Code
  1. path_match Et path_unmatch

path_matchAvecpath_unmatchParamètres etmatch/unmatchSimilaire, C'est juste que ça correspond au chemin, pas au nom du champ .Par exemple:

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "full_name": {
          "path_match":   "name.*",
          "path_unmatch": "*.middle",
          "mapping": {
            "type":       "text",
            "copy_to":    "full_name"
          }
        }
      }
    ]
  }
}
Copier le Code

Variables du modèle

{name}Placeholder atmapping  Remplacer par le nom du champ ;{dynamic_type}Placeholder atmapping  Est remplacé par un type dynamique .

PUT my-index-000001
{
  "mappings": {
    "dynamic_templates": [
      {
        "named_analyzers": {
          "match_mapping_type": "string",
          "match": "*",
          "mapping": {
            "type": "text",
            "analyzer": "{name}"
          }
        }
      },
      {
        "no_doc_values": {
          "match_mapping_type":"*",
          "mapping": {
            "type": "{dynamic_type}",
            "doc_values": false
          }
        }
      }
    ]
  }
}
Copier le Code

Cartographie des requêtes

GET test/_mapping

Result:
{
  "test" : {
    "mappings" : {
      "properties" : {
        "description" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Copier le Code

Trois、 Cartographie explicite

Cartographie explicite : Une définition précise de la cartographie des contraintes ,Par exemple:

  • Quels champs de chaînes doivent être considérés comme Champ texte complet
  • Quels champs contiennent NombreDateOuSituation géographique
  • Valeur de la date Format de
  • ContrôleAjouter dynamiquement Règles personnalisées pour la cartographie des champs

Définir explicitement la cartographie lors de la création de l'index :

PUT /my-index-000003
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}

Copier le Code

Mise à jour de la cartographie(Ajouter un attribut):

PUT /my-index-000003/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}
Copier le Code

Modifier un champ existant peut invalider les données indexées , Si vous devez modifier la cartographie des champs existants , Veuillez créer un nouveau flux de données et y indexer vos données .


Voir l'index:

# Voir l'index
GET /my-index-000003/_mapping

Copier le Code

API Renvoie la réponse suivante :

{
  "my-index-000003" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "email" : {
          "type" : "keyword"
        },
        "employee-id" : {
          "type" : "keyword",
          "index" : false
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}
Copier le Code

Voir les champs spécifiques de l'index :

#  Voir les champs spécifiques de l'index 
GET /my-index-000003/_mapping/field/age
Copier le Code

API Renvoie la réponse suivante :

{
  "my-index-000003" : {
    "mappings" : {
      "age" : {
        "full_name" : "age",
        "mapping" : {
          "age" : {
            "type" : "integer"
          }
        }
      }
    }
  }
}
Copier le Code

Quatre、Documents de référence

Mapping

版权声明
本文为[Ici, Manon.]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/11/20211125173914469D.html

Scroll to Top