Python & elasticsearch


(Digitalism) #1

Bonjour à tous :slight_smile:

J'utilise maintenant elasticsearch depuis plusieurs mois maintenant et j'aimerais m'orienter dans la partie API de celui-ci.
Je suis entrain de préparer un développement qui devra aller rechercher les informations présentes dans la base de donnée elasticsearch.
Cependant je reste un peu bloqué avec la documentation et autres sujets présent sur ce forum.

Actuellement dans mon Kibana j'ai créé un tableau qui liste des IP et leurs counts j'aimerais récupérer ces informations en python mais je reste perdu avec l'API :confused:

J'ai réussis a récupérer des informations sur ces IP mais pas comme présenté dans Kibana.

Auriez-vous des liens qui pourront m'aider ? ou des exemples de query similaire ?

Merci d'avance!


(David Pilato) #2

Je ne connais pas l'API Python mais peux-tu commencer par partager une requête typique Kibana que tu aimerais convertir en Python ?


(Digitalism) #3

Bonjour Dadoonet,

Merci pour ton retour j'ai simplement créer un tableau dans un dashboard:
Mais j'aurai besoin de cette même liste et aussi des counts.
désoler d'avoir masqué les IPs mais je ne peux pas les partagées.


(David Pilato) #4

Je ne parle pas d'une vue graphique mais d'une requête type dans Kibana genre:

GET index/_search
{
  "query": {
   // ...
  },
  "aggs": {
    // ...
  }
}

(Digitalism) #5

Je n'ai pas encore fait de query de ce genre ne sachant pac comment cela fonctionne :confused:


(David Pilato) #6

Il y a une possibilité dans Kibana d'afficher la requête qui a été faite.
De mémoire une flèche descendante ou montante sous une visualisation.


(Digitalism) #7

oui effectivement la voici:

{
  "aggs": {
"2": {
  "significant_terms": {
    "field": "origin.keyword",
    "size": 300
  }
}
  },
  "size": 0,
  "_source": {
"excludes": [ ]
  },
  "stored_fields": [
"*"
  ],
  "script_fields": {},
  "docvalue_fields": [
{
  "field": "@timestamp",
  "format": "date_time"
},
{
  "field": "ts",
  "format": "date_time"
}
  ],
  "query": {
"bool": {
  "must": [
    {
      "match_all": {}
    },
    {
      "match_all": {}
    },
    {
      "range": {
        "@timestamp": {
          "gte": 1552922613804,
          "lte": 1552923513804,
          "format": "epoch_millis"
        }
      }
    }
  ],
  "filter": [],
  "should": [],
  "must_not": []
}
  }
}

(David Pilato) #8

Simplifions un peu cela:

{
  "size": 0,
  "query": {
      "range": {
        "@timestamp": {
          "gte": 1552922613804,
          "lte": 1552923513804,
          "format": "epoch_millis"
        }
      }
    }
  },
  "aggs": {
    "2": {
      "significant_terms": {
        "field": "origin.keyword",
        "size": 300
      }
    }
  }
}

Donc, il te faut utiliser _search: https://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.search

Apparement tu peux lui passer un body qui contient ce qu'on vient de définir juste au-dessus.

Je ne m'y connais pas assez en Python mais ça devrait t'aider pour te mettre sur la voie. Regarde ce que tu récupères ensuite comme information. Ca devrait te donner le résultat de l'aggrégation que tu peux afficher comme tu veux ensuite.


(Gabriel Tessier) #9

Bonjour,

Y'a aussi une lib plus haut niveau et plus simple, si t'es pas a l'aise avec les requetes en Json de Kibana.

https://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#queries
:warning: Y'a une note pour ton cas avec le champ @timestamp

Bon courage!


(Digitalism) #10

Ok Super un grand merci pour votre retour je vais essayer de jouer avec ça et voir ce que je peux faire :smiley:
J'espère revenir avec un update pour fournir quelques exemples!

Bonne journée :wink:


(system) closed #11

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.