Я использую эластичный поиск. Мне нужны результаты поиска в качестве файла csv. Любой curl url или любые плагины для этого? Спасибо заранее.
Есть ли способ в Elasticsearch получить результаты как файл CSV в curl api?
Ответ 1
Я сделал это только с помощью cURL и jq ( "как sed
, но для JSON" ). Например, вы можете сделать следующее, чтобы получить вывод CSV для верхних 20 значений заданной грани:
$ 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
Ответ 2
Я успешно использовал Python, и подход к написанию сценариев является интуитивным и лаконичным. ES-клиент для python упрощает жизнь. Сначала возьмите последний клиент Elasticsearch для Python здесь:
http://www.elasticsearch.org/blog/unleash-the-clients-ruby-python-php-perl/#python
Тогда ваш Python script может включать в себя такие вызовы, как:
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])
Возможно, вы захотите обернуть вызовы к столбцам ['key'] ссылок в обработке ошибок try/catch, поскольку документы неструктурированы и могут не иметь поля время от времени (зависит от вашего индекса).
У меня есть полный образец Python script, используя последний клиент python ES, доступный здесь:
Ответ 3
Вы можете использовать плагин elasticsearch head. Вы можете установить из плагин elasticsearch head http://localhost:9200/_plugin/head/ После того, как вы установили плагин, перейдите на вкладку структурированного запроса, укажите информацию о запросе, и вы можете выбрать формат "csv" в раскрывающемся меню "Выходные результаты".
Ответ 4
Я не думаю, что есть плагин, который даст вам результаты CSV непосредственно из поисковой системы, поэтому вам придется запросить ElasticSearch для получения результатов, а затем записать их в файл CSV.
Командная строка
Если вы работаете с Unix-подобной ОС, то вы можете добиться некоторого прогресса с es2unix, который даст вам результаты поиска возвращаются в исходном текстовом формате в командной строке и поэтому должны быть доступны для сценариев.
Затем вы можете отправить эти результаты в текстовый файл или канал на awk
или аналогично формату CSV. Существует флаг -o
, но он только дает "сырой" формат на данный момент.
Java
Я нашел пример с помощью Java - но не протестировал его.
Python
Вы можете запросить ElasticSearch с чем-то вроде pyes
и записать результаты, установленные в файл со стандартной библиотекой-писателем csv
.
Perl
Используя Perl, вы можете использовать Clinton Gormley GIST, связанный с Rakesh - https://gist.github.com/clintongormley/2049562
Ответ 5
Бесстыдный штекер. Я написал estab - программу командной строки для экспорта документов elasticsearch в значения, разделенные табуляцией.
Пример:
$ 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
установить может обрабатывать экспорт из нескольких индексов, пользовательских запросов, отсутствующих значений, списка значений, вложенных полей и достаточно быстро.
Ответ 6
Я использовал https://github.com/robbydyer/stash-query stash-query для этого.
Я считаю, что это довольно удобно и хорошо работает, хотя я борюсь с установкой каждый раз, когда я его переделываю (это из-за того, что я не очень хорошо владею драгоценным камнем и рубином).
В Ubuntu 16.04, однако, казалось, что работа была:
apt install ruby
sudo apt-get install libcurl3 libcurl3-gnutls libcurl4-openssl-dev
gem install stash-query
и тогда вам должно быть хорошо идти
- Устанавливает Ruby
- Установите зависимости curl для Ruby, потому что инструмент stash-query работает через REST API elasticsearch
- Устанавливает секретный запрос
В этом сообщении в блоге описывается, как его построить:
https://robbydyer.wordpress.com/2014/08/25/exporting-from-kibana/
Ответ 7
вы можете использовать elasticsearch2csv - это небольшой и эффективный python3 script, который использует API прокрутки Elasticsearch и обрабатывает большой ответ запроса.
Ответ 8
Вы можете использовать GIST. Это просто. Его в Perl, и вы можете получить от него некоторую помощь.
Пожалуйста, загрузите и посмотрите использование на GitHub. Ссылка здесь. GIST GitHub
Или, если вы хотите в Java, тогда перейдите к elasticsearch-river-csv