1 个不稳定版本

0.1.0 2023年7月7日

#6#full-text

MIT 许可证

44KB
436

Elasticli

Logo

Rust

与 Elasticsearch 交互的缺失的命令行界面(或者另一个)。
尽管 elasticsearch API 调用非常简单,并且有很好的文档记录,但我总是忘记执行索引或搜索的基本命令和方法,所以我决定编写自己的 CLI。
希望你会觉得它有用,这是一个正在进行中的作品。

特性

使用 Rust 🦀 编写,它使用了以下 crate

  • clap 用于解析参数
  • hydroconf 用于配置管理
  • reqwest 用于向 elasticsearch 发送 http 请求

如果适当配置,命令可以在 SSH 隧道中运行(并在数秒后自动关闭)。

目前,你可以使用 elasticli

  • 获取目标 elasticsearch 版本的信息;
  • 创建、读取、更新、删除索引;
  • 创建、读取、更新、删除文档;

变更日志

0.1.2: 跨平台构建
0.1.1: 基本身份验证
0.1.0: 第一个版本

构建 & 运行

选项 1

  • 使用 cargo build --release (或者直接输入 make)为你自己的平台构建它,然后进入 target/release 并运行 elasticli 二进制文件。

选项 2

  • 或者,在你的平台 发行版页面 下载预构建的二进制文件。以下目标可用

    • x86_64-unknown-linux-gnu -> 64 位 Linux(内核 3.2+,glibc 2.17+)# 跨平台构建
    • x86_64-pc-windows-msvc -> 64 位 MSVC(Windows 7+)# 在 Windows 上构建 ** ***
    • x86_64-apple-darwin -> 64 位 macOS(10.7+,Lion+)# 在 macOS x86_64 上构建 **
    • aarch64-unknown-linux-gnu -> ARM64 Linux(内核 4.1,glibc 2.17+)# 跨平台构建
    • aarch64-apple-darwin -> ARM64 macOS(11.0+,Big Sur+)# 在 macOS aarch64 上构建

**: cross 使用 Docker 镜像进行交叉编译,遗憾的是目前没有提供 Windows 和苹果的镜像。
***: 在 Windows 上,除了 安装 Rust 之外,你可能还需要 安装 Perl 来构建 elasticli

你可以使用以下命令获取 Rust 的完整目标列表:
rustc --printtarget-list

你的平台在 host 属性的输出中显示
rustc -vV

选项 3

如果你想体验交叉编译,请安装 cross(你可能需要其他依赖),拿一杯啤酒,然后运行
make<YOUR-TARGET>
其中,目标是从 rustc --print target-list 的输出中选择的一个。无论如何,我已经为你交叉编译了一些 目标

其他

  • 如果你想运行单元测试,请运行 cargo test
  • 如果你想直接从源代码构建和运行,请运行 cargo run -- <你的 elasticli 选项和命令在这里>

配置

  • 每个命令都可以使用 hydroconf 功能来覆盖默认配置。例如,你可以通过将环境名称作为环境变量传递给命令行来覆盖一些默认设置
    ENV_FOR_HYDRO=production elasticli info
    或者通过单个属性,将其指定为命令行中的环境变量
    HYDRO_ELASTIC__PASSWORD="一个更强的密码"elasticli info

请参阅 hydroconf 文档 了解详细信息。

  • 你可以在命令(info、index、document)之一之前使用 -c 选项传递配置根目录。该目录必须包含配置文件(在 default 文件夹中查找最新版本)

.secrets.toml 基于环境的 敏感 配置(通常是 Elasticsearch 用户名和密码)。

[default]
elastic.username = 'elastic'
elastic.password = 'secure_password'

[production]
elastic.username = 'elastic'
elastic.password = 'changeme'

settings.toml 基于环境的配置

[default]
# your target elasticsearch host, port, protocol and version
elastic.host = 'otherhost'
elastic.port = 9200
elastic.protocol = 'http'
elastic.version = '8.8.0'

# if enabled, the main command will be executed inside an ssh tunnel. It is the same as running 
###  ssh -i <proxy.key> <proxy.remote_user>@<proxy.host> <elastic.port>:<elastic.host>:<elastic.port> sleep <proxy.timeout>
###  ssh -i .ssh/some_id_rsa centos@bastion-host 9200:remote-es.server.es:9200 sleep 3
# but rust does it for you
proxy.enabled = false
proxy.host = 'proxyhost'
proxy.port = 9201
proxy.protocol = 'http'
proxy.user = 'ec2-user'
proxy.remote_user = 'ec2-remote-user'
proxy.key = 'path to ssh key'
proxy.timeout = 3

命令展示

从示例中学习!以下是一些示例命令(有时是输出)。希望这足以理解。

通用

- 获取有关命令、选项和子命令的帮助

elasticli--help
elasticli<info|index|document> --help

信息

- 获取关于 Elasticsearch 的基本信息

elasticli info

{
  "cluster_name": "docker-cluster",
  "cluster_uuid": "b9c-xKsSRs2HQAvZ8wGsIw",
  "name": "aecf011cca00",
  "tagline": "You Know, for Search",
  "version": {
    "build_date": "2023-05-23T17:16:07.179039820Z",
    "build_flavor": "default",
    "build_hash": "c01029875a091076ed42cdb3a41c10b1a9a5a20f",
    "build_snapshot": false,
    "build_type": "docker",
    "lucene_version": "9.6.0",
    "minimum_index_compatibility_version": "7.0.0",
    "minimum_wire_compatibility_version": "7.17.0",
    "number": "8.8.0"
  }
}

索引

- 获取索引,相同操作,多种方式(这是 Clap 的魔法)

elasticli index-i test1
elasticli index-i=test1
elasticli index--index-名称=test1
elasticli index-o read--index-名称=test1

- 获取索引('_all' 和 '*' 是 Elasticsearch 通配符)

elasticli index-i _all
elasticli index--index-名称='*'

- 创建索引

elasticli index-o create--index-名称='pippo'
elasticli index-o create--index-名称='pippo_2' -b'{"settings": { "index": { "number_of_shards": 3, "number_of_replicas": 2 } } }'

{
  "acknowledged": true,
  "index": "pippo",
  "shards_acknowledged": true
}

- 更新索引

NOT YET IMPLEMENTED

- 删除索引

elasticli index-o delete-i'pippo2'
elasticli-c./samples/default index-o delete--index-名称='pippo2'

文档

- 在 test1 中创建一个文档

elasticli 文档-o create-i test1-b'{"名称":"giufus", "语言": "rust"}'

{
  "_id": "5Lms-YgBu6r1vXY7vPX_",
  "_index": "test1",
  "_primary_term": 3,
  "_seq_no": 2,
  "_shards": {
    "failed": 0,
    "successful": 1,
    "total": 2
  },
  "_version": 1,
  "result": "created"
}

- 更新现有文档(您需要在 'doc' 中放置您的更新)

elasticli 文档-更新-i test1-b'{"doc": { "语言": "zig"} }' --id 5Lms-YgBu6r1vXY7vPX_

{
  "_id": "5Lms-YgBu6r1vXY7vPX_",
  "_index": "test1",
  "_primary_term": 3,
  "_seq_no": 3,
  "_shards": {
    "failed": 0,
    "successful": 1,
    "total": 2
  },
  "_version": 2,
  "result": "updated"
}

- 在 test1 索引中搜索所有文档

elasticli 文档-o read-i test1

- 使用 Elasticsearch 查询在 test1 中搜索所有文档

elasticli 文档-o read-i test1-b'{ "查询": { "term": { "名称": "giufus" } }}'

- 删除现有文档

elasticli 文档-o delete-i test1--id 5rm3-YgBu6r1vXY7S_Xb

{
  "_id": "5Lms-YgBu6r1vXY7vPX_",
   "_index": "test1",
  "_primary_term": 3,
  "_seq_no": 9,
  "_shards": {
    "failed": 0,
    "successful": 1,
    "total": 2
  },
  "_version": 3,
  "result": "deleted"
}

默认值

如果未指定,代码中存在一些默认值

  • http 作为协议
  • 127.0.0.1 作为主机
  • 9200 作为端口
  • _doc 作为类型(用于文档删除)
  • read 作为操作
  • 8.8.0 作为 es 版本

待办事项

  • 编写更好的文档
  • 处理 Elasticsearch 版本(例如,提供 trait 的多个实现)
  • 集成测试(可能使用类似于 testcontainers 的工具)

使用 docker 在本地运行 Elasticsearch,不启用安全性

docker run-d--name elasticsearch-p9200:9200 -p9300:9300 -e"discovery.type=single-node" -e"xpack.security.enabled=false"elasticsearch:8.8.0

使用 docker 在本地运行带有基本身份验证的 Elasticsearch

docker run-d--name elasticsearch-p9200:9200 -p9300:9300 -e"discovery.type=single-node" -e"xpack.security.enabled=true" -e"ELASTIC_PASSWORD=changeme"elasticsearch:8.8.0

依赖项

~11–30MB
~472K SLoC