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?
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
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:
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".
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.
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.
J'ai trouvé un exemple en utilisant Java - mais je ne l'ai pas testé.
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
.
En utilisant Perl, vous pouvez alors utiliser Clinton Gormley's Gist lié par Rakesh - https://Gist.github.com/clintongormley/2049562
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.
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
Cet article de blog décrit également comment le créer:
https://robbydyer.wordpress.com/2014/08/25/exporting-from-kibana/
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.