把 CSV 文件摄入到 Elasticsearch 中 - CSVES
在我们之前的很多文章里,我有讲到这个话题。在今天的文章中,我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全的 SSL ES 连接。我把它进行了一些小的改造。它是一种灵活的工具,用于将 CSV 数据导入 Elasticsearch,具有自动字段检测和映射功能。
克隆项目
我们在 terminal 中打入如下的命令:
git clone https://github.com/liu-xiao-guo/csves
$ pwd
/Users/liuxg/go
$ git clone https://github.com/liu-xiao-guo/csves
cd csves
$ tree -L 3
.
├── LICENSE
├── README.md
├── cmd
│ └── csves
│ └── main.go
├── example.csv
├── fields.json
├── go.mod
├── go.sum
└── pkg├── config│ └── config.go├── csv│ └── service.go├── elasticsearch│ └── service.go└── models└── document.go
为了能够使得我们在下面能够运行应用,我们在项目的根目录下创建如下的一个 .env 文件:
.env
ELASTICSEARCH_URL=https://localhost:9200
INDEX_NAME=csv_test
CSV_FILE_PATH=./example.csv
USER_NAME=elastic
PASSWORD="y9NWnPq0++V=WxMXxSmr"
FIELD_CONFIG_PATH=fields.json
ELASTICSEARCH_CERT_PATH=/Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
依赖你的配置,你需要根据上面的变量值做相应的修改。特别值得注意的是:
- 如果你是 basic 安全设置,那么你需要提供 PASSWORD 及 USER_NAME
- 如果你的 Elasticsearch 是带有 SSL 安全的,那么针对自签名 Elasticsearch,你需要提供 ELASTICSEARCH_CERT_PATH。否则设置它为 “”。
更多有关如何在 golang 里连接到 Elasticsearch,请参考文章 “Elasticsearch:运用 Go 语言实现 Elasticsearch 搜索 - 8.x”。
前提条件
- 安装 Go 1.23 及以上。我们在链接下载最新的 Go 来进行安装。
- 安装 Elastic Stack 8.x
- 参考文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 安装 Elasticsearch
- 参考文章 “Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana”
为方便测试,我们在本文中采用 使用 start-local 脚本在本地运行 Elasticsearch 来进行安装。这个方法的好处是没有安全的安装。它便于测试!
编译项目
go build -o csves cmd/csves/main.go
$ pwd
/Users/liuxg/go/csves
$ go build -o csves cmd/csves/main.go
go: downloading github.com/joho/godotenv v1.5.1
go: downloading github.com/elastic/go-elasticsearch/v8 v8.17.1
go: downloading go.opentelemetry.io/otel/trace v1.28.0
go: downloading github.com/elastic/elastic-transport-go/v8 v8.6.1
go: downloading go.opentelemetry.io/otel v1.28.0
go: downloading go.opentelemetry.io/otel/metric v1.28.0
go: downloading github.com/go-logr/logr v1.4.2
go: downloading github.com/go-logr/stdr v1.2.2
$ ls
LICENSE cmd example.csv go.mod pkg
README.md csves fields.json go.sum
我们看到一个新生成的 csves 执行文件。
用法
基本使用
我们使用如下的方法来测试一个 csv 文件是否可以行:
./csves -csv="example.csv" -test
$ ./csves -csv="example.csv" -test
es-url: https://localhost:9200
index: csv_test
csv: ./example.csv
fields: fields.json
fields: fields.json
test: false
username: elastic
password: y9NWnPq0++V=WxMXxSmr
certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
Detected delimiter: ';'
CSV Header mapping: map[age:1 name:0 sex:2]
Test Mode - Printing all processed records:
Record 1:name: Jerryage: 28sex: Msource_csv: example.csvRecord 2:name: Tomage: 40sex: Fsource_csv: example.csvRecord 3:name: Cherryage: 20sex: Fsource_csv: example.csvTotal records processed: 3
我们的测试 example.csv 文件内容如下:
$ vi example.csv name;age;sex
Jerry;28;M
Tom;40;F
Cherry;20;F
我们只选中其中的 name 及 age 字段:
./csves -csv="example.csv" -select="name,age" -test
$ ./csves -csv="example.csv" -select="name,age" -test
es-url: https://localhost:9200
index: csv_test
csv: ./example.csv
fields: fields.json
fields: fields.json
test: false
username: elastic
password: y9NWnPq0++V=WxMXxSmr
certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
Detected delimiter: ';'
CSV Header mapping: map[age:1 name:0 sex:2]
Test Mode - Printing all processed records:
Record 1:name: Jerryage: 28source_csv: example.csvRecord 2:name: Tomage: 40source_csv: example.csvRecord 3:name: Cherryage: 20source_csv: example.csvTotal records processed: 3
写入数据到 Elasticsearch 中
我们使用如下的命令来把数据写入到 Elasticsearch 中:
./csves -csv="example.csv"
$ ./csves -csv="example.csv"
es-url: https://localhost:9200
index: csv_test
csv: ./example.csv
fields: fields.json
fields: fields.json
test: false
username: elastic
password: y9NWnPq0++V=WxMXxSmr
certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
Detected delimiter: ';'
CSV Header mapping: map[age:1 name:0 sex:2]
Sample of processed records:
Fields: map[age:28 name:Jerry sex:M source_csv:example.csv]
Fields: map[age:40 name:Tom sex:F source_csv:example.csv]
Total records processed: 3
2025/02/15 13:28:16 All documents indexed successfully
我们在 Kibana 中进行查看:
GET csv_test/_search

我们看到有三个文档被成功地写入。
下面我们有选择地写入其中的两个字段:name 及 age。我们首先在 Kibana 中执行如下的命令:
DELETE csv_test
我们再执行如下的命令:
./csves -csv="example.csv" -select="name,age"
$ ./csves -csv="example.csv" -select="name,age"
es-url: https://localhost:9200
index: csv_test
csv: ./example.csv
fields: fields.json
fields: fields.json
test: false
username: elastic
password: y9NWnPq0++V=WxMXxSmr
certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
Detected delimiter: ';'
CSV Header mapping: map[age:1 name:0 sex:2]
Sample of processed records:
Fields: map[age:28 name:Jerry source_csv:example.csv]
Fields: map[age:40 name:Tom source_csv:example.csv]
Total records processed: 3
2025/02/15 13:31:06 All documents indexed successfully
在 Kibana 中进行查看:

相关文章:
把 CSV 文件摄入到 Elasticsearch 中 - CSVES
在我们之前的很多文章里,我有讲到这个话题。在今天的文章中,我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…...
PyQt组态软件 拖拽设计界面测试
PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件,目前实现的功能如下: 支持拖入控件,鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器,修改当前选中控件的属性 拖动框选控件,点选控件 控…...
【Python爬虫(1)】专栏开篇:夯实Python基础
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Java中的分布式(概念说明)
1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…...
Field ‘id‘ doesn‘t have a default value
1.程序测试时,运行到向数据库插入数据时,报以下异常 是id没有默认值; 在测试单元内单独向该数据库插入数据,报同样的异常,确定了异常的定位 2.项目时采用mybatisPlus操作数据库,报异常的数据库和另外一个数据库关联,主键ID和另外一个数据库相同,通过读取另外一个数据库的ID获…...
蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)
一、栈的基本概念 栈(Stack)是一种特殊的线性数据结构,遵循后进先出(Last In First Out,LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...
Hive之分区表
Hive之分区表 文章目录 Hive之分区表写在前面分区表分区表基本操作引入分区表创建分区表语法加载数据到分区表中查询分区表中数据增加分区删除分区查看分区表有多少分区查看分区表结构 二级分区正常的加载数据分区表和数据产生关联 动态分区开启动态分区参数设置案例实操 写在前…...
Redis之持久化
1.前言 Redis⽀持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题, 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。本文内容: • 介绍RDB、AOF的配置和运⾏流程,以及控制持久化的命令,…...
有关计算机的英语单词、短语、句子
基本计算机术语 Computer – 计算机 Hardware – 硬件 Software – 软件 Operating System (OS) – 操作系统 Processor (CPU) – 处理器(中央处理单元) Memory (RAM) – 内存(随机存取存储器) Storage – 存储 Disk Drive – 硬…...
String、StringBuffer、StringBuilder 区别
在 Java 编程中,String、StringBuffer 和 StringBuilder 是处理字符串时常用的类。它们在功能上有相似之处,但在内部实现、性能、线程安全性等方面存在显著差异。理解这些差异有助于开发者在不同的场景下做出合适的选择,提高代码的性能和效率…...
shell——分支语句
文章目录 基本语法常用判断条件(1)两个整数之间比较(2)按照文件权限进行判断(3)按照文件类型进行判断(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令…...
【vue3】实现pdf在线预览的几种方式
今天一天对当前可用的pdf预览插件做了测试,主要需求是只能预览不能下载,但对于前端来说,没有绝对的禁止,这里只罗列实现方式。 目前采用vue3版本为:3.2.37 iframevue-officepdfjs-dist iframe 先说最简单的…...
(学习总结22)Linux 基本指令1
Linux 基本指令1 基本指令当前目录信息指令 ls查看路径指令 pwd改变当前所在目录指令 cd创建或更改文件时间指令 touch创建目录指令 mkdir删除空目录指令 rmdir删除指令 rm查阅手册指令 man拷贝文件指令 cp移动文件指令 mv打印内容指令 echo 查看指令查找文件指令 find查看指令…...
Linux:用 clang 编译带 sched_ext 功能内核
文章目录 1. 前言2. 编译过程2.1 准备内核源代码2.2 安装编译工具2.3 配置、编译、运行2.3.1 配置2.3.2 编译2.3.3 运行 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 编译过程 …...
Redis 的集群 --- 数据分开扛
序言 上一章内容中我们介绍到了 哨兵 来保证我们主机在发生故障时能够及时地选出一个新的主机,但是哨兵地加入只是提供了 高可用性 和 故障转移,并没有真正的提升架构的性能。如果不断地加入新的数据的话,主机的压力会很大,一方面…...
微信小程序中缓存数据全方位解惑
微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍: 1. 数据缓存的类型 微信小程序提供了两种数据缓…...
LeetCode 每日一题 2025/2/10-2025/2/16
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 2/10 913. 猫和老鼠2/11 1728. 猫和老鼠 II2/12 1760. 袋子里最少数目的球2/13 1742. 盒子中小球的最大数量2/14 1552. 两球之间的磁力2/15 1706. 球会落何处2/16 1299. 将…...
使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
1. 项目设置 首先,确保你的项目已经配置好 Maven 或 Gradle 依赖管理工具,并添加以下依赖: Maven 依赖 <dependencies><!-- Shiro 核心库 --><dependency><groupId>org.apache.shiro</groupId><artifactI…...
DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
设计模式:代理模式
代理模式是很常见的设计模式,即使没有专门学习过这种设计模式,在工作中也一定用过这种设计模式。在实际生活中,代理模式也是常见的,比如内阁首辅相对于皇帝,前者是后者的代理,内阁首辅收到奏折时࿰…...
四大科技巨头狂砸7250亿美元:AI算力军备竞赛白热化
早上刷新闻的时候,看到一个数字让我愣住了——7250亿美元。 这不是某家公司的市值,也不是某个国家的GDP,而是谷歌、亚马逊、微软、Meta这四家科技巨头,计划在2026年投入的AI基础设施总预算。 同比增长77%。 这个数字背后ÿ…...
别再死磕期刊论文!Paperxie 这个「一键投稿级」写作功能,我不允许还有人不知道
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/期刊论文https://www.paperxie.cn/ai/journalArticleshttps://www.paperxie.cn/ai/journalArticles 深夜 11 点的实验室,你对着空白的 Word 文档叹了第 18 口气。论文标题框里还是只有 “新建 …...
Flutter 三方库 SecureStorage 加密存储鸿蒙化适配与实战指南(加密读写+批量操作全覆盖)
Flutter 三方库 SecureStorage 加密存储鸿蒙化适配与实战指南(加密读写批量操作全覆盖) 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 哈喽大家好呀👋!我是一名上海高校大一计算机专业的学生…...
WorldCanvas:多模态可控世界事件生成框架解析
1. 项目概述:当AI学会"导演"世界事件WorldCanvas这个命名本身就充满想象力——它把整个世界当作一张画布,让开发者能够像导演一样编排各种事件。作为一个多模态提示下的可控世界事件生成框架,它本质上解决的是"如何让AI系统按…...
多模态大语言模型跨模态一致性优化实践
1. 项目背景与核心挑战多模态大语言模型(Multimodal Large Language Models, MLLMs)正在重塑人机交互的边界。这类模型能够同时处理文本、图像、音频等多种模态数据,在智能客服、内容生成、教育辅助等领域展现出惊人潜力。然而在实际部署中&a…...
Windows预览版一键退出指南:如何快速恢复系统稳定性的完整教程
Windows预览版一键退出指南:如何快速恢复系统稳定性的完整教程 【免费下载链接】offlineinsiderenroll OfflineInsiderEnroll - A script to enable access to the Windows Insider Program on machines not signed in with Microsoft Account 项目地址: https://…...
用STM32F103C8T6做个桌面小摆件:OLED显示+28BYJ-48步进电机旋转角度实时监控
用STM32F103C8T6打造智能桌面摆件:OLED与步进电机的创意融合 周末整理工作室时,发现抽屉里闲置的STM32开发板和几个28BYJ-48步进电机,突然萌生一个想法——何不把这些电子元件变成桌面上既实用又有趣的互动装置?经过两天的折腾&am…...
TIC-80终极指南:如何突破技术限制创造更丰富的游戏体验
TIC-80终极指南:如何突破技术限制创造更丰富的游戏体验 【免费下载链接】TIC-80 TIC-80 is a fantasy computer for making, playing and sharing tiny games. 项目地址: https://gitcode.com/gh_mirrors/ti/TIC-80 TIC-80是一款免费开源的幻想计算机&#x…...
什么是开发语言?开发语言怎么选?
什么是开发语言?开发语言怎么选? 什么是开发语言?开发语言怎么选? 开发语言 一、开发语言发展和变化的过程二、开发语言的分类三、常见的开发语言及其特点四、如何选择开发语言五、开发语言的学习与掌握六、开发语言的未来趋势 …...
在Taotoken平台查看与导出详细API调用日志用于分析与审计
在Taotoken平台查看与导出详细API调用日志用于分析与审计 1. 访问审计日志功能 Taotoken平台为团队管理员提供了完整的API调用日志记录功能。要访问审计日志,首先登录Taotoken控制台,在左侧导航栏中找到「审计日志」或「API日志」菜单项。该功能通常位…...
