2017-07-27 1 views
1

Je suis nouveau dans le monde de l'elasticsearch.Interroger un doc complexe dans elasticsearch Elasticsearch

Nous traitons notre projet avec des documents complexes que nous stockons dans notre base de données elasticsearch.

Ceci est une partie de notre doc:

{ 
    "AAA":[ 
     { 
     "SSS":{ 
      "Description":{ 
       "Detail":[ 
        { 
        "Name":"A9", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A8", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A7", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A6", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A5", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A4", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A3", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A2", 
        "Infos":"...." 
        }, 
        { 
        "Name":"A1", 
        "Infos":"...." 
        } 
       ] 
      } 
     } 
     } 
    ] 
} 

Je veux une requête qui renvoie les « Infos » & « Nom » champs spécifiques à "Name":"A1" pour example.I ne veulent pas afficher toutes les tables de détails d'objet JSON mais juste l'objet qui "Name":"A1". En d'autres termes, je veux une requête qui renvoie cette partie du doc:

{ 
    "AAA":[ 
     { 
     "SSS":{ 
      "Description":{ 
       "Detail":[ 
        { 
        "Name":"A1", 
        "Infos":"...." 
        } 
       ] 
      } 
     } 
     } 
    ] 
} 

J'utilise ElasticSearch 5.4 Ceci est la mise en correspondance J'utilise:

{ 
    "mappings":{ 
     "-----":{ 
     "properties":{ 
      "AAA":{ 
       "type":"nested", 
       "properties":{ 
        "SSS":{ 
        "properties":{ 
         "Description":{ 
          "properties":{ 
           "Detail":{ 
           "type":"nested", 
           "properties":{ 
            "Infos":{ 
             "type":"keyword" 
            }, 
            "Name":{ 
             "type":"keyword" 
            } 
           } 
           } 
          } 
         } 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Ce sont deux questions que j'ai essayé mais cela n'a pas fonctionné:

GET /******/******/_search 
{ 
    "_source":["AAA.SSS.Description.Detail.Name","AAA.SSS.Description.Detail.Infos"], 
    "query": { 
     "query_string" : { 
      "default_field" : "AAA.SSS.Description.Detail.Name", 
      "query" : "A1" 

     } 
    } 
} 


GET /******/******/_search 
{ 
    "_source":["AAA.SSS.Description.Detail.Name","AAA.SSS.Description.Detail.Infos"], 

     "filter": [ 
     { "term": { "AAA.SSS.Description.Detail.Name": "A1" }} 

     ] 
} 

J'essaie toute la journée et cela n'a pas fonctionné pour moi. Quelqu'un peut-il m'aider. Merci d'avance.

+0

Votre 'AAA.SSS.Detail' Le champ n'est probablement pas imbriqué. Vous devriez lire ceci et vous aurez une idée de comment le faire fonctionner: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html – Val

+0

Ceci est la cartographie que j'utilise: "correspondances": { "-----": { "propriétés": { "AAA": { "type": "imbriqué", "propriétés": { "SSS": { "propriétés": { "description": { "propriétés": { "Détail": { "type": "imbriqués", "propriétés": { "Infos": { "type" : "mot-clé"}, "Nom": { "type": "mot-clé"}, }} }} }} }} }} } –

+0

Pouvez-vous montrer ce que vous avez essayé requêtes à ce jour? – Val

Répondre

0

La requête query_string ne fonctionne pas encore avec les données nested. Vous devez créer un nested query avec une requête term dans celui-ci. Cela devrait vous permettre de continuer:

GET /******/******/_search 
{ 
    "query": { 
    "nested": { 
     "path": "AAA", 
     "query": { 
     "nested": { 
      "path": "AAA.SSS.Description.Detail", 
      "query": { 
      "term": { 
       "AAA.SSS.Description.Detail.Name": "A1" 
      } 
      }, 
      "inner_hits": { 
      "_source": { 
       "includes": [ 
       "AAA.SSS.Description.Detail.Name", 
       "AAA.SSS.Description.Detail.Infos" 
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Merci pour votre réponse d'yr: J'ai essayé la requête mais elle m'a donné cette erreur: { "erreur": { "ROOT_CAUSE": [{ "type": "illegal_argument_exception", "raison": "[inner_hits] _Source ne supporte pas les valeurs de type: START_ARRAY" } ], "type": "illegal_argument_exception", "raison": "[inner_hits] _Source ne supporte pas les valeurs de type: START_ARRAY" }, "statut": 400} –

+0

J'ai mis à jour ma réponse. Veuillez réessayer – Val

+0

La requête me donne tous les AAA.SSS.Description.Detail.Name non seulement AAA.SSS.Description.Detail.Name qui est égal à "A1" –

0

Ceci est la requête qui fonctionne avec mon exemple:

POST index/type/_search 
{ 
    "query": { 
    "nested": { 
     "path": "AAA.SSS.Description.Detail", 
     "query": { 
      "match": { 
      "AAA.SSS.Description.Detail.Name": "A1" 
      } 
     }, 
     "inner_hits" : { 
      "_source": { 
       "includes":["AAA.SSS.Description.Detail.Name","AAA.SSS.Description.Detail.Infos"] 
      } 
     } 
    } 
    } 
} 

et voici le résultat:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 1.89712, 
    "hits": [ 
     { 
     "_index": "index", 
     "_type": "type", 
     "_id": "AV2NxhX8nWBA4r3kkKAM", 
     "_score": 1.89712, 
     "_source": { 
      "AAA": [ 
      { 
       "SSS": { 
       "Description": { 
        "Detail": [ 
        { 
         "Name": "A9", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A8", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A7", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A6", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A5", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A4", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A3", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A2", 
         "Infos": "...." 
        }, 
        { 
         "Name": "A1", 
         "Infos": "...." 
        } 
        ] 
       } 
       } 
      } 
      ] 
     }, 
     "inner_hits": { 
      "AAA.SSS.Description.Detail": { 
      "hits": { 
       "total": 1, 
       "max_score": 1.89712, 
       "hits": [ 
       { 
        "_nested": { 
        "field": "AAA", 
        "offset": 0, 
        "_nested": { 
         "field": "SSS.Description.Detail", 
         "offset": 8 
        } 
        }, 
        "_score": 1.89712, 
        "_source": { 
        "AAA": { 
         "SSS.Description.Detail": { 
         "Infos": "....", 
         "Name": "A1" 
         } 
        } 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    ] 
    } 
}