58

I am using elastic search. I need results from elastic search as a CSV file. Any curl URL or any plugins to achieve this?

4

8 回答 8

77

我已经使用 cURL 和jq完成了这项工作(“like sed, but for JSON”)。例如,您可以执行以下操作来获取给定构面的前 20 个值的 CSV 输出:

$ 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
于 2014-04-08T18:53:53.467 回答
19

我已经成功地使用了 Python,并且脚本编写方法直观而简洁。python的ES客户端让生活变得轻松。首先在此处获取适用于 Python 的最新 Elasticsearch 客户端:
http ://www.elasticsearch.org/blog/unleash-the-clients-ruby-python-php-perl/#python

然后你的 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
    for hit in sample: 
        # 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...
        filewriter.writerow([col1,col2,col3])

您可能希望在 try / catch 错误处理中包装对 column['key'] 引用的调用,因为文档是非结构化的,并且有时可能没有该字段(取决于您的索引)。

我有一个完整的 Python 示例脚本,这里使用了最新的 ES python 客户端:

https://github.com/jeffsteinmetz/pyes2csv

于 2014-01-17T15:30:09.200 回答
9

您可以使用弹性搜索头插件。您可以从elasticsearch head 插件 http://localhost:9200/_plugin/head/ 安装插件安装后,导航到结构化查询选项卡,提供查询详细信息,您可以从“输出结果”中选择“csv”格式落下。

于 2015-04-04T07:53:17.227 回答
5

我认为没有插件可以直接从搜索引擎为您提供 CSV 结果,因此您必须查询 ElasticSearch 以检索结果,然后将它们写入 CSV 文件。

命令行

如果您使用的是类 Unix 操作系统,那么您可能会使用es2unix取得一些进展,它会在命令行上以原始文本格式返回搜索结果,因此应该是可编写脚本的。

然后,您可以将这些结果转储到文本文件或管道中,awk或类似于 CSV 格式。有一个-o可用的标志,但它目前只提供“原始”格式。

爪哇

我找到了一个使用 Java的示例- 但尚未对其进行测试。

Python

您可以使用类似的方式查询 ElasticSearch,pyes并将结果集写入使用标准编写器csv库的文件。

Perl

使用 Perl,您可以使用由 Rakesh 链接的 Clinton Gormley 的 GIST - https://gist.github.com/clintongormley/2049562

于 2013-09-19T17:59:17.787 回答
4

无耻的插头。我编写了estab - 一个命令行程序,用于将弹性搜索文档导出为制表符分隔值。

例子:

$ 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 可以处理来自多个索引、自定义查询、缺失值、值列表、嵌套字段的导出,而且速度相当快。

于 2014-08-22T09:12:26.293 回答
2

为此,我一直在使用https://github.com/robbydyer/stash-query stash-query。

我发现它非常方便且运行良好,尽管每次重做时我都在安装时遇到困难(这是因为我对 gem 和 ruby​​ 不太流利)。

不过,在 Ubuntu 16.04 上,似乎可行的是:

apt install ruby
sudo apt-get install libcurl3 libcurl3-gnutls libcurl4-openssl-dev
gem install stash-query

然后你应该很高兴

  1. 安装 Ruby
  2. 为 Ruby 安装 curl 依赖项,因为 stash-query 工具通过 elasticsearch 的 REST API 工作
  3. 安装存储查询

这篇博文也描述了如何构建它:

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

于 2016-10-21T14:20:27.837 回答
1

你可以使用elasticsearch2csv是一个小而有效的 python3 脚本,它使用 Elasticsearch 滚动 API 并处理大查询响应。

于 2017-06-01T15:30:44.167 回答
-3

您可以使用 GIST。这很简单。它在 Perl 中,您可以从中获得一些帮助。

请在 GitHub 上下载并查看使用情况。链接在这里。 GIST GitHub

或者,如果您想使用 Java,请使用 elasticsearch-river-csv

弹性搜索河 csv

于 2013-09-19T12:09:15.287 回答