2017-10-14 13 views
0

J'observe un comportement étrange provenant d'Elasticsearch 5.2 et il est impossible de déboguer - car il n'y a pas d'erreurs lancées et je n'arrive pas à trouver des problèmes/documentation similaires en ligne.Stockage de la chaîne de tableaux JSON elasticsearch Bogue

Je stocke un tableau JSON en tant que "chaîne" dans elasticsearch (en utilisant json.dumps() de python) - bref, je dois le faire de cette façon. Toutefois, lorsque je fais une requête DSL, seuls les tableaux JSON (stockés sous la forme d'une chaîne singulière) contenant 1 objet sont affichés. Si plus de 1, alors il retourne juste un seau vide 0 objets. Je les stocke dans un champ appelé "métadonnées".

Je suis très confus pourquoi seul un sous-ensemble des données est montré, et d'autres données (avec plus de 1 objet dans le tableau json) est ignorée. Les données sont codées en tant que chaîne. Je sais pour un fait les données stockées dans l'index. Je peux le voir dans kibana "discovery" - comme je peux voir de grandes chaînes JSON avec plusieurs objets.

Exemple 1 (JSON chaîne w/1 objet):

[{ "score": ,8829717636108398, "hauteur": ,875460147857666, "largeur": ,3455989360809326, "y": 0,08105117082595825, « x ": ,5616265535354614, "note": "box1"}]

Exemple 2:

[{" score »: ,8829717636108398, "hauteur": ,875460147857666, "largeur": 0.3455989360809326, "y": 0.08105117082595825, "x": 0.5616265535354614, "note": "box1"}, {"score": 0.6821991136108398, "hauteur": 0.875460147857666, "largeur": 0.3455989360809326, "y": 0.08105117082595825, " x ": ,5616265535354614, "note": "box2"}]

Voici ma question:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      "analyze_wildcard": true, 
      "query": "*" 
      } 
     }, 
     { 
      "range": { 
      "created_at": { 
       "gte": 1508012482796, 
       "lte": 1508014282797, 
       "format": "epoch_millis" 
      } 
      } 
     } 
     ], 
     "must_not": [] 
    } 
    }, 
    "size": 0, 
    "_source": { 
    "excludes": [] 
    }, 
    "aggs": { 
    "5": { 
     "terms": { 
     "field": "metadata.keyword", 
     "size": 31, 
     "order": { 
      "_count": "desc" 
     } 
     } 
    } 
    } 
} 

Cette requête renvoie uniquement les chaînes avec 1 objet. Voir ci-dessous:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 4214, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "5": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 35, 
     "buckets": [ 
     { 
      "key": "[]", 
      "doc_count": 102 
     }, 
     { 
      "key": "{}", 
      "doc_count": 8 
     }, 
     { 
      "key": "[{\"score\": 0.9015679955482483, \"height\": 0.8632315695285797, \"width\": 0.343660831451416, \"y\": 0.08102986216545105, \"x\": 0.5559845566749573, \"note\": \"box11\"}]", 
      "doc_count": 6 
     }, 
     { 
      "key": "[{\"score\": 0.6365205645561218, \"height\": 0.9410756528377533, \"width\": 0.97696852684021, \"y\": 0.04701271653175354, \"x\": 0.013666868209838867, \"note\": \"box17\"}]", 
      "doc_count": 4 
     }, 
... 
} 

Comme observé, seules les données avec des chaînes JSON avec 1 objets (par exemple [{..}]) sont renvoyés/visibles. Il ignore complètement les chaînes comportant plusieurs objets (c'est-à-dire [{...}, {...}]).

Plus Clarifications:

  • Il utilise les applications par défaut
  • Je suis en mesure d'obtenir la chaîne JSON (quel que soit le nombre d'objets) lorsqu'il est interrogé par identifiant du document, ou en utilisant « correspondance » par valeurs de champ exactes)
+1

Je voudrais poser quelques questions. Tout d'abord, pouvez-vous s'il vous plaît fournir votre cartographie? Deuxièmement, êtes-vous capable de récupérer ces tableaux JSON par ID de document? Troisièmement, est-ce que je comprends bien que vous voulez obtenir de tels documents (comme l'exemple 2) comme l'un des compartiments de l'agrégation que vous avez fournie? Merci. –

+1

Je pense que le champ de mot-clé a également '' "ignore_above": 256' appliqué, donc pourquoi les champs avec deux objets ou plus dans le tableau JSON ne sont pas indexés. – Val

+0

1) J'utilise le mapping par défaut. Par conséquent, il a deux champs "métadonnées" (analysé) et "metadata.keyword" (non analysé, mais agrégable). 2) Oui, je vois les données stockées en format de chaîne. Comme l'exemple fourni ci-dessus. Ce n'est que lorsque je fais les requêtes agrégées que ça casse. 3) Exactement, le godet est entièrement vide (j'ai essayé d'autres requêtes, les godets sont "[]"). –

Répondre

2

Si vous utilisez le mappage par défaut, est très probablement parce que votre mot-clé a un mappage ignore_above: 256 paramètres et ressemble à ceci:

{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "metadata": { 
      "type": "keyword", 
      "ignore_above": 256 
     } 
     } 
    } 
    } 
} 

Vous pouvez augmenter cette limite afin d'indexer vos chaînes JSON de plus de 256 caractères.