Elasticsearch mappage par défaut
Ma compréhension actuelle-
- Elasticsearch crée la cartographie des indices de la première fois qu'il reçoit les ensembles de données JSON.
- Cette cartographie ne peut pas être changé, mais les ensembles de données peuvent être mappés.
Question-
Oublier de re-mapping. Est-il possible de tell ES à se comporter par défaut comme-
"Consider everything that is not a date to be of string type"
?
Aussi, vais-je perdre beaucoup si je fais cela?
Mise à jour-
j'ai ajouté le fichier- config/mappings/_default/mapping.json
avec le contenu suivant-
{
"dynamic_templates": [
{
"template_1": {
"match": "*",
"match_mapping_type": "int",
"mapping": {
"type": "string"
}
},
"template_2": {
"match": "*",
"match_mapping_type": "long",
"mapping": {
"type": "string"
}
}
}
]
}
j'ai aussi essayé de placer les suivants config/default_mapping.json
{
"_default_" : {
"match": "*",
"match_mapping_type": "int",
"mapping": {
"type": "string"
}
}
}
Mon "motif" est de se débarrasser des erreurs qui surgissent si int
et long
types de changement de string
. Sera-ce la carte tous int
et long
valeurs string
à travers tous les index sont créés dans l'avenir? Ai-je besoin de nid ce dynamic_templates
clé au sein de _all
?
Mise à jour II-
L'ajout de ce fichier de mappage causes elasticsearch pour la toux jusqu'à-
[2014-02-04 10:48:34,396][DEBUG][action.admin.indices.create] [Her] [logstash-2014.02.04] failed to create
org.elasticsearch.index.mapper.MapperParsingException: mapping [mapping.json]
at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$2.execute(MetaDataCreateIndexService.java:312)
at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:298)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:135)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:701)
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map
at org.elasticsearch.index.mapper.DocumentMapperParser.extractMapping(DocumentMapperParser.java:268)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:155)
at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:314)
at org.elasticsearch.index.mapper.MapperService.merge(MapperService.java:193)
at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$2.execute(MetaDataCreateIndexService.java:309)
... 5 more
2014-02-04 10:48:34 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2014-02-04 10:48:33 +0000 error_class="Net::HTTPServerException" error="400 \"Bad Request\"" instance=17509700
OriginalL'auteur erbdex | 2014-02-04
Vous devez vous connecter pour publier un commentaire.
Lorsque vous commencez à partir de zéro, donc sans cartographie, vous pouvez compter sur les valeurs par défaut. Chaque fois que vous envoyez un document les champs qui n'étaient pas mappé encore sont automatiquement mappés en fonction de leur type json (et conventions pour les dates). Cela dit, si vous envoyez un champ dans votre premier document comme un numéro, et le même champ devient une chaîne de caractères dans votre deuxième document, l'indice de l'opération pour la deuxième document renvoie une erreur.
Il y a des api pour gérer les mappages, ce qui ne signifie pas que vous devez déclarer tous vos champs. Vous pouvez simplement spécifier ceux que vous voulez un comportement différent de la valeur par défaut. Vous pouvez spécifier les mappages de tout la création d'un index, à l'aide de la mettre la cartographie de l'api si l'index existe déjà, ou même de les inclure dans l'indice de modèles, pour les indices qui doivent encore être créés.
De changer le mapping est possible, mais seulement compatible des modifications peuvent être appliquées. Vous pouvez toujours ajouter de nouveaux champs, mais vous ne pouvez pas changer le type ou l'analyseur pour un champ existant. Ce que vous pourriez faire dans ce cas est d'essayer de faire le changement vers l'arrière compatible en utilisant multi-champs, sinon vous avez besoin d'indexer contre les mises à jour des mappages.
Quant à votre dernière question, si vous index tout comme une chaîne de caractères, vous perdez ce que vous pouvez généralement le faire avec des nombres par exemple la gamme des requêtes. Si cela est faisable ou pas dépend de vos données et ce que vous devez faire avec elle.
Don't map, string everything.
? 🙂Bien sûr, vous pouvez, votre question était de savoir si cela a du sens, et ma réponse suppose que vous savais que c'était possible 🙂 modèles Dynamiques sont la réponse, pour éviter de spécifier tous les champs, mais juste un modèle et de la cartographie pour être appliquée.
Il en sera de quelque chose comme ceci s'assurer que tous mes
int
etlong
valeurs répertoriéesstring
, à travers le conseil d'administration? Pourriez-vous vérifier?j'ai mis à jour la question, @javanna
Je vous suggère de ne pas utiliser des fichiers de configuration, lorsque vous merveilleux api comme ceux qui elasticsearch fournit. Il suffit d'ajouter votre dynamique de modèles à votre mappages. À l'aide de la
_default_
type de sens, vous devrez supprimer lamatch_mapping_type
de sorte qu'avec un seul modèle de carte tout comme une chaîne de caractères. Que votre erreur, le fichier que vous avez envoyé est mal formé.OriginalL'auteur javanna