# Script python elasticsearch

**URL:** <https://discuss.elastic.co/t/script-python-elasticsearch/136634>\
**Category:** Discussions en français\
**Created:** [June 20, 2018, 8:11am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634 "2018-06-20T08:11:20Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![benzaq](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@benzaq](https://discuss.elastic.co/u/benzaq)\
**Post date:** [June 20, 2018, 8:11am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/1 "2018-06-20T08:11:20Z")

</div>

bonjour,

je suis entrain de crée un script en python pour récupérer de la base ES des nom et les IPs qui sont associé au nom,ainsi que le timestamp , le tous trié .  
Le probleme est que je n'arrive pas a faire une requette adapté.  
tous aide sera la bienvenue  
merci.

voici mon code à ce jour

```
from elasticsearch import Elasticsearch
import json
es = Elasticsearch(['xxx.xxx.xxx.xxx:9200'])
res = es.search(
index='test',search_type='count',

body={ "filter": {
        "bool": {
          "must": {
            "range": {
              "timestamp": {
                "from": "2018-05-01 09:00:51.553",
                "to": "2018-06-15 09:00:51.553",
                "include_lower": "true",
                "include_upper": "true"
              }
            }
          }
        }
        },
        "aggs":{
                "all_accountname":{
                                "terms": {
                                        "field": "AccountName",
                                        }
                                },
                                "all_ip":{
                                        "terms": {
                                                 "field": "server_ip",
                                                }
                                        }
                                },
                                "sort": [
                                         {"timestamp": { "order": "desc" }
                                        }
                                        ]
                                }
)
print(res)
for i in res['aggregations']['all_accountname']['buckets']:
        for z in res ['aggregations']['all_ip']['buckets']:
                print ('noms des comptes', i['key'],'voici mon adresse',z['key'])
```

---

<div class="post-metadata">

**Author:** ![gabriel\_tessier](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/gabriel_tessier/32/27911_2.png) [@gabriel\_tessier](https://discuss.elastic.co/u/gabriel_tessier)\
**Post date:** [June 21, 2018, 5:55am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/2 "2018-06-21T05:55:47Z")

</div>

Bonjour,

Est-ce que tu peux donner plus de details, comme un exemple de données et le résultat retourné.  
Et aussi formatter ton message:

```
from elasticsearch import ElasticSearch
...

```

Pour l'instant ce que je peux voir c'est que t'as 2 aggregations distincts qui retournent chacune le top 10 de tes terms.

Si tu veux la valeur de server\_ip de ton AccountName faut que t'imbriques tes aggregations.

---

<div class="post-metadata">

**Author:** ![benzaq](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@benzaq](https://discuss.elastic.co/u/benzaq)\
**Post date:** [June 21, 2018, 8:04am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/3 "2018-06-21T08:04:13Z")

</div>

bonjour,

merci de votre retour

2 aggregations distincte c'est pas quand je defini 2 fois "aggs"?

ci joint une capture de mon rendu.

---

<div class="post-metadata">

**Author:** ![gabriel\_tessier](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/gabriel_tessier/32/27911_2.png) [@gabriel\_tessier](https://discuss.elastic.co/u/gabriel_tessier)\
**Post date:** [June 21, 2018, 11:25am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/4 "2018-06-21T11:25:35Z")

</div>

yep autant pour moi... avec le formattage c'est tout de suite plus lisible 😁

Si tu peux mettre un example de données, sur lequel tu requetes ca me permettrai de faire un test en local.

---

<div class="post-metadata">

**Author:** ![benzaq](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@benzaq](https://discuss.elastic.co/u/benzaq)\
**Post date:** [June 21, 2018, 11:44am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/5 "2018-06-21T11:44:40Z")

</div>

tous est dans dans le script je peux pas partager la base!

as-tu une idée a me conseiller?

j'ai peux être une idée mais je ne serai pas le faire, c'est de parser en python afin de récupérer les données associé.

mais je préférerais le faire avec une requête ES

---

<div class="post-metadata">

**Author:** ![gabriel\_tessier](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/gabriel_tessier/32/27911_2.png) [@gabriel\_tessier](https://discuss.elastic.co/u/gabriel_tessier)\
**Post date:** [June 22, 2018, 5:11am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/6 "2018-06-22T05:11:49Z")

</div>

Il y'a bien un probleme d'imbrication dans ta requete, tu peux essayer avec ca?

```
{
  "aggs": {
    "all_accountname": {
      "terms": {
        "field": "AccountName"
      },
      "aggs": {
       "all_ip": {
      "terms": {
        "field": "server_ip"
      }
    } 
      } 
  }}, "size": 0
}

```

Remarque l'aggregations all\_ip est dans l'accolade "all\_accountname".

En local j'ai essaye de construire des donnees et j'ai le resultat suivant:

```
"aggregations": {
    "all_accountname": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Banana4",
          "doc_count": 2,
          "all_ip": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "-",
                "doc_count": 1
              },
              {
                "key": "10.0.0.1",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key": "Banana",
          "doc_count": 1,
          "all_ip": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "-",
                "doc_count": 1
              }
            ]
          }
        }
     ...

```

Pour le compre Banana4, j'ai l'ip - et 127.0.0.1

Pour info la structure des mes documents:

```
POST mon_index/doc
{
  "AccountName": "Banana4",
  "server_ip": "-",
  "timestamp": "2018-06-05 13:22:22"
}
```

---

<div class="post-metadata">

**Author:** ![benzaq](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@benzaq](https://discuss.elastic.co/u/benzaq)\
**Post date:** [June 22, 2018, 8:30am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/7 "2018-06-22T08:30:41Z")

</div>

bonjour merci de votre retour,

j'ai essaye ce que vous avez envoyé mais en vain je n'ai aucune ip qui ressort.  
ci joint mon code ainsi que le résultat.

```
indent preformatted text by 4 spaces
 from elasticsearch import Elasticsearch
 import json
es = Elasticsearch(['xxx.xxxx.xxxx.xxxx:9200'])
res = es.search(
index='test',search_type='count',

body={ "filter": {
    "bool": {
      "must": {
        "range": {
          "timestamp": {
            "from": "2018-05-01 09:00:51.553",
            "to": "2018-06-15 09:00:51.553",
            "include_lower": "true",
            "include_upper": "true"
          }
        }
      }
    }
    },
    "aggs": {
             "all_accountname": {
                                    "terms": {
                                             "field": "AccountName"
                                             },
                                            "aggs": {
                                                     "all_ip": {
                                                             "terms": {
                                                                    "field": "server_ip"
                                                                     }
                                                             }
                                                     }
                            }
            },
  "size": 0
 })
 print(res)
 for i in res['aggregations']['all_accountname'] ['buckets']:
         for z in i ['aggregations']['all_ip']['buckets']:
                     print ('noms des comptes',i['key'],'voici mon adresse',z['key'],"a tel jour",)

```

RENDU!

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/9/7/97838263cd97e535900f9a461c007c2486bb77f4.png)

autre petite question : comment integre le timestamp dans ma requette ?  
j'essaye avec ceci mais il me retourne rien.

```
   "aggs":{
                "all_histogram": {
                                                 "date_histogram": {
                                                                                   "field": "@timestamp",
                                                                                    "interval": "month"
                                                                                    }

                                                 }
```

---

<div class="post-metadata">

**Author:** ![gabriel\_tessier](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/gabriel_tessier/32/27911_2.png) [@gabriel\_tessier](https://discuss.elastic.co/u/gabriel_tessier)\
**Post date:** [June 26, 2018, 4:59am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/8 "2018-06-26T04:59:36Z")

</div>

Bonjour,

Juste une question quel version d'elasticsearch tu utilises?  
Pour info search\_type est dépreciée, tu peux l'enlever vur que t'as size = 0  
[https://www.elastic.co/guide/en/elasticsearch/reference/2.4/breaking\_21\_search\_changes.html](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/breaking_21_search_changes.html)

Sinon dans ton body tu peux mettre query au lieu de filter ca marchera mieux (elasticsearch rajoute du cache) et plus longtemps (avec la version 6.x filter retourne une erreur).  
Et derniere remarque pour la query range tu peux utiliser "gte" et "lte" au lieu de from et to et les includes, avec tous les changements ca donnerai ca:

```
res = es.search(
index='mon_index', # <---- ici j'ai enleve le search_type

body={ "query": { # <---- remplace le filter par query
    "bool": {
      "must": {
        "range": {
          "timestamp": {
            "gte": "2018-05-01 09:00:51.553", # <--- remplace from et to avec gte et lte
            "lte": "2018-06-15 09:00:51.553"
          }
        }
      }
    }
    }

```

Pour l'aggregation avec le timestamp:

```
 {
  "aggs": {
"all_accountname": {
  "terms": {
    "field": "AccountName"
  },
  "aggs": {
    "all_ip": {
      "terms": {
        "field": "server_ip"
      }
    },
    "all_histogram": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "month"
      }
    }
  }
}
  },
  "size": 0
}

```

Et le script en python:

```
print(res)
for i in res['aggregations']['all_accountname'] ['buckets']:
  for z in i ['all_ip']['buckets']: # <--- eneleve ['aggregations']
    print ('noms des comptes',i['key'],'voici mon adresse',z['key'],"a tel jour",)
  for z in i ['all_histogram']['buckets']:
    print ('noms des comptes',i['key'],'voici ma date',z['key'],"a tel jour",)

```

J'ai juste enlevé la cle aggregations dans la deuxieme boucle. J'ai aussi rajouté la date.

Ci-dessous le mapping que j'ai utilise et mon jeux de donnees. Elastic version 6.2.4

```
PUT mon_index
{
  "settings": {
    "index": {
      "number_of_shards": "1"
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "AccountName": {
          "type": "keyword",
          "ignore_above": 256
        },
        "server_ip": {
          "type": "keyword",
          "ignore_above": 256
        },
        "timestamp": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        }
      }
    }
  }
}

POST mon_index/doc
{
  "AccountName": "Banana3",
  "server_ip": "127.1.1.3",
  "timestamp": "2018-05-03 13:22:22"
}
```

---

<div class="post-metadata">

**Author:** ![benzaq](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@benzaq](https://discuss.elastic.co/u/benzaq)\
**Post date:** [June 26, 2018, 10:01am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/9 "2018-06-26T10:01:45Z")

</div>

Bonjour ,  
merci de votre retour.  
apres avoir essayer je me retrouve avec cette erreur.

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/f/4/f4e5150abb1e603ef5a8e16fbd383bfceba6dd6d.png)

cela vous parle?

---

<div class="post-metadata">

**Author:** ![gabriel\_tessier](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/gabriel_tessier/32/27911_2.png) [@gabriel\_tessier](https://discuss.elastic.co/u/gabriel_tessier)\
**Post date:** [June 26, 2018, 10:36am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/10 "2018-06-26T10:36:56Z")

</div>

yop,  
y'a une erreur de syntaxe dans la requete au niveau du "bool"...  
sans la requete je peux pas dire plus.  
------ EDIT ------  
Ce qui serait plus pratique c'est de valider en premier que la requete fonctionne bien dans kibana ou kopf ou je ne sais quel client.  
Et ensuite mettre la requete dans le code python.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 24, 2018, 10:37am UTC](https://discuss.elastic.co/t/script-python-elasticsearch/136634/11 "2018-07-24T10:37:01Z")

</div>

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