web-dev-qa-db-fra.com

Existe-t-il un moyen dans Elasticsearch d'obtenir des résultats sous forme de fichier CSV dans l'API Curl?

J'utilise la recherche élastique. J'ai besoin des résultats de la recherche élastique en tant que fichier CSV. Une URL curl ou des plugins pour y parvenir?

41
Ramaraj Karuppusamy

Je l'ai fait en utilisant cURL et jq ("comme sed, mais pour JSON"). Par exemple, vous pouvez effectuer les opérations suivantes pour obtenir une sortie CSV pour les 20 premières valeurs d'une facette donnée:

$ curl -X GET 'http://localhost:9200/myindex/item/_search?from=0&size=0' -d '
    {"from": 0,
    "size": 0,
    "facets": {
      "sourceResource.subject.name": {
        "global": true,
        "terms": {
          "order": "count",
          "size": 20,
          "all_terms": true,
          "field": "sourceResource.subject.name.not_analyzed"
        }
      }
    },
    "sort": [
      {
        "_score": "desc"
      }
    ],
    "query": {
      "filtered": {
        "query": {
          "match_all": {}
        }
      }
    }
  }' | jq -r '.facets["subject"].terms[] | [.term, .count] | @csv'

"United States",33755
"Charities--Massachusetts",8304
"Almshouses--Massachusetts--Tewksbury",8304
"Shields",4232
"Coat of arms",4214
"Springfield College",3422
"Men",3136
"Trees",3086
"Session Laws--Massachusetts",2668
"Baseball players",2543
"Animals",2527
"Books",2119
"Women",2004
"Landscape",1940
"Floral",1821
"Architecture, Domestic--Lowell (Mass)--History",1785
"Parks",1745
"Buildings",1730
"Houses",1611
"Snow",1579
60
anarchivist

J'ai utilisé Python avec succès, et l'approche de script est intuitive et concise. Le client ES pour python facilite la vie. Commencez par saisir le dernier client Elasticsearch pour Python ici:
http://www.elasticsearch.org/blog/unleash-the-clients-Ruby-python-php-Perl/#python

Votre script Python peut inclure des appels comme:

import elasticsearch
import unicodedata
import csv

es = elasticsearch.Elasticsearch(["10.1.1.1:9200"])
# this returns up to 500 rows, adjust to your needs
res = es.search(index="YourIndexName", body={"query": {"match": {"title": "elasticsearch"}}},500)
sample = res['hits']['hits']

# then open a csv file, and loop through the results, writing to the csv
with open('outputfile.tsv', 'wb') as csvfile:   
    filewriter = csv.writer(csvfile, delimiter='\t',  # we use TAB delimited, to handle cases where freeform text may have a comma
                        quotechar='|', quoting=csv.QUOTE_MINIMAL)
    # create column header row
    filewriter.writerow(["column1", "column2", "column3"])    #change the column labels here
    # fill columns 1, 2, 3 with your data 
    col1 = hit["some"]["deeply"]["nested"]["field"].decode('utf-8')  #replace these nested key names with your own
    col1 = col1.replace('\n', ' ')
    # col2 = , col3 = , etc...
    for hit in sample: 
        filewriter.writerow([col1,col2,col3])

Vous souhaiterez peut-être encapsuler les appels à la colonne ['key'] dans la gestion des erreurs try/catch, car les documents ne sont pas structurés et peuvent ne pas avoir le champ de temps en temps (cela dépend de votre index).

J'ai un exemple de script complet Python utilisant le dernier client ES python disponible ici:

https://github.com/jeffsteinmetz/pyes2csv

14
Jeff Steinmetz

Vous pouvez utiliser le plug-in elasticsearch head. Vous pouvez installer à partir de plugin elasticsearch headhttp: // localhost: 9200/_plugin/head / Une fois le plugin installé, accédez à l'onglet de requête structurée, fournissez les détails de la requête et vous pouvez sélectionner le format "csv" dans la liste déroulante "Résultats de sortie".

8
Tikki

Je ne pense pas qu'il existe un plugin qui vous fournira des résultats CSV directement à partir du moteur de recherche, vous devrez donc interroger ElasticSearch pour récupérer les résultats, puis les écrire dans un fichier CSV.

Ligne de commande

Si vous utilisez un système d'exploitation de type Unix, vous pourrez peut-être faire des progrès avec es2unix qui vous donnera les résultats de la recherche au format texte brut sur la ligne de commande et devrait donc être scriptable.

Vous pouvez ensuite vider ces résultats dans un fichier texte ou diriger vers awk ou similaire au format CSV. Il y a un -o drapeau disponible, mais il ne donne que le format "brut" pour le moment.

Java

J'ai trouvé un exemple en utilisant Java - mais je ne l'ai pas testé.

Python

Vous pouvez interroger ElasticSearch avec quelque chose comme pyes et écrire le jeu de résultats dans un fichier avec la bibliothèque d'écriture standard csv.

Perl

En utilisant Perl, vous pouvez alors utiliser Clinton Gormley's Gist lié par Rakesh - https://Gist.github.com/clintongormley/2049562

5
jamesc

Prise sans vergogne. J'ai écrit estab - un programme en ligne de commande pour exporter des documents elasticsearch vers des valeurs séparées par des tabulations.

Exemple:

$ export MYINDEX=localhost:9200/test/default/
$ curl -XPOST $MYINDEX -d '{"name": "Tim", "color": {"fav": "red"}}'
$ curl -XPOST $MYINDEX -d '{"name": "Alice", "color": {"fav": "yellow"}}'
$ curl -XPOST $MYINDEX -d '{"name": "Brian", "color": {"fav": "green"}}'

$ estab -indices "test" -f "name color.fav"
Brian   green
Tim     red
Alice   yellow

estab peut gérer l'exportation à partir de plusieurs index, requêtes personnalisées, valeurs manquantes, liste de valeurs, champs imbriqués et c'est assez rapide.

2
miku

J'utilise https://github.com/robbydyer/stash-query stash-query pour cela.

Je le trouve assez pratique et fonctionne bien, bien que je rencontre des difficultés avec l'installation chaque fois que je le refais (cela est dû au fait que je ne parle pas très bien avec Gem's et Ruby).

Cependant, sur Ubuntu 16.04, ce qui semblait fonctionner était:

apt install Ruby
Sudo apt-get install libcurl3 libcurl3-gnutls libcurl4-openssl-dev
gem install stash-query

et ensuite tu devrais être prêt à partir

  1. Installe Ruby
  2. Installez les dépendances curl pour Ruby, car l'outil de requête caché fonctionne via l'API REST d'Elasticsearch
  3. Installe la requête cachée

Cet article de blog décrit également comment le créer:

https://robbydyer.wordpress.com/2014/08/25/exporting-from-kibana/

2
pandaadb

vous pouvez utiliser elasticsearch2csv est un petit script python3 efficace qui utilise l'API Elasticsearch scroll et gère une grande réponse de requête.

1
Maoz Zadok