Есть ли способ в Elasticsearch получить результаты в виде файла CSV в curl api?

Я использую упругий поиск. Мне нужны результаты эластичного поиска в виде файла CSV. Какой-нибудь curl url или какие-либо плагины для достижения этой цели? Заранее спасибо.

9 ответов

Решение

Я сделал это, используя 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

Я успешно использовал Python, а подход сценариев интуитивно понятен и лаконичен. Клиент ES для python облегчает жизнь. Сначала скачайте последнюю версию клиента Elasticsearch для Python здесь:
http://www.elasticsearch.org/blog/unleash-the-clients-ruby-python-php-perl/

Тогда ваш скрипт на Python может включать такие вызовы, как:

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])

При обработке ошибок try / catch вы можете захотеть обернуть вызовы в ссылки на столбец ['key'], поскольку документы не структурированы и могут время от времени не иметь поля (зависит от вашего индекса).

У меня есть полный пример скрипта Python с использованием новейшего клиента Python ES, доступного здесь:

https://github.com/jeffsteinmetz/pyes2csv

Вы можете использовать плагин головы упругого поиска. Вы можете установить плагин из http://localhost:9200/_plugin/head/. После установки плагина перейдите на вкладку структурированного запроса, предоставьте сведения о запросе и выберите формат "csv" в "Результатах вывода". падать.

Я не думаю, что есть плагин, который будет давать вам результаты CSV непосредственно из поисковой системы, поэтому вам придется запросить ElasticSearch, чтобы получить результаты, а затем записать их в файл CSV.

Командная строка

Если вы работаете в Unix-подобной ОС, то, возможно, вам удастся добиться некоторого прогресса с помощью es2unix, который вернет вам результаты поиска в текстовом формате в командной строке и поэтому должен быть пригоден для сценариев.

Затем вы можете сбросить эти результаты в текстовый файл или канал awk или аналогично формату CSV. E сть -o флаг доступен, но в данный момент он дает только "сырой" формат.

Джава

Я нашел пример с использованием Java - но не проверял его.

питон

Вы можете запросить ElasticSearch с чем-то вроде pyes и запишите набор результатов в файл со стандартом csv писательская библиотека.

Perl

Используя Perl, вы можете использовать GIST Клинтона Гормли, связанный Rakesh - https://gist.github.com/clintongormley/2049562

Бесстыдная вилка. Я написал inst - программу командной строки для экспорта документов эластичного поиска в значения, разделенные табуляцией.

Пример:

$ 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

Instal может обрабатывать экспорт из нескольких индексов, пользовательских запросов, пропущенных значений, списка значений, вложенных полей, и это достаточно быстро.

Если вы используете кибану ( app/discoverв общем), вы можете сделать свой запрос в пользовательском интерфейсе, а затем saveэто и share-> CSV Reports. Это создает csv со строкой для каждой записи, а столбцы будут разделены запятыми.

Я использовал 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

и тогда тебе надо идти

  1. Устанавливает Ruby
  2. Установите зависимости curl для Ruby, потому что инструмент stash-query работает через REST API эластичного поиска
  3. Устанавливает тайник

Этот пост в блоге описывает, как его построить:

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

Вы можете использовать asticsearch2csv - небольшой и эффективный скрипт на python3, который использует Elasticsearch scroll API и обрабатывает большой ответ на запрос.

Вы можете использовать GIST. Это просто. Это в Perl, и вы можете получить некоторую помощь от него.

Пожалуйста, загрузите и посмотрите использование на GitHub. Вот ссылка. GIST GitHub

Или, если вы хотите в Java, то перейдите на asticsearch-river-csv

elasticsearch-река-CSV

Другие вопросы по тегам