0

J'utilise elasticsearch 2.3.4, mais la syntaxe ne semble pas avoir changé dans 5.x.Elasticsearch Multi Travailler via curl, mais aucun résultat n'est renvoyé via Java API

La boucle multi-boucles fonctionne très bien. Voici ce que ma boucle ressemble:

curl 'localhost:9200/_mget' -d '{ 
    "docs" : [ 
     { 
      "_index" : "logs-2017-04-30", 
      "_id" : "e72927c2-751c-4b33-86de-44a494abf78f" 
     } 
    ] 
}' 

Et quand je veux tirer le champ de « message » cette réponse, j'utilise cette demande:

curl 'localhost:9200/_mget' -d '{ 
    "docs" : [ 
     { 
      "_index" : "logs-2017-04-30", 
      "_id" : "e72927c2-751c-4b33-86de-44a494abf78f", 
      "fields" : ["message"] 
     } 
    ] 
}' 

Les deux requêtes ci-dessus renvoient le journal et l'information que je cherche.

Mais lorsque je tente de traduire en Java comme ceci:

MultiGetRequestBuilder request = client.prepareMultiGet(); 
request.add("logs-2017-04-30", null, "e72927c2-751c-4b33-86de-44a494abf78f"); 
MultiGetResponse mGetResponse = request.get(); 
for (MultiGetItemResponse itemResponse : mGetResponse.getResponses()) { 
    GetResponse response = itemResponse.getResponse(); 
    logger.debug("Outputing object: " + ToStringBuilder.reflectionToString(response)); 
} 

Je semble être de récupérer des objets nuls en arrière. Lorsque je tente de saisir le champ de message sur l'objet GetResponse null prospectifs, rien est là:

GetField field = response.getField("message"); < --- retourne null

Qu'est-ce que je fais mal? faire un appel de repos à elasticsearch prouve que le journal existe, mais mon appel Java est erroné.

+0

Pourquoi vous donnez 'type' comme' null' dans votre demande de java dans la ligne 'request.add ("logs-30/04/2017", null, « e72927c2-751c-4b33-86de -44a494abf78f ")'? Vous devriez fournir le type ou '_all'! – avr

+0

@avr L'API permet que ce soit null, https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/action/get/MultiGetRequestBuilder.java#L47, mais je suis retourné et ajouté le type à la commande curl et la commande Java MultiGetRequestBuilder.add et vu le même comportement. Il a travaillé sur l'appel curl et a échoué sur l'appel Java. – Shadoninja

Répondre

0

Le documentation page for the Java multi get ignore complètement la syntaxe supplémentaire requise pour extraire des données au-delà du champ _source. Tout comme l'API REST, faire un multi get avec les informations minimales requises pour localiser un journal obtient des informations très limitées à ce sujet. Pour obtenir des champs spécifiques à partir d'un journal dans un appel multi get via l'API Java, vous devez transmettre un MultiGetRequest.Item au générateur. Cet élément doit avoir les champs que vous souhaitez spécifier avant d'exécuter la demande.

est ici le changement de code (divisé en plusieurs lignes pour plus de clarté) qui se traduit dans les domaines que je veux être présent quand je fais la requête:

MultiGetRequestBuilder request = client.prepareMultiGet(); 
MultiGetRequest.Item item = new MultiGetRequest.Item("logs-2017-04-30", "null", "e72927c2-751c-4b33-86de-44a494abf78f"); 
item.fields("message"); 
request.add(item); 
MultiGetResponse mGetResponse = request.get(); 

Maintenant, je peux demander le champ I spécifié précédemment:

GetField field = response.getField("message");