【问题标题】:Export Elasticsearch results into a CSV file将 Elasticsearch 结果导出到 CSV 文件中
【发布时间】:2018-03-22 18:18:20
【问题描述】:

我正在尝试将使用以下查询找到的结果导出到我桌面上的 CSV 文件中。

这是我第一次使用 Elasticsearch 和 cURL,所以我对如何做到这一点感到困惑。

from elasticsearch import Elasticsearch

es = Elasticsearch(["9200"])

# Replace the following Query with your own Elastic Search Query
res = es.search(index="search", body=
                {
                    "_source": ["DTDT", "TRDT", "SPLE", "RPLE"],
                    "query": {
                        "bool": {
                            "should": [
                                {"wildcard": {"CN": "TEST1"}}

                            ]
                        }
                    }
}, size=10)

for doc in res['hits']['hits']:
    print(doc)

现在,当我运行此查询时,它会返回 dave 的姓名、姓氏、地址和性别,我想在运行查询时将结果放入桌面上的 csv。

我一直在阅读此链接以了解如何执行此操作,但我不确定如何让我的查询执行此操作 - (https://docs.python.org/3/library/csv.html)

有人可以帮助并告诉我如何在导出 csv 时转换我的查询!

谢谢

我得到的输出是 -

{'_index': 'search', '_type': 'trades', '_id': '179299804977823744', '_score': 1.0, '_source': {'DTDT': '20170928', 'SPLE': '1001', 'RPLE': '1001', 'TRDT': '2017-09-28 17:01:19'}}

【问题讨论】:

  • 你能给出 print(doc) 的输出吗?几行就可以了
  • 我发布的查询我已经编辑了一些代码,例如我正在搜索的内容。你需要原始代码吗?唯一的区别是列名。我已经更新了我原来的帖子,现在是输出和原始代码。谢谢你看看。我正在努力将我的代码转换为以 CSV 格式导出结果。
  • 当您在上面编写代码并打印结果时,最后在 for 循环中,需要该输出来了解数据是如何来的。
  • 感谢您的快速回复,您看到我更新的帖子以及我的更新代码和输出了吗?

标签: python python-3.x curl elasticsearch export-to-csv


【解决方案1】:

您可以使用csv模块写入数据。

根据您给出的输出,我假设您要将数据从 _source 写入 csv 文件。

代码:

from elasticsearch import Elasticsearch
import csv

es = Elasticsearch(["9200"])

# Replace the following Query with your own Elastic Search Query
res = es.search(index="search", body=
                {
                    "_source": ["DTDT", "TRDT", "SPLE", "RPLE"],
                    "query": {
                        "bool": {
                            "should": [
                                {"wildcard": {"CN": "TEST1"}}

                            ]
                        }
                    }
}, size=10)



with open('mycsvfile.csv', 'w') as f:  # Just use 'w' mode in 3.x
    header_present  = False
    for doc in res['hits']['hits']:
        my_dict = doc['_source'] 
        if not header_present:
            w = csv.DictWriter(f, my_dict.keys())
            w.writeheader()
            header_present = True


        w.writerow(my_dict)

【讨论】:

  • 你能告诉我如何用我的代码添加你的代码吗?
  • 我遇到了很多错误 GET 9200:9200/search/_search?size=10 [status:N/A request:8.984s] Traceback(最近一次调用最后一次):文件“C:\Users\AppData\Local\Programs\Python \Python36-32\lib\site-packages\urllib3\util\connection.py",第 60 行,在 create_connection for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  • 文件“C:\Users\\AppData\Local\Programs\Python\Python36-32\lib\socket.py”,第 745 行,在 getaddrinfo 中用于 _socket.getaddrinfo(host, port , family, type, proto, flags): socket.gaierror: [Errno 11004] getaddrinfo failed 在处理上述异常的过程中,又发生了一个异常:
  • 对不起,我看到了我犯的错误,我修复了它并运行了查询,它创建了 CSV 文件,但文件中没有数据,我也收到一个名为 Traceback 的错误(最近一次调用最后一次):文件“C:/Users//.PyCharmCE2017.2/config/scratches/test1.py”,第 26 行,在 w = csv.DictWriter(f, my_dict.keys()) NameError: name 'my_dict' is not定义
  • 顺便说一句,我只想说谢谢你的帮助,我一直在寻找其他示例以使其与列一起使用,因此我稍后可能会发布另一篇文章,但如果我们得到这个工作我将不胜感激!
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 2017-12-31
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多