Elasticsearch: Complétude du client REST Java de haut niveau

Créé le 1 nov. 2017  ·  72Commentaires  ·  Source: elastic/elasticsearch

Il s'agit d'un méta-problème pour suivre l'exhaustivité du client Java REST de haut niveau en termes d'API prise en charge. La liste suivante comprend toutes les API REST qu'Elasticsearch expose à ce jour, et qui sont également exposées par le client de transport. Ceux marqués comme terminés sont déjà pris en charge par le client REST de haut niveau, tandis que les autres doivent être ajoutés. Chaque groupe est trié en fonction d'une estimation de l'importance de l'API, du plus important au moins important. Chaque API se voit également attribuer un rang (facile, moyen, difficile) qui exprime à quel point l'ajout d'une prise en charge devrait être difficile.

L'API répertoriée comme « Non requis » n'aura pas besoin d'être prise en charge avant que le client de transport ne soit supprimé de la branche principale (prochaine version majeure). De telles API sont principalement des API administratives qui ne sont pas susceptibles d'être utilisées à partir d'une application Java. Ils renvoient généralement des réponses lourdes et rendent difficile la réutilisation des objets de réponse du client de transport car ils exposent des objets internes qui, dans certains cas, ne peuvent même pas être analysés entièrement sur la base des informations renvoyées à REST. Nous avons envisagé de les renvoyer sous forme de cartes de cartes, mais cela est également facile à réaliser en utilisant le client REST de bas niveau, nous avons donc décidé de ne pas les implémenter pour le moment.

API de haut niveau

  • [x] ping ( facile )
  • [x] info ( facile )
  • indice [x] ( moyen )
  • [x] mise à jour ( moyen )
  • [x] supprimer ( moyen )
  • [x] en vrac ( dur )
  • [x] obtenir ( moyen )
  • [x] existe ( facile )
  • [x] multi-get ( moyen ) #27337
  • [x] recherche ( très difficile )
  • [x] recherche par défilement ( facile )
  • [x] effacer le défilement ( facile )
  • [x] recherche multiple ( difficile ) #27274
  • [x] mise à jour par requête ( support ) @sohaibiftikhar
  • [x] supprimer par requête ( support ) @sohaibiftikhar
  • [x] réindexation ( moyenne ) @sohaibiftikhar
  • [] réindexer avec wait_for_completion=false crée la tâche @pgomulka
  • [x] réétranglement (réindexation, mise à jour par requête, suppression par requête) https://github.com/elastic/elasticsearch/pull/33951
  • [x] modèle de recherche ( moyen ) https://github.com/elastic/elasticsearch/pull/30473
  • [x] rendu du modèle de recherche ( facile ) (inclus dans l'API du modèle de recherche) #30473
  • [x] modèles de recherche multiples ( moyen ) #30836
  • [x] vecteurs de termes ( dur ) #33447
  • [x] vecteurs multi-termes ( dur ) @mayya-sharipova #35266
  • [x] expliquer ( moyen ) #31387
  • [x] majuscules de champ ( facile ) #29664
  • [x] mettre le script stocké ( facile ) #31323
  • [x] supprimer le script stocké ( facile ) #31355
  • [x] obtenir le script stocké ( support ) #31355

API d'indices

  • [x] créer un index ( facile )
  • [x] supprimer l'index ( facile )
  • [x] indices existent ( facile ) #27384
  • [x] mettre à jour l'alias ( moyen ) #27876
  • [x] existe alias ( facile ) #28332
  • [x] obtient l'alias ( moyen ) #28799
  • [ ] types existent ( facile )
  • [x] mettre le mappage ( facile ) #27869
  • [x] ouvrir l'index ( facile )
  • [x] fermer l'index ( facile )
  • [x] rafraîchir ( facile ) #27799
  • [x] flush ( facile ) #28852
  • [x] mettre à jour les paramètres d'index ( facile ) #28892
  • [x] obtenir les paramètres d'index ( facile ) #29229
  • [x] vider le cache ( facile ) #28866
  • [x] forcer la fusion ( facile ) #28896
  • [x] rétrécir ( facile ) #28425
  • [x] divisé ( facile ) #28425
  • [x] renversement ( facile ) #28698
  • [x] flush synchronisé ( moyen ) (expose ShardRouting, difficile de reconstruire l'intégralité de la réponse à partir des informations renvoyées via REST) ​​# 30650
  • [x] obtenir l'index ( moyen ) #31703
  • [x] obtenir des mappages ( facile ) #30889
  • [x] obtenir des mappages de champs ( moyen ) #31423
  • [x] mettre le modèle d'index ( moyen ) #30400
  • [x] supprimer le modèle d'index ( facile ) #36320
  • [x] obtenir des modèles d'index ( moyen ) #31161
  • [x] valider la requête ( moyen ) #31077
  • [x] analyser ( dur ) #31577

Non requis

  • magasins de fragments ( moyen )
  • mise à niveau ( facile ) (à supprimer ?)
  • statut de mise à niveau ( facile ) (à supprimer ?)
  • segments ( dur ) (expose ShardRouting)
  • récupérations ( dur ) (expose ShardRouting, DiscoveryNode)
  • index stats ( dur ) (expose ShardRouting et beaucoup d'autres objets)

API d'instantané

  • [x] obtenir les référentiels #30362
  • [x] créer le référentiel #30501
  • [x] vérifier le référentiel #30934
  • [x] supprimer le référentiel #30666
  • [x] créer un instantané ( moyen ) #31215
  • [x] état des instantanés ( moyen ) #31515
  • [x] obtenir des instantanés ( moyen ) #31537
  • [x] supprimer l'instantané ( facile ) #31393
  • [x] restaurer l'instantané ( moyen ) #32155

Ingérer l'API

  • [x] mettre le pipeline d'ingestion ( facile ) #30793
  • [x] supprimer le pipeline d'ingestion ( facile ) #30865
  • [x] obtenir le pipeline d'ingestion ( facile ) #30847
  • [x] simuler le pipeline d'ingestion ( moyen ) #31158

API de tâches

  • [x] liste des tâches ( moyen ) #29546
  • [x] obtenir la tâche ( moyen ) #35166
  • [x] annuler la tâche ( facile ) #30745

API de cluster

  • [x] intégrité du cluster ( moyen ) #29331
  • [x] mettre à jour les paramètres du cluster ( facile ) #28633
  • [x] obtenir les paramètres du cluster ( moyen ) #31706 (n'a pas son propre objet Response, exposé au REST uniquement)

Non requis

  • rechercher des fragments ( moyen ) (expose ShardRouting, DiscoveryNode et nécessite l'analyse de QueryBuilder)
  • tâches de cluster en attente ( facile )
  • allocation expliquer ( difficile ) (expose ShardRouting)
  • état du cluster ( dur ) (expose ClusterState)
  • reroute ( facile si fait après l'API d'état du cluster, renvoie l'état du cluster entier)
  • nodes info ( hard ) (expose DiscoveryNode et beaucoup d'autres objets)
  • stats des nœuds ( difficile ) (expose ShardRouting et beaucoup d'autres objets)
  • statistiques du cluster ( difficile ) (expose DiscoveryNode, nécessite des informations sur les nœuds et des statistiques sur les nœuds)
  • fils chauds ( facile ) (expose DiscoveryNode)
  • utilisation des nœuds ( moyen ) (expose DiscoveryNode)

API REST uniquement

Il existe un certain nombre d'API qui sont exposées via REST mais pas via le client de transport. Ils ne doivent pas nécessairement être implémentés si l'objectif est la parité des fonctionnalités avec le client de transport, mais nous devrions probablement examiner pourquoi ils n'ont pas été ajoutés au client de transport et s'il est logique d'ajouter leur support au client élevé. niveau Client REST ou non. Je ne pense pas qu'il soit logique d'ajouter la prise en charge de l'API cat et de l'ingestion du processeur grok, c'est pourquoi je les ai déjà retirés.

  • [ ] infos à distance du cluster
  • [x] compte #31868
  • [ ] obtenir la source
  • [x] la source existe https://github.com/elastic/elasticsearch/pull/34519
  • [ ] supprimer l'alias
  • Le modèle d'indices [x] existe @andyb-elastic (#36132)
  • [ ] Obtenir une mise à niveau
  • ingérer le processeur grok
  • API cat : alias, allocation, nombre, données de terrain, santé, aide, indices, maître, nodeattrs, nœuds, tâches en attente, plugins, récupération, référentiels, segments, fragments, instantanés, tâches, modèles, threadpool

Comment ajouter la prise en charge d'une nouvelle API

Regardez certaines des API déjà prises en charge et des PR existants qui ont été fusionnés :

  • Ajouter l'API d'index au client de repos de haut niveau (#23040)
  • Ajout de la prise en charge de BulkRequest au client High Level Rest (#23312)
  • Ajouter l'API de suppression au client de repos de haut niveau (#23187)
  • Ajout du support UpdateRequest au client High Level Rest (#23266)
  • Ajout de la prise en charge de la suppression d'index au client REST de haut niveau (#27019)

Les tâches communes à chacun des PR ci-dessus sont :

  • ajoutez la méthode fromXContent à la classe de réponse existante actuellement utilisée par le client de transport et les tests unitaires correspondants qui utilisent le brassage de champs ainsi que l'insertion de champs aléatoires (afin de tester la compatibilité ascendante). Cela signifie généralement ajouter un test pour l'objet de réponse qui étend AbstractXContentTestCasesupportsUnknownFields() renvoie true ainsi que assertToXContentEquivalence . Il existe des cas où nous ne pouvons pas insérer des champs aléatoires partout, ce qui nécessite alors de remplacer également la méthode getRandomFieldsExcludeFilter() qui renvoie le chemin qui doit être exclu lors de l'injection de champs aléatoires. Compte tenu des randomisations appliquées, il est logique d'exécuter ce type de test localement avec l'argument -Dtests.iters=50 juste pour s'assurer qu'il est toujours vert.
  • ajouter une nouvelle méthode à la classe Request qui traduit la demande d'entrée dans la représentation de la demande REST interne qui contient la méthode, l'url, le point de terminaison, les paramètres, etc. et ajouter les tests correspondants à RequestTests
  • ajoutez une nouvelle méthode à RestHighLevelClient , peut-être aussi sa variante asynchrone lorsque cela a du sens, nous ne voudrions peut-être pas ajouter de variantes asynchrones à chaque méthode, nous décidons donc au cas par cas. Le nom de la nouvelle méthode doit correspondre à ce qui est défini dans notre spécification REST, y compris l'espace de noms.
  • ajoutez un test d'intégration qui étend ESRestHighLevelClientTestCase qui teste la nouvelle méthode de bout en bout en envoyant des requêtes REST à un cluster externe.
  • ajouter une page de documentation. Pour vérifier comment les documents sont rendus et si les liens entre les pages de documents et les extraits de documents fonctionnent correctement, exécutez la commande suivante à partir de la racine de votre extraction locale du référentiel Elasticsearch : /path/to/elastic/docs/build_docs.pl --doc docs/java-rest/index.asciidoc --chunk 1 --out ~/temp/asciidoc --open . Cela nécessite également une extraction locale du référentiel docs , où se trouve le script perl.

Liens #29827

:CorFeatureJava High Level REST Client Meta Pretty Bloody Important

Commentaire le plus utile

Salut, il serait très utile d'avoir 'mise à jour par requête' exposé dans le nouveau client.

Merci!

Tous les 72 commentaires

J'ai mis à jour la description du problème en attribuant à chaque API un rang de 1 à 3 en fonction de la difficulté d'ajouter sa prise en charge au client REST de haut niveau. Les critères étaient principalement la taille de la demande à sérialiser et la taille de la réponse à analyser.

merci @javanna - J'ai séparé les API en listes « importants » et « facultatifs », où les API facultatives sont celles qui seront rarement utilisées à partir d’applications autres que les applications de surveillance ou les tests. Si quelqu'un n'est pas d'accord avec ma sélection, n'hésitez pas à mentionner quelles API doivent être marquées comme importantes.

Je n'utilise pas encore le client REST de haut niveau, mais je me serais vraiment attendu à ce que le multi-get soit pris en charge.

@javanna C'est peut-être une question stupide, mais : de quelle manière quelqu'un récupère-t-il une API et commence-t-il à travailler dessus ? Sans risquer que quelqu'un fasse de même. : )

@javanna C'est peut-être une question stupide, mais : de quelle manière quelqu'un récupère-t-il une API et commence-t-il à travailler dessus ? Sans risquer que quelqu'un fasse de même. : )

Vous ajoutez ici un commentaire disant que vous y travaillez.

Merci @nik9000 !

J'ai choisi Créer un index.

J'ai ramassé "les indices existent".

Pour les questions liées au code (comment exécuter un test, quels tests sont (non) nécessaires, avons-nous besoin de la version asynchrone d'une méthode, etc.) est-ce que je pose ici, dans un numéro séparé ou sur les forums ? Ou autre chose? : )

salut @hariso, cela dépend de la question :) Il est probablement préférable d'ouvrir un PR même s'il s'agit d'un travail en cours, afin que nous puissions y discuter de vos questions. Cela marcherait-il pour toi?

Ce serait certainement le cas. Merci d'avoir répondu!

Salut, il serait très utile d'avoir 'mise à jour par requête' exposé dans le nouveau client.

Merci!

analyser (main) !

Salut,
Aurons-nous la fonctionnalité « Liste d'indices » dans le client de repos de haut niveau ? Je pense qu'il s'agit d'une API utile et importante pour de nombreuses tâches d'exploitation de cluster ES.

En plus de cela, si je recherche une API pour vérifier la taille des fragments d'un index, l'API "indices stats" est-elle conçue pour couvrir ce besoin ?

Actuellement, je travaille sur un outil de gestion de cluster et je recherche un client java rest "cross-version" pour ES. S'il n'y a pas de meilleur choix, je peux peut-être aider à contribuer ces fonctionnalités au client de haut niveau :)

À mon avis, il y a un défaut majeur dans le client de repos de haut niveau actuel. Toutes les méthodes qui exécutent les requêtes sont marquées comme finales. Cela crée un problème lorsque vous essayez de vous moquer du RestHighLevelClient. Peut-être qu'une interface pourrait être définie que le RestHighLevelClient peut implémenter ?

@sowelie Cela pourrait vous donner plus d'informations : #27238. J'utilise Mockito et je n'ai eu aucun problème à me moquer de RestHighLevelClient, même si j'ai eu un problème avec IndicesClient.

@hariso J'ai fini par créer une interface pour les méthodes dont j'avais besoin et sous-classer RestHighLevelClient. Cependant, je suppose qu'il existe une extension à mockito qui peut être utilisée pour se moquer des classes / méthodes finales. Le pull que vous avez référencé n'explique pas pourquoi les méthodes doivent être définitives. Savez-vous pourquoi c'est?

@sowelie certaines méthodes ont été rendues définitives car elles ne sont pas destinées à être sous- RestHighLevelClient n'est pas définitif car il peut être étendu en y ajoutant de nouvelles méthodes (pensez à ajouter la prise en charge des plugins qui ajoutent des points de terminaison personnalisés à Elasticsearch). De telles méthodes personnalisées peuvent utiliser les méthodes protégées internes perform* existantes qui sont le cœur de la classe elle-même. Nous ne voulons pas que le noyau de cette classe soit également potentiellement réécrit par des sous-classes. Pour moi, un gros défaut aurait été l'inverse, d'avoir des méthodes non définitives sans raison claire.

Je vous entends cependant sur les questions de moquerie et j'aimerais comprendre ce que vous faites différemment par rapport à ce que fait

search_after support de
Toutes nos excuses si un nouveau problème est le meilleur endroit pour les demandes.

@halfninja pour autant que je search_after est déjà pris en charge dans le cadre de l'API de recherche. Est-ce que j'ai raté quelque chose ?

@javanna Vous avez tout à fait raison, je l'ai trouvé maintenant et je ne sais pas comment je l'ai raté auparavant. Merci.

Je voudrais savoir si les API dont la case est cochée sont déjà implémentées ?

@akj "Ceux marqués comme terminés sont déjà pris en charge par le client REST de haut niveau, tandis que les autres doivent être ajoutés."

Salut tout le monde,
juste une petite question : l'UpdateSettingsRequest n'est-il pas censé implémenter également ToXContentObject, en plus de IndicesRequest.Replaceable ?

@javanna La liste des fonctionnalités à prendre en charge par le HLRC contient également ceci :

  • mise à niveau (facile)
  • statut de mise à niveau (facile)
    Cependant, la doc mentionne ceci :

L'API _upgrade n'est plus utile et sera supprimée. À la place, consultez Réindexer avant la mise à niveau.

La question est, les voulons-nous toujours et ils sont à gagner, ou dois-je chercher du travail ailleurs ? : RÉ

bon point @hariso , je vais déplacer ces deux API, je ne pense pas que nous devrions les implémenter pour le moment.

J'ai récupéré Cluster Health. Si quelqu'un d'autre travaille déjà dessus, veuillez m'en informer.

Je prends "mise à jour par requête".

La mise à jour par requête, la réindexation et la suppression par requête m'inquiètent car elles sont assez "étranges" dans leur façon de fonctionner. Je les ai écrits comme ça parce que ça avait du sens à l'époque mais je n'aime vraiment pas ça maintenant. Je suis d'accord pour les déplacer tels quels, mais j'aimerais les retravailler pour qu'ils soient moins déroutants un jour.

J'ai à peine commencé le travail, donc si vous (et @javanna je suppose) pensez que nous devrions le reporter, je peux prendre autre chose.

J'ai à peine commencé le travail, donc si vous (et @javanna je suppose) pensez que nous devrions le reporter, je peux prendre autre chose.

Nan, je ne pense pas que ça vaille la peine de retarder son intégration pour le retravailler. Je pense qu'il serait peut-être bien qu'il soit déjà intégré avant de le retravailler pour être honnête. Comprenez juste que c'est un peu bizarre. Beaucoup bizarre.

Je prends l'API Cluster : lister les tâches et obtenir la tâche, car elles utilisent le même objet de requête.

@javanna @nik9000 Je suis confus en ce moment. ListTasksRequest et GetTaskRequest peuvent tous deux demander une tâche spécifique par identifiant. Mais dans le point de terminaison REST, ListTasksRequest ne peut pas être utilisé à cette fin. En avons-nous besoin pour prendre en charge la compatibilité descendante avec le client de transport et permettre à ListTasksRequest d'être utilisé pour la tâche par identifiant ou mieux ajouter une validation qui l'empêchera ?
Je peux créer presque zéro changement de relations publiques pour cette discussion si nécessaire.

En avons-nous besoin pour prendre en charge la compatibilité descendante avec le client de transport et permettre à ListTasksRequest d'être utilisé pour la tâche par identifiant ou mieux ajouter une validation qui l'empêchera ?

@Van0SS Je ne le permettrais pas, sinon, dans certains cas, nous

Retour sur la migration d'un client 2.x vers 6.x. La seule chose qui ne s'est pas bien passée, ce sont les éléments du modèle admin().indices() et un étrange admin().validate().
Je ne sais pas si c'est destiné à voter, mais si c'est le cas, je voterais pour les fonctions du modèle ;)

merci pour vos retours @CodingFabian

Je vais chercher NodesInfo car il semble que ce soit la dernière des API importantes qui n'a pas été revendiquée.

@tvernum J'ai mis mon nom dessus (NodesInfo) hier et j'ai commencé une bonne quantité de travail dessus, il y avait déjà mon nom dessus mais je pense que vous n'avez peut-être pas rafraîchi parce que vous avez écrasé mon travail dessus

@dnhatn @jtibshirani (et autres)
Pouvez-vous vous assurer d'actualiser la page avant de modifier la description - il semble que la réclamation de NodesInfo ait à nouveau été perdue (comme la mienne) et d'après l'historique des modifications, il semblerait que l'un des vous l'avez peut-être fait accidentellement.

Attention : j'ai mis à jour la description de ce problème et réorganisé la liste des API en fonction des discussions récentes.

Je n'ai pas pu mapper l'API de repos de haut niveau avec Filter Query , quelqu'un peut-il m'indiquer la bonne direction.

@hth, veuillez poser vos questions sur nos forums à l' adresse https://discuss.elastic.co/

Salut, je travaille sur expliquer l'api car il n'est pas encore récupéré, je poste ici juste pour éviter les doublons.

merci de nous avoir fait savoir @PnPie et surtout d'avoir pris une autre API ! dans l'attente de votre RP.

Bonjour, Il semble que put stored script n'ait pas encore été choisi. Puis-je essayer de travailler sur cette API ?

bien sûr @johnny94 vas-y !

Salut @javanna
y a-t-il un accord pour ajouter un support pour le document _count ? Si c'est le cas, je peux travailler dessus.

@mrdjen Je pense que ce serait bien que @mrdjen se sente libre d'aller de l'avant et de le prendre. Ce serait un peu différent par rapport à d'autres API pour lesquelles nous avons déjà ajouté la prise en charge car elle n'a pas d'objets de demande et de réponse dans le code côté serveur, nous devons donc les ajouter directement au client.

Salut @nik9000 @hariso Je lisais la conversation sur le cas de "mise à jour par requête" de mars, avez-vous des nouvelles à ce sujet ? Cet ajout est-il toujours sur la table ou a-t-il été rejeté ? Je viens de réaliser que cela ne fait pas partie du client de haut niveau, quelle est votre suggestion pour trouver une solution de contournement pour cette API ? Je pense que je vais devoir utiliser le TransportClient à la place. Merci!

Salut @nik9000 @hariso Je lisais la conversation sur le cas de "mise à jour par requête" de mars, avez-vous des nouvelles à ce sujet ? Cet ajout est-il toujours sur la table ou a-t-il été rejeté ? Je viens de réaliser que cela ne fait pas partie du client de haut niveau, quelle est votre suggestion pour trouver une solution de contournement pour cette API ? Je pense que je vais devoir utiliser le TransportClient à la place. Merci!

Je fais! @sohaibiftikhar a commencé à envisager de mettre en œuvre la réindexation, la mise à jour par requête et la suppression par requête. Ils viennent en quelque sorte comme un paquet.

Personnellement, j'utiliserais le client de repos de bas niveau pour contourner le client de haut niveau qui ne prend pas en charge la mise à jour par requête pour le moment. Cela continuera à fonctionner pendant longtemps. Le client du transport mourra un jour. En outre, il est assez complexe de conserver un client de transport uniquement pour une ou deux API et d'utiliser REST pour les autres.

@sescotti @nik9000 Malheureusement, je n'ai pas encore eu le temps d'examiner la mise à jour par requête. : /

salut, @javanna
dans mon travail lorsque j'utilise ce client, j'ai rencontré quelques difficultés, je veux le journal de la réponse du serveur es, juste le journal dans le code ci-dessous, je veux qu'il supporte MDC. mais je ne trouve pas le chemin.

est dans le org.elasticsearch.client.RestClient

    private void performRequestAsync(final long startTime, final HostTuple<Iterator<HttpHost>> hostTuple, final HttpRequestBase request,
                                     final Set<Integer> ignoreErrorCodes,
                                     final HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory,
                                     final FailureTrackingResponseListener listener) {
        final HttpHost host = hostTuple.hosts.next();
       ...
        client.execute(requestProducer, asyncResponseConsumer, context, new FutureCallback<HttpResponse>() {
            <strong i="9">@Override</strong>
            public void completed(HttpResponse httpResponse) {
                try {
                    RequestLogger.logResponse(logger, request, host, httpResponse);//   i want the log of this  with MDC 
                 ........
                } catch(Exception e) {
                    listener.onDefinitiveFailure(e);
                }
            }

j'utilise slf4j + logback et je veux que le code comme celui-ci prenne en charge slf4-MDC

  String sessionId = MDC.get("SessionId");//get sessionID from current thread 
  client.execute(requestProducer, asyncResponseConsumer, context, new FutureCallback<HttpResponse>() {
            <strong i="13">@Override</strong>
            public void completed(HttpResponse httpResponse) {
                try {
                  MDC.put("SessionId", sessionId);  // put the sessionId to the thread-pool thread so that logback logger can find it .
                    RequestLogger.logResponse(logger, request, host, httpResponse);//   i want the log of this  with MDC 
                 ........
                } catch(Exception e) {
                    listener.onDefinitiveFailure(e);
                }
            }

la façon dont j'utilise le client

créer:

    <strong i="18">@Bean</strong>
    public RestHighLevelClient esOriginClient() {
        List<String> hostList = Arrays.asList(host.split(","));
        HttpHost[] httpHosts = new HttpHost[hostList.size()];
        for (int i = 0; i < hostList.size(); i++) {
            httpHosts[i] = new HttpHost(hostList.get(i), port, "http");
        }
        RestClientBuilder builder = RestClient.builder(httpHosts);
        return new RestHighLevelClient(builder);
    }


utilisation:

 SearchResponse searchResponse = client.search(request);

juste la méthode dans org.elasticsearch.client.RestHighLevelClient

  public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException {
        return performRequestAndParseEntity(searchRequest, Request::search, SearchResponse::fromXContent, emptySet(), headers);
    }

la façon dont j'ai essayé de soutenir mdc

  1. myRestClient étend RestClient mais je trouve que le RestClient ne peut pas être étendu car le constructeur n'est pas public
  2. J'essaie d'étendre org.elasticsearch.client.RequestLogger mais je trouve que c'est final et que la méthode est également statique.

donc je veux y a-t-il un moyen de m'aider? Désolée de vous déranger .

Salut @chenchuangc ! J'ai répondu au nouveau problème que vous avez déposé.

salut @nik9000 @hariso , je l'ai finalement trié à l'aide d'une recherche par défilement et d'une mise à jour en masse (après avoir essayé d'utiliser la mise à jour par requête, j'ai découvert qu'il n'était pas possible d'envoyer des mises à jour partielles, ce qui est mon exigence ici). Merci quand même!

Le client de haut niveau REST ne peut pas être utilisé par bulkprocessor, veuillez ajouter cette api

@iamazy BulkProcessor est pris en charge, voir https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-bulk.html#java -rest-high-document -bulk-processor .

ajouterait-il l'API bucket_script ?

@javanna J'avais essayé le client au repos de haut niveau avec bulkprocessor, mais j'ai eu quelques erreurs, le client est l'instance de TransportClient et non l'instance du client de haut niveau-reste, existe-t-il une autre classe nommée bulkprocessor ?

@iamazy les documents que j'ai liés ci-dessus sont pour le client REST de haut niveau. La classe BulkProcessor reste la même, mais elle accepte une fonction comme argument qui identifie la méthode client en bloc à appeler. Je soupçonne que vous utilisez une ancienne version si vous ne voyez pas la même chose.

@javanna Savez-vous quelle version d'Elasticsearch ciblez DeleteByQuery et UpdateByQuery ? Je vois que ces API sont déjà implémentées sur un dev fork et que la demande de révision est en attente de fusion. Avez-vous un échéancier quant au moment où ces API feront partie du client officiel Elastisearch High REST et de quelle version ?

Des projets de portage sur DeleteByQueryRequestBuilder ?

J'ai commencé à regarder "get task" (êtes-vous allé quelque part avec ce
Un point d'incertitude est la politique générale de HLRC pour la traduction des GET /foo 404 en langage Java. Les options sont :
1) getFoo lève une exception
2) getFoo renvoie null
3) getFoo renvoie un objet FooResponse qui a une propriété "isExists()" pour dire s'il est rempli

L'option 3 semble un peu étrange aux développeurs Java, mais je vois que c'est ce que nous faisons pour les documents avec la classe GetResponse.java.

@markharwood pas grand chose, vous pouvez assumer cette tâche, @javanna pourriez-vous me retirer s'il vous plaît de la liste assignée ? Désolé si j'ai demandé à quelqu'un de commencer à travailler dessus.

Un point d'incertitude est la politique générale de HLRC pour la traduction des GET /foo 404 en langage Java.

Oui. Je ne sais pas quelle est la bonne méthode, mais je ne pense pas que isExists() soit.

Mes 2 cents : en tant qu'utilisateur de la bibliothèque cliente, je préfère ne pas avoir à détecter une exception pour une situation telle qu'une entité introuvable. Ce n'est pas vraiment une situation exceptionnelle, rien d'extraordinaire. Devoir essayer-attraper pour gérer une telle situation rend le code client plus laid que nécessaire. D'un autre côté, de nombreux pilotes de base de données renvoient simplement une valeur null ou une option facultative lorsque rien n'est trouvé.

im ++ pour ne pas lancer d'exceptions aussi. J'ai fait un échantillonnage aléatoire de 4 choses qui lancent des 404 sur le serveur s'ils ne sont pas trouvés, et les résultats sont presque tous qu'ils ont une méthode "existe" de quelque sorte. L'alias est juste un peu différent en raison de son API. Je suis sûr qu'il y a des cas où nous levons une exception, mais il semble que nous ne devrions pas le faire.

Il existe un concept de StatusToXContentObject qui renvoie un RestStatus au consommateur. Nous n'avons actuellement aucune norme sur « quel était le statut de l'appel que j'ai passé » dans la base de code, il pourrait donc être judicieux d'en ajouter une. Je tiens à ajouter quelque chose aux réponses pour cela. Nous avons environ 15 réponses qui sont des StatusToXContentObject , et le volume/index en fait partie. Ceux-ci reposent toujours sur 1) le statut enregistré dans les réponses, ou 2) un booléen utilisé pour dire si c'est OK ou NOT_FOUND. Ce dernier est la façon dont get pipelines le fait. Le premier est ce qui est stocké dans la réponse get aliases.

Je n'aime pas la réponse nulle. Je préférerais que quelqu'un fasse un if (vérification du statut) par rapport à if (vérification nulle), mais cela pourrait être à cause de mes jours de scala. Je pense qu'un facultatif fonctionnerait également si nous voulons devenir un peu fonctionnels, comme le mentionne @hariso :)

Mon .02 serait d'avoir soit un moyen de dire "isFound" tel que traduit par un code d'état interne, ou simplement d'enregistrer le code d'état du reste en interne et de laisser l'utilisateur raisonner à ce sujet. Le premier garantit que nous pouvons dire "Eh bien, ce code de statut non 200 est en fait" ok "", mais je ne sais pas si nous avons une raison pour cela. ce dernier donne à l'utilisateur la souplesse et le pied pistolet. Je serais également très bien avec un facultatif.

Les méthodes que j'ai vérifiées

Alias - getAlias has a getException() which is validated against if there are any exceptions in the call.
Pipelines - get pipeline response is a StatusToXContentObject
Get - 404 if index not found, isExists (which is a bool set on the GetResult nested in the response set by ShardService) if doc not found
Delete watch - isFound, which is set directly by the transport action

@hub-cap Un de plus pour la liste - l'API Explain utilise également l'approche "isExists".

Cela semble être l'endroit où le choix de conception "isExists ou exception" est forcé. Le paramètre ignores peut être utilisé pour déclarer que 404 codes d'état sont à prévoir, mais la logique de cette méthode d'assistance utilise la même méthode responseConvertor.apply pour analyser à la fois les réponses saines et les codes d'erreur "ignorés" - le même type d'objet de réponse est renvoyé. Cela nous oriente vers l'utilisation d'un objet "FooResponse" avec une propriété "isExists" quelconque.
L'utilisation alternative de cette méthode consiste à appeler sans lister les 404 dans le paramètre ignores , auquel cas une exception plus générique est levée (ElasticsearchStatusException avec le statut =404).

Peut-être une autre "convention Java" générale à considérer @hub-cap.

Comment mapper les API REST de style wait_for_completion=false potentiellement de longue durée à notre notion d'appels Java sync et asynchrones ?

J'ai appuyé sur ceci en essayant de trouver une tâche de longue durée qui pourrait être utilisée dans mes tests getTask . Il semble que le reindex HLRC ait été écrit sans aucun support pour renvoyer les ID de tâche. Cela signifie que reindex et getTask ne peuvent pratiquement pas être utilisés ensemble dans HLRC. Reindex doit trouver un moyen d'offrir davantage de fonctionnalités asynchrones.
Lors de discussions avec @pgomulka, nous avons proposé cette convention générale candidate pour mapper les API REST asynchrones sur Java :

  • Foo syncFoo(...) et void asyncFoo(..., listener) correspondraient aux appels REST _sans_ wait_for_completion params (la majorité de nos API existantes)
  • FooTask submitFooTask(...) correspondrait aux équivalents REST avec wait_for_completion défini sur false. C'est un appel synchrone à une API REST avec des fonctionnalités asynchrones.

Est-ce que ça a du sens? Cela s'applique probablement à plus de reindex

@markharwood Je pense que, comme mentionné ci-dessus, je ne pense pas que le lancement d'exceptions soit la voie à suivre, donc je ne pense pas que nous devrions le supprimer de ignores . Juste pour réitérer le travail que j'ai vu dans votre autre critique, #35166, je pense que l'utilisation de Optional fonctionne bien ici.

De plus, je suis d'accord avec @pgomulka et votre évaluation de sync/async/submit, :shipit:

La mise à jour d'elastic vers 5.x à partir de 2.x nécessite que la sécurité du bouclier soit remplacée par la sécurité x-pack et le client de transport java avec le client java Rest-High-Level/Low-Level-Client.
Où puis-je trouver les informations sur l'utilisation de xpack avec le client de repos java Elasticsearch pour la version 5.6.2 et si aucune de ces informations n'est présente, comment puis-je le faire ? Aide svp :)

@utkarsh4G Pourriez-vous s'il vous plaît poser cette question sur notre forum de discussion
Elastic utilise les problèmes GitHub pour suivre les travaux à entreprendre, tels que les bogues et les demandes de fonctionnalités, et nous utilisons les forums pour des questions telles que les vôtres.

Clôture en faveur du #47679

Je plaisante, je ferme en faveur de #47678

Cette page vous a été utile?
0 / 5 - 0 notes