把 CSV 文件摄入到 Elasticsearch 中 - CSVES

103 阅读2分钟

在我们之前的很多文章里,我有讲到这个话题。在今天的文章中,我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 github.com/githubesson…。一种灵活的工具,用于将 CSV 数据导入 Elasticsearch,具有自动字段检测和映射功能。

克隆项目

我们在 terminal 中打入如下的命令:

git clone https://github.com/liu-xiao-guo/csves


1.  $ pwd
2.  /Users/liuxg/go
3.  $ git clone https://github.com/liu-xiao-guo/csves
4.  cd csves




1.  $ tree -L 3
2.  .
3.  ├── LICENSE
4.  ├── README.md
5.  ├── cmd
6.  │   └── csves
7.  │       └── main.go
8.  ├── example.csv
9.  ├── fields.json
10.  ├── go.mod
11.  ├── go.sum
12.  └── pkg
13.      ├── config
14.      │   └── config.go
15.      ├── csv
16.      │   └── service.go
17.      ├── elasticsearch
18.      │   └── service.go
19.      └── models
20.          └── document.go


为了能够使得我们在下面能够运行应用,我们在项目的根目录下创建如下的一个 .env 文件:

.env



1.  ELASTICSEARCH_URL=https://localhost:9200
2.  INDEX_NAME=csv_test
3.  CSV_FILE_PATH=./example.csv
4.  USER_NAME=elastic
5.  PASSWORD="y9NWnPq0++V=WxMXxSmr"
6.  FIELD_CONFIG_PATH=fields.json
7.  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”。

前提条件

为方便测试,我们在本文中采用 使用 start-local 脚本在本地运行 Elasticsearch 来进行安装。这个方法的好处是没有安全的安装。它便于测试!

编译项目

go build -o csves cmd/csves/main.go


1.  $ pwd
2.  /Users/liuxg/go/csves
3.  $ go build -o csves cmd/csves/main.go
4.  go: downloading github.com/joho/godotenv v1.5.1
5.  go: downloading github.com/elastic/go-elasticsearch/v8 v8.17.1
6.  go: downloading go.opentelemetry.io/otel/trace v1.28.0
7.  go: downloading github.com/elastic/elastic-transport-go/v8 v8.6.1
8.  go: downloading go.opentelemetry.io/otel v1.28.0
9.  go: downloading go.opentelemetry.io/otel/metric v1.28.0
10.  go: downloading github.com/go-logr/logr v1.4.2
11.  go: downloading github.com/go-logr/stdr v1.2.2
12.  $ ls
13.  LICENSE     cmd         example.csv go.mod      pkg
14.  README.md   csves       fields.json go.sum


我们看到一个新生成的 csves 执行文件。

用法

基本使用

我们使用如下的方法来测试一个 csv 文件是否可以行:

./csves -csv="example.csv" -test


1.  $ ./csves -csv="example.csv" -test
2.  es-url: https://localhost:9200
3.  index: csv_test
4.  csv: ./example.csv
5.  fields: fields.json
6.  fields: fields.json
7.  test: false
8.  username: elastic
9.  password: y9NWnPq0++V=WxMXxSmr
10.  certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
11.  Detected delimiter: ';'
12.  CSV Header mapping: map[age:1 name:0 sex:2]
13.  Test Mode - Printing all processed records:
14.  Record 1:
15.    name: Jerry
16.    age: 28
17.    sex: M
18.    source_csv: example.csv

20.  Record 2:
21.    name: Tom
22.    age: 40
23.    sex: F
24.    source_csv: example.csv

26.  Record 3:
27.    name: Cherry
28.    age: 20
29.    sex: F
30.    source_csv: example.csv

32.  Total records processed: 3


我们的测试 example.csv 文件内容如下:



1.  $ vi example.csv 

3.  name;age;sex
4.  Jerry;28;M
5.  Tom;40;F
6.  Cherry;20;F


我们只选中其中的 name 及 age 字段:

./csves -csv="example.csv" -select="name,age" -test 


1.  $ ./csves -csv="example.csv" -select="name,age" -test
2.  es-url: https://localhost:9200
3.  index: csv_test
4.  csv: ./example.csv
5.  fields: fields.json
6.  fields: fields.json
7.  test: false
8.  username: elastic
9.  password: y9NWnPq0++V=WxMXxSmr
10.  certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
11.  Detected delimiter: ';'
12.  CSV Header mapping: map[age:1 name:0 sex:2]
13.  Test Mode - Printing all processed records:
14.  Record 1:
15.    name: Jerry
16.    age: 28
17.    source_csv: example.csv

19.  Record 2:
20.    name: Tom
21.    age: 40
22.    source_csv: example.csv

24.  Record 3:
25.    name: Cherry
26.    age: 20
27.    source_csv: example.csv

29.  Total records processed: 3


写入数据到 Elasticsearch 中

我们使用如下的命令来把数据写入到 Elasticsearch 中:

./csves -csv="example.csv"


1.  $ ./csves -csv="example.csv"
2.  es-url: https://localhost:9200
3.  index: csv_test
4.  csv: ./example.csv
5.  fields: fields.json
6.  fields: fields.json
7.  test: false
8.  username: elastic
9.  password: y9NWnPq0++V=WxMXxSmr
10.  certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
11.  Detected delimiter: ';'
12.  CSV Header mapping: map[age:1 name:0 sex:2]
13.  Sample of processed records:
14.  Fields: map[age:28 name:Jerry sex:M source_csv:example.csv]
15.  Fields: map[age:40 name:Tom sex:F source_csv:example.csv]
16.  Total records processed: 3
17.  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"


1.  $ ./csves -csv="example.csv" -select="name,age" 
2.  es-url: https://localhost:9200
3.  index: csv_test
4.  csv: ./example.csv
5.  fields: fields.json
6.  fields: fields.json
7.  test: false
8.  username: elastic
9.  password: y9NWnPq0++V=WxMXxSmr
10.  certpath: /Users/liuxg/elastic/elasticsearch-8.17.1/config/certs/http_ca.crt
11.  Detected delimiter: ';'
12.  CSV Header mapping: map[age:1 name:0 sex:2]
13.  Sample of processed records:
14.  Fields: map[age:28 name:Jerry source_csv:example.csv]
15.  Fields: map[age:40 name:Tom source_csv:example.csv]
16.  Total records processed: 3
17.  2025/02/15 13:31:06 All documents indexed successfully


在 Kibana 中进行查看: