2017-10-16 7 views
0

I ont un indice/type dans ES qui a le type de documents suivants:Rechercher dans JSON avec élastique

body "{\"Status\":\"0\",\"Time\":\"2017-10-3 16:39:58.591\"}" 
type "xxxx" 
source "11.2.21.0" 

Le champ du corps est un JSON.So Je veux chercher par exemple les enregistrements qui ont en leur corps JSON Status:0. requête doit ressembler à quelque chose comme ça (il ne fonctionne pas):

GET <host>:<port>/index/type/_search 
{ 
    "query": { 
     "match" : { 
      "body" : "Status:0" 
     } 
    } 
} 

Toutes les idées?

Répondre

0

Vous devez modifier les paramètres de l'analyseur de votre index.

Pour le modèle JSON que vous avez présenté, vous devez disposer d'un char_filter et d'un tokenizer qui suppriment les éléments JSON, puis les segmentent en fonction de vos besoins.

Votre analyseur doit contenir un tokenizer et un char_filter comme ceux-ci ici:

{ 
    "tokenizer" : { 
    "type": "pattern", 
    "pattern": "," 
    }, 
    "char_filter" : [ { 
    "type" : "mapping", 
    "mappings" : [ "{ => ", "} => ", "\" => " ] 
    } ], 
    "text" : [ "{\"Status\":\"0\",\"Time\":\"2017-10-3 16:39:58.591\"}" ] 
} 

Explication: le char_filter supprimera les caractères: { } ". Le tokenizer sera tokenize par la virgule.

Ceux-ci peuvent être testés à l'aide de l'API Analyze. Si vous exécutez la JSON ci-dessus contre cette API, vous obtenez ces jetons:

{ 
    "tokens" : [ { 
    "token" : "Status:0", 
    "start_offset" : 2, 
    "end_offset" : 13, 
    "type" : "word", 
    "position" : 0 
    }, { 
    "token" : "Time:2017-10-3 16:39:58.591", 
    "start_offset" : 15, 
    "end_offset" : 46, 
    "type" : "word", 
    "position" : 1 
    } ] 
} 

Le premier jeton ("Status:0") qui est récupéré par l'API Analyser est celui que vous utilisez dans votre recherche.