web-dev-qa-db-fra.com

Comment mettre à jour le mappage dans Elasticsearch pour changer le type de données de champ et le type d'analyseurs dans la chaîne

En essayant de mettre à jour le mappage, j'obtiens l'erreur suivante:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [timestamp] of different type, current_type [string], merged_type [date]"}],"type":"illegal_argument_exception","reason":"
mapper [timestamp] of different type, current_type [string], merged_type [date]"},"status":400}

J'essaie d'exécuter la commande suivante sous Windows

   curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
    "properties":
    {
        "timestamp": 
        {
            "type": "date", 
            "format": "MM-dd-yyyy HH:mm:ss",
            "fielddata":{"loading" : "lazy"} }
        }
    }";

Comment je peux changer le type de données du champ de date de chaîne en type de date avec un format particulier.

J'ai essayé de changer le mappage d'un type de données de chaîne pour le changer en eager loading et not_analyzed à partir de l'analyse, mais l'erreur suivante est générée:

{"root_cause":[{"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflicts with existing mapping in other types:\n[mapper [AppName] has different [index] values, mapper [App
 different [doc_values] values, cannot change from disabled to enabled, mapper [AppName] has different [analyzer]]"}],"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflict with
existing mapping in other types:\n[mapper [AppName] has different [index] values, mapper [AppName] has different [doc_values] values, cannot change from disabled to enabled, mapper [AppName]
rent [analyzer]]"},"status":400}

Voici ma requête pour le même:

 curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
"properties":
    {"AppName":
        {
        "type": "string", 
        "index" : "not_analyzed",
        "fielddata":{"loading" : "eager"}
        }
    }
}"

Cependant, si je le change de not_analyzed à analyzed, il donne un message acknowledged=true. Comment puis-je changer l'analyseur. 

7
PRIYANSHU BAJPAI

Vous ne pouvez pas modifier le mappage des types de données existants. Comme le dit le document Elastic:

Bien que vous puissiez ajouter un mappage existant, vous ne pouvez pas modifier les mappages de champs existants. Si un mappage existe déjà pour un champ, les données de ce champ ont probablement été indexées. Si vous deviez modifier le mappage des champs, les données indexées seraient erronées et ne pourraient pas être recherchées correctement.

Nous pouvons mettre à jour un mappage pour ajouter un nouveau champ, mais nous ne pouvons pas modifier un Champ existant d’analysé à non analysé.

Votre seule option est de créer un nouvel index avec le nouveau mappage et de réindexer les données de l'ancien index vers le nouveau.

9
israelst

Non, vous ne pouvez pas modifier une définition de champ unique

Si vous souhaitez modifier la définition de champ pour un champ unique dans un type unique, vous n'avez guère d'autre choix que de réindexer tous les documents de votre index.


Pourquoi ne pouvez-vous pas changer les correspondances? Cet article Changer le mappage avec zéro arrêt explique,

Afin de permettre la recherche dans Vos données, votre base de données doit savoir quel type de données Contient chaque champ et comment il doit être indexé. 

Si vous modifiez un type de champ , Par exemple, une chaîne à une date, toutes les données de ce champ que vous avez déjà indexées deviennent inutiles. D'une manière ou D'une autre, vous devez réindexer ce champ.

Cela s'applique non seulement à Elasticsearch, mais à toute base de données qui utilise Pour la recherche. Et s’il n’utilise pas d’indices, c’est Sacrifier la vitesse pour gagner en flexibilité.


Que se passe-t-il lorsque vous indexez un document avec un type de champ incorrect?  

Une conversion sera tentée. Si aucune conversion valide n'existe, une exception est levée.

Elasticsearch: Le guide définitif contient une note relative à un exemple, une string est entrée mais long est attendu. Une conversion sera tentée. Mais une exception sera toujours levée si aucune conversion valide n'existe.

[...] si le champ est déjà mappé en tant que type, alors ES essaiera de convertir la chaîne en long, et lèvera une exception s’il ne le peut pas.


Puis-je quand même indexer le document en ignorant les champs mal formés?

Oui. ES5 fournit un paramètre ignore_malformed mapping. Elasticsearch Reference explique que, 

Essayer d'indexer le mauvais type de données dans un champ lève une exception de Par défaut et rejette l'ensemble du document. Le paramètre ignore_malformed , S'il est défini sur true, permet d'ignorer l'exception. Le champ Malformé n'est pas indexé, mais les autres champs du document sont Traités normalement.

1
sam