2017-08-28 2 views
0

Par défaut, Elasticsearch lève une exception si vous insérez des données dans un champ qui ne correspond pas au type existant. Par exemple, si un champ a été créé en tant que type de numéro, l'insertion d'un document avec une valeur de chaîne pour ce champ provoque une erreur.Recherche de documents dans Elasticsearch où `ignore_malformed` a été déclenché

Ce comportement peut être modifié en permettant ensuite mise ignore_malformed, ce qui signifie que ces champs sont ignorés en silence à des fins d'indexation, mais retenu dans le document _source - ce qui signifie que les valeurs non valides ne peuvent être recherchées ou agrégées, mais sont toujours inclus dans le document retourné.

Ceci est un comportement préférable dans notre cas d'utilisation, mais nous souhaiterions être en mesure de localiser de tels documents en quelque sorte afin que nous puissions les réparer à l'avenir.

Existe-t-il un moyen de marquer en quelque sorte les documents pour lesquels certains champs malformés ont été ignorés? Nous contrôlons entièrement le processus d'insertion de document, afin que nous puissions modifier tous les indicateurs d'insertion, ou faire un essai d'insertion, ou quoi que ce soit, pour atteindre notre objectif.

Répondre

1

Vous pouvez utiliser la exists requête pour trouver le document où ce domaine n'existe pas, voir cet exemple

PUT foo 
{ 
    "mappings": { 
    "bar": { 
     "properties": { 
     "baz": { 
      "type": "integer", 
      "ignore_malformed": true 
     } 
     } 
    } 
    } 
} 

PUT foo/bar/1 
{ 
    "baz": "field" 
} 

GET foo/bar/_search 
{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must_not": [ 
      { 
       "exists": { 
       "field": "baz" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Il n'y a pas de mécanisme dédié, donc cette recherche trouve également des documents où le champ est pas défini intentionnellement

+0

Il m'est très difficile de différencier les documents ayant ce champ (mais mal formés) des documents qui n'ont pas de champ. J'aurais besoin d'une sorte de recherche qui vérifierait que le champ n'existe pas comme indexé, mais existe dans "_source". En plus de cela, le problème est que j'ai 1000 champs différents, et trouver n'importe quel domaine avec un conflit va être difficile. – Nakedible