news 2026/10/15 15:47:42

Windows CMD下用curl操作Elasticsearch 7.7.0:索引、查询与排坑全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows CMD下用curl操作Elasticsearch 7.7.0:索引、查询与排坑全指南

我到现在都记得第一次在Windows的CMD里折腾Elasticsearch 7.7.0时,被双引号转义和JSON格式折磨到怀疑人生的样子。这个版本虽然已经不算新,但在内网离线环境、课程实验、临时数据验证这些场景里依然大量存在——尤其当手边没有Kibana、没有图形界面工具的时候,一个CMD窗口加上curl,反而是最可靠、最轻量的一套组合拳。

这篇文章想把我在CMD命令行下操作Elasticsearch 7.7.0的整套流程、关键细节和踩过的坑一次性讲透。不涉及安装包图形化界面,也不用插件,只靠Windows自带的CMD和curl,完成索引生命周期管理、文档增删改查、搜索查询、集群状态排查这些核心操作。适合刚接触ES的开发者,也适合必须在Windows服务器上做快速验证的运维和测试人员。文章里带命令、带输出、带参数说明,照着敲就能跑起来。

1. 准备工作:先把Elasticsearch 7.7.0在CMD里跑起来

1.1 下载解压与JDK版本那些事

Elasticsearch 7.7.0的安装包是一个tar.gz压缩文件,Windows系统直接用解压工具解压到一个没有中文、没有空格的目录就好。我见过有人放到C:\Program Files\elasticsearch-7.7.0下面,结果各种权限问题,所以老老实实放D:\elasticsearch-7.7.0这类路径最省心。

关于JDK,这里有个容易踩坑的点。从7.0版本开始,Elasticsearch发行包内部捆绑了OpenJDK,意思是你机器上哪怕没有装任何Java环境,它也能直接跑。但如果你自己装了JDK,ES会优先读取JAVA_HOME环境变量指定的Java路径。7.7.0这个版本官方标注的是要求Java 8以上,实际测试中Java 8、Java 11都能正常跑,我用的是自带JDK,顺手把JAVA_HOME指向了es目录内的jdk文件夹,这样最保险,不会受系统里其它版本Java干扰。

解压完成后,进到bin目录,能看到一堆带后缀的脚本文件,包括elasticsearch.bat、elasticsearch-service.bat、elasticsearch-plugin.bat。这里是图形界面安装和命令行安装的分水岭:后续所有操作,都建议在这个bin目录或者把bin目录加进系统PATH之后,再通过CMD来执行。

1.2 elasticsearch.bat启动与基础配置

启动ES很简单,在CMD窗口里cd到bin目录,输入elasticsearch.bat回车。第一次启动会看到大量INFO日志滚出来,我见过很多新手被这些滚动日志吓到,以为报错了,其实只要最后出现started,说明节点已经成功加入集群并开放了9200端口。

启动之前建议先看一眼config\elasticsearch.yml,这个文件是ES所有核心配置的入口。单机学习场景最常用的几个配置项是:

cluster.name: my-es-cluster node.name: node-1 network.host: 127.0.0.1 http.port: 9200

network.host这里特别说一句。默认情况下ES只绑定127.0.0.1,也就是只能本机访问,如果希望局域网内其他机器也能访问,需要改成0.0.0.0。但改完之后,7.7.0默认会认为你进入了生产模式,各种bootstrap检查会出来,比如单节点要额外配置discovery.type: single-node,不然集群发现这块会卡住,节点无法正常启动。

还有个关于内存的关键设置。ES默认堆内存是1GB,日常学习够用,但如果机器内存不够或者想模拟高并发场景,建议在config\jvm.options里显式调整:

-Xms2g -Xmx2g

注意Xms和Xmx必须设置成相同的值,避免堆在运行时收缩、扩容带来的性能抖动,这是ES官方文档里反复强调过的,实际线上排查起来就会发现堆内存不固定会有多坑。

如果启动之后在当前窗口运行,日志会持续输出,这个窗口被占用,没法继续敲命令。所以做演示或写测试脚本的时候,我习惯使用后台模式启动:elasticsearch-service.bat install和elasticsearch-service.bat start,这两个命令能把ES注册成Windows服务,启动后CMD窗口立即释放,不再被日志霸占。个人开发调试不想搞服务那么重,就新开一个CMD窗口,反正日志窗口保留着,还能实时观察异常。

2. 索引操作:用curl命令管理索引生命周期

2.1 创建索引与参数解释

ES里最核心的概念之一就是索引,一个索引相当于关系型数据库里的一个数据库或表,所有数据的增删改查都围绕它展开。索引建立之后,mapping(字段映射)和setting(分片、副本配置)基本就固定了,所以第一步的创建操作要想清楚。

在CMD下创建索引,用Linux或macOS新手习惯的那种带单引号的curl命令,在CMD里会直接报错,因为CMD把单引号当作普通字符处理,不是专门的字符串分隔符。正确写法是用双引号包裹完整的URL和JSON体,JSON内部的字段双引号则需要加反斜杠转义:

curl -X PUT "http://localhost:9200/user/_doc_index?pretty" -H "Content-Type: application/json" -d "{\"settings\":{\"number_of_shards\":3,\"number_of_replicas\":1},\"mappings\":{\"properties\":{\"name\":{\"type\":\"keyword\"},\"age\":{\"type\":\"integer\"},\"create_time\":{\"type\":\"date\"}}}}"

这条命令的核心参数我拆开讲:

  • -X PUT:HTTP方法,ES创建索引必须用PUT,如果索引已存在,再PUT同一个名字会返回resource_already_exists_exception。
  • -H "Content-Type: application/json":告诉ES请求体是JSON格式,这个头在7.x版本里是强制的,不加可能报Content-Type header [application/x-www-form-urlencoded] is not supported(不过这个报错更多出现在请求体发送JSON时)。
  • -d "...":请求体内容,注意CMD环境下所有内部双引号都要转义成\"。
  • ?pretty:格式化返回结果,让JSON缩进,肉眼看起来非常舒服。后面所有GET请求我都建议带上这个参数。

number_of_shards是主分片数,默认1,生产环境一般参考节点数和数据量设计,教学场景3个分片足以演示分片分布效果。number_of_replicas是副本数,默认1,也就是一份数据,集群里保存两份,单机模式下副本永远处于UNASSIGNED状态,这是正常现象,不用慌。

2.2 查询与删除索引,注意_cat输出

创建完索引之后,最常见的第一件事是确认它真的建好了。用下面的命令查看索引列表:

curl -X GET "http://localhost:9200/_cat/indices?v"

输出大概长这样:

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open user OqWr2T5sT7qK8fVXw2zYcQ 3 1 0 0 639b 639b

health列显示yellow,不是错误。单机集群没有第二台节点,副本分片无处可放,所以index状态是yellow,只有等集群里加入新节点后才会自动变成green。

这里有个小经验:_cat/indices输出里,pri代表主分片数,rep代表副本数,docs.count代表文档数。用这个命令排查索引规模非常方便。如果想看单个索引的详细情况,可以用:

curl -X GET "http://localhost:9200/user/_settings?pretty" curl -X GET "http://localhost:9200/user/_mapping?pretty"

_删除索引的命令同样简单,但极危险,CMD下没有二次确认机制,敲下去索引和里面所有文档彻底消失:

curl -X DELETE "http://localhost:9200/user?pretty"

返回的acknowledged字段会变成true,这意味着删除请求已经被集群接受了。我实际工作中至少见过有人把生产索引名写错然后一条DELETE下去直接清库的,所以这里多说一句:建议在删除之前先执行GET /_cat/indices?v确认索引名,再执行删除,千万别手快。

索引操作相关的命令表格我也整理了一份,方便对照速记:

操作命令格式说明
创建索引curl -X PUT "http://localhost:9200/user?pretty"不加请求体时创建默认配置索引
查看索引列表curl -X GET "http://localhost:9200/_cat/indices?v"v参数显示表头,信息最全
查看索引mappingcurl -X GET "http://localhost:9200/user/_mapping?pretty"查看字段类型定义
删除索引curl -X DELETE "http://localhost:9200/user?pretty"删除后数据不可恢复
判断索引是否存在curl -I "http://localhost:9200/user"返回200表示存在,404表示不存在

3. 文档增删改查:CMD转义与JSON格式实战

3.1 新增与覆盖写入

索引建好之后,最核心的操作就是往里面写数据。在ES中,往索引里写入一条数据叫索引一个文档,可以通过指定文档ID的方式用PUT,也可以通过不指定ID的方式用POST。

指定ID写入的典型命令:

curl -X PUT "http://localhost:9200/user/_doc/1?pretty" -H "Content-Type: application/json" -d "{\"name\":\"张三\",\"age\":28,\"city\":\"上海\"}"

不用自己指定ID的写法是把HTTP方法换成POST:

curl -X POST "http://localhost:9200/user/_doc?pretty" -H "Content-Type: application/json" -d "{\"name\":\"李四\",\"age\":32,\"city\":\"北京\"}"

两种方式有一个关键区别:PUT方式如果ID已存在,新文档会直接整体覆盖旧文档,注意是覆盖,不是合并。比如旧文档有name、age、city三个字段,新文档只传了name,覆盖之后旧文档里的age和city就没了。POST不指定ID则永远生成一批新的随机ID(格式类似_doc后返回的_id字段),适合日志类和流水类数据的写入。

这个覆盖机制必须记清楚,很多新手就是因为没有理解整体覆盖和局部更新的区别,直接PUT导致字段丢失。如果只想改一个字段,应该用update API,后面会讲到。

CMD下最简单也最容易翻车的点是中文。直接在CMD窗口里敲中文JSON,如果窗口代码页不是UTF-8,请求发出去很可能变成乱码,ES收到乱码后同样正常写入,但查询的时候字段值已经坏了。我后面会在常见问题章节专门讲编码处理,这里先给一个现成的做法:把CMD窗口切换成UTF-8代码页再执行。

3.2 查询、更新与删除文档

写入之后验证一下是否成功,用GET文档接口:

curl -X GET "http://localhost:9200/user/_doc/1?pretty"

返回结果里_source字段存放的就是完整文档内容。再补充一个技巧:如果文档ID不存在,HTTP状态码会变成404,同时响应里出现"found": false。在CMD窗口里可以配合-w参数输出HTTP状态码,方便脚本判断:

curl -s -w "\nHTTP_CODE:%{http_code}" "http://localhost:9200/user/_doc/999"

-w参数是在curl命令中自定义输出的老牌功能,%{http_code}代表本次请求的HTTP状态码,脚本里抓这个值就能做存在性判断。

更新文档用的是_update接口:

curl -X POST "http://localhost:9200/user/_doc/1/_update?pretty" -H "Content-Type: application/json" -d "{\"doc\":{\"age\":29}}"

注意这里HTTP方法是POST,路径是/_doc/1/_update,请求体里必须用"doc"包一层,代表只更新文档的部分字段。执行之后,原来文档里的name和city还在,只有age变成了29。这种局部更新的本质是先取旧文档、合并新字段、再整体写入,过程中如果文档正好被别人改了,会触发版本冲突,默认返回409。解决冲突的简单办法是加retry_on_conflict参数,比如?retry_on_conflict=3,意味着冲突后最多重试3次,适合并发更新时降低冲突概率。

删除文档用DELETE:

curl -X DELETE "http://localhost:9200/user/_doc/1?pretty"

返回的"result": "deleted"表示删除成功。如果ID不存在返回404,"result": "not_found"。这里有个ES特有的概念要说明:删除操作会把文档标记为deleted,底层会定时做段合并时物理清除,所以docs.count不一定会马上减一,需要等refresh或段合并,初学者看到索引计数没变不要以为删掉了没生效。

批量操作是写入大量数据时绕不开的功能。在CMD下手动拼bulk请求比较痛苦,因为每行都是独立JSON,老实用文件方案最稳。先准备一个bulk.json文件,内容每两行一组,第一行是操作元数据、第二行是文档数据,最后必须留一个空行:

{"index":{"_index":"user","_id":"11"}} {"name":"王五","age":26,"city":"广州"} {"index":{"_index":"user","_id":"12"}} {"name":"赵六","age":41,"city":"深圳"} {"delete":{"_index":"user","_id":"13"}}

然后执行:

curl -X POST "http://localhost:9200/_bulk?pretty" -H "Content-Type: application/json" --data-binary "@bulk.json"

--data-binary "@bulk.json"的意思是读取文件内容,原样发送,不做换行和转义处理。我强烈推荐在CMD下所有涉及复杂JSON的请求都用@文件路径这种形式,这是Windows命令行下规避双引号噩梦的最佳方案。

4. 搜索查询:从简单query到组合bool查询

4.1 _search API与q参数

查询功能是ES的看家本领,但在CMD下,很多人第一步就被复杂JSON查询体卡住了。先看最简单的查询方式——URI搜索,也就是把搜索条件拼在URL地址上。

最简单的场景是查询索引里的全部文档:

curl -X GET "http://localhost:9200/user/_search?pretty"

只想查某个字段值等于特定内容的文档,用q参数:

curl -X GET "http://localhost:9200/user/_search?q=city:%E4%B8%8A%E6%B5%B7&pretty"

这里city:上海中文部分必须进行URL编码,不然CMD可能发不出去。实际操作用中文编码闪退的坑非常多,我给一个替代方案:直接查英文单词或者数字可以先顶着,比如q=age:28就没编码问题。但真实业务场景躲不开中文,所以更推荐用下面说的请求体方式。

请求体查询的核心命令是:

curl -X GET "http://localhost:9200/user/_search?pretty" -H "Content-Type: application/json" -d "{\"query\":{\"match_all\":{}}}"

我在CMD里第一次敲这条命令就翻车,原因是内部的双引号没加反斜杠,CMD直接把它当成字符串边界截断,报错信息千奇百怪。记住:在CMD里写JSON请求体,所有内部双引号前面都要加\。如果JSON内容复杂、嵌套深,这种转义写法几乎不可维护,这时候就要用到前面说的-d "@search.json"方案。

4.2 JSON查询体与CMD多行处理

把查询条件写进一个独立的JSON文件,然后让curl读取这个文件,这是我在CMD下最推荐的查询操作姿势,没有之一。比如要查询年龄大于30且城市是上海的用户,可以创建search.json:

{ "query": { "bool": { "must": [ { "match": { "city": "上海" } } ], "filter": { "range": { "age": { "gt": 30 } } } } } }

然后执行:

curl -X GET "http://localhost:9200/user/_search?pretty" -H "Content-Type: application/json" -d "@search.json"

注意@search.json前面没有引号,文件的路径也不用加引号,除非路径里带了空格——而我在最前面就强调过,ES目录和文件路径都不要带空格,这里又验证了原因。

关于bool查询结构,很多教程一开始就甩出一大段概念,我用自己的话解释一遍。must是“必须匹配”条件,相当于SQL里的AND;should是“最好匹配”条件,相当于OR;must_not是“必须不匹配”条件;filter是过滤条件,和must最大的区别是它不参与相关性评分,所以查询性能更高,而且结果可以被缓存。上面这条查询的意思就是:先找出城市是“上海”的用户,再在这些人里过滤年龄大于30的,相关性分数不参与排序。

从搜索结果的结构看,hits.total是匹配总数,hits.hits是具体的匹配文档列表。如果只想关注某个字段,不想要整条_source,可以在查询体里加:

{ "_source": ["name", "age"], "query": { "match_all": {} } }

这样返回结果里只有name和age字段,传输体积小很多。日志类或大文本字段查询时,这个技巧能明显降低网络开销和内存占用。

match和term的区别也值得单独说。match适合全文搜索,查询时ES会把关键词做分词处理,比如搜索“上海浦东”会被拆成“上海”和“浦东”两个词去匹配,匹配到任意一个词就可以返回,相关性越高排越前。term则是不分词的精确匹配,适合keyword类型字段和数字、日期、布尔等精确值查询,比如查询age等于28就必须用term。这两个查询用错是ES新手最高频的错误之一,记住一句话:你能想象到SQL里=的字段用term,需要LIKE效果或者自然语言搜索的字段用match。

5. 集群排查与维护

5.1 _cat/nodes与健康检查

CMD下排查集群状态最趁手的工具是_cat系列API。它专门为命令行阅读设计,输出是纯文本表格,不用浏览器解析JSON,一眼就能看明白。

查看集群健康状态:

curl -X GET "http://localhost:9200/_cluster/health?pretty"

返回结果里status字段是核心指标,green代表所有主分片和副本分片都正常分配,yellow代表主分片正常、至少一个副本未分配,red代表有主分片丢失,此时该索引的部分数据不可读写。单机实验看到yellow太正常了,除非你想办法让副本数归零或者加第二个节点,不然它会一直yellow,不用焦虑。

查看节点列表:

curl -X GET "http://localhost:9200/_cat/nodes?v"

输出里包含节点名称、IP地址、堆内存使用百分比、磁盘可用情况等,是排查节点负载的第一手信息。我发现heap.percent这个字段特别有用,如果某个节点的堆内存使用长期超过85%,并且有GC(垃圾回收)频繁现象,基本可以断定堆内存设置过小或者查询太重,这时候结合jvm.options里的堆配置和大查询优化来调整。

查看索引大小和文档数分布:

curl -X GET "http://localhost:9200/_cat/indices?v&s=store.size:desc"

s=store.size:desc是排序参数,意思按存储体积倒序排列。这个命令在排查哪个索引占用磁盘最大的时候非常好用,省去了一页页翻JSON的麻烦。在CMD里直接执行即可,URL里的&在双引号包裹下会被当成参数视为普通字符,不会触发CMD的“命令分隔”问题,但如果你不加引号,&会被CMD理解成“割断前后命令”,这是新手特别容易翻车的地方。

5.2 配置项调整与重启

ES大部分配置修改完后都需要重启节点才能生效。常见需要重启的配置包括:elasticsearch.yml里的网络、集群、分片分配设置,以及jvm.options里的堆内存参数。我在实际操作中总结了重启的固定顺序:

net stop elasticsearch-service-x64 net start elasticsearch-service-x64

如果用的是前台elasticsearch.bat启动方式,直接Ctrl+C停掉当前进程,再重新执行elasticsearch.bat即可。

配置修改前一定记得备份原文件。比如要修改network.host,先copy config\elasticsearch.yml config\elasticsearch.yml.bak,改完再启动,万一启动报错,可以秒级回滚。有一次我在一台Linux服务器上排查问题,顺手在Windows机器上调整了分片分配策略,结果忘记重启节点,临时设置一直停留在内存里,一重启全丢了,白忙活一场。所以务必区分transient设置(运行时临时生效)和persistent设置(永久写入配置)。

动态设置可以直接通过API执行,比如调整分片分配策略:

curl -X PUT "http://localhost:9200/_cluster/settings?pretty" -H "Content-Type: application/json" -d "{\"transient\":{\"cluster.routing.allocation.enable\":\"all\"}}"

transient表示临时设置,节点重启后会自动消失,适合应急调整。想永久生效就换成persistent,它会写入集群状态,一直保留。但如果persistent里配置了不合适的值,比如把分片分配禁用成none,整个集群都会处于只读状态,会导致写入失败。这类操作必须在明确需求时再做,最好同时记录操作日志方便回溯。

6. 常见问题与CMD专属排坑

6.1 中文乱码与编码问题

这是Windows CMD操作ES时最闹心的问题,没有之一。CMD默认的代码页通常是GBK(936),而ES的JSON请求体和响应体都是UTF-8(65001)。两边编码不一致,直接体现就是中文索引名、中文查询条件、中文返回内容全部变成乱码或者???。

解决方案是全链路切换到UTF-8。第一步,在CMD窗口执行:

chcp 65001

这个命令把当前代码页切换成UTF-8。执行完以后,当前窗口才能正常显示和发送中文。但要注意,chcp 65001只对当前窗口生效,新开窗口会恢复默认编码,所以脚本或自动执行命令时,必须在脚本开头设置一次。如果换代码页之后cmd里中文显示正常了,但字体在有些环境下显示为方块,需要右键窗口标题栏,在“属性-字体”里把字体改成支持中文的等宽字体。

第二步,把JSON文件保存为UTF-8无BOM格式。我用-d "@search.json"这种文件读取方式时,如果文件是带BOM的UTF-8,BOM可能会被当作内容的一部分发送,ES解析JSON时直接报parse_exception。用Windows自带记事本另存为时选择“UTF-8”就是无BOM,但要小心不要选成“带签名的UTF-8”。

还有一处隐蔽的坑:文件在Windows上默认换行符是\r\n,而JSON解析对\r有时会不友好。用Notepad或者VSCode打开文件,把右下角换行方式改成LF,再保存,能避免不少莫名其妙的问题。

6.2 内存、端口与启动失败

ES启动失败的报错信息都写得很清楚,关键是要把日志先找到。前台启动时日志直接打在窗口里;后台服务方式启动,日志默认在logs\elasticsearch.log,Windows服务方式还会额外写事件查看器。

我遇到的启动失败案例中,排前三的原因分别是:

第一,堆内存设置过大,系统物理内存不足。报错类似Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory。解决办法是调小jvm.options里的Xms和Xmx,建议单个节点堆内存不超过本机物理内存的一半,且最多不超过32GB,这是ES官方的经验阈值。

第二,端口被占用。默认9200端口被其他程序占用,启动时直接BindException。CMD下快速排查端口占用:

netstat -ano | findstr 9200

找到占用9200端口的PID后,可以配合任务管理器关闭对应进程,或者在elasticsearch.yml里改http.port。注意9300(原transport端口)同样要检查。

第三,数据目录权限不足。Windows下ES对数据目录有严格的权限要求,解压到C:\Program Files这类目录时经常发生。直接改到D:\data这类普通用户可写的目录即可。另外ES会限制以管理员账户直接运行,提示不要用root或Administrator,但Windows下测试环境直接跑其实问题不大,会有一条警告日志,可以忽略,但生产环境建议用低权限专用账户。

启动成功的关键标志是日志里的这一行:

[2020-04-15T10:22:43,123][INFO ][o.e.n.Node] [node-1] started

看到started就算活了。之后用curl http://localhost:9200验证,返回结果里cluster_name字段和你elasticsearch.yml中配置的cluster.name一致,就说明整个链路通了。

6.3 curl在CMD里的引号转义和脚本化技巧

CMD下的curl转义问题我在前文反复提过,这里集中做一次总结,方便回看。核心规律有三条:

  • CMD中只有双引号"是字符串边界,单引号'会被当成普通字符直接传递。
  • JSON格式要求字段名和字符串值必须用双引号,所以JSON数据放在"..."里时,JSON内部的每个双引号都要写成\"。
  • 反斜杠\在CMD中不是转义字符,\"这种写法实际上是把\和"两个字符都传给程序,但curl在Windows下对这种常见写法有兼容处理,绝大多数场景实测可用。如果遇到奇怪报错,改用-d "@文件"方案绕开即可。

如果要在脚本里批量跑ES操作,我建议把常用命令封装成批处理文件。比如建一个es_ops.bat,里面预先定义好变量:

@echo off chcp 65001 >nul set ES_URL=http://localhost:9200 set JSON_FILE=%1 curl -X GET "%ES_URL%/_cat/indices?v" curl -X GET "%ES_URL%/_search?pretty" -H "Content-Type: application/json" -d "@%JSON_FILE%"

脚本风格上,把URL、端口、认证信息等关键变量用set提出来,后续调参只改一处,比直接硬编码到底下的curl命令里省心很多。需要注意批处理文件本身也要保存成UTF-8编码,同时注意chcp 65001会改变当前代码页,如果脚本里混了中文注释又没保存成UTF-8,注释可能变成乱码,倒不影响命令执行,但排错时特别烦躁。

常用命令速查表

我把这段时间在CMD下沉淀下来的常用命令整理成一张速查表,方便直接抄:

场景命令
健康检查curl "http://localhost:9200/_cluster/health?pretty"
节点列表curl "http://localhost:9200/_cat/nodes?v"
索引列表curl "http://localhost:9200/_cat/indices?v"
创建文档curl -X PUT "http://localhost:9200/user/_doc/1?pretty" -H "Content-Type: application/json" -d "@doc.json"
查询文档curl "http://localhost:9200/user/_doc/1?pretty"
局部更新curl -X POST "http://localhost:9200/user/_doc/1/_update?pretty" -H "Content-Type: application/json" -d "{\"doc\":{\"age\":29}}"
删除文档curl -X DELETE "http://localhost:9200/user/_doc/1?pretty"
搜索全部curl "http://localhost:9200/user/_search?pretty"
组合查询curl "http://localhost:9200/user/_search?pretty" -H "Content-Type: application/json" -d "@search.json"
批量写入curl -X POST "http://localhost:9200/_bulk?pretty" -H "Content-Type: application/json" --data-binary "@bulk.json"

最后再分享一点CMD下操作ES的个人体会

用了几个月CMD加ES的组合,总体感觉是:没有Kibana那么直观,但胜在轻量和可控。每次改完配置、跑完数据,脑子里对常见的REST接口印象越来越深,反而比在图形界面里点鼠标更能理解ES的本质。日常开发调试时现在还会额外用一下Elasticsearch Head这类浏览器插件,但真正排查线上问题、写自动化脚本时,CMD加curl依旧是首选工具。

最后分享一个小习惯:每次启动ES前,先快速检查一遍内存设置、数据目录、端口占用,启动后立刻执行_cluster/health确认状态,再执行后续操作。这个习惯帮我躲过了好几次启动失败后重复折腾的麻烦,也让我对节点状态心里有数。Elasticsearch 7.7.0这个版本在CMD命令行下的经验完全可以平移到后来的7.x、8.x上,核心的REST接口和命令行思路没变,只是坑的位置略有不同。熟悉了这套操作,换到任何没有图形界面的Windows服务器上,你都能在五分钟内把数据查出来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 15:45:42

OpenClaw 部署详解,对接飞书微信远程下发自动化任务

📌 说明 本文基于 OpenClaw 版本展开讲解,全程采用图形化、可视化的交互模式。整合包已内置全部运行依赖,即使是没有技术基础的普通用户,也能轻松复现完整的部署流程。 ✨核心亮点: 全程可视化图形交互界面&#xff0c…

作者头像 李华
网站建设 2026/10/15 15:45:31

OpenLLMetry Haystack 插桩实战:一行代码追踪 LLM 应用全链路

LLMOps可观测性 【免费下载链接】openllmetry Open-source observability for your GenAI or LLM application, based on OpenTelemetry 项目地址: https://gitcode.com/gh_mirrors/op/openllmetry 点击查看 免费下载 导读 本文讲解 openllmetry 仓库中 opentelem…

作者头像 李华
网站建设 2026/10/15 15:45:20

多选消息为什么会选错?稳定 ID、分页与提交快照

勾选了列表里的第二条消息,新消息插到顶部后,勾选却跑到了另一条消息上;翻到下一页再回来,选择又消失了。这类问题不一定来自点击事件,而可能来自选择状态保存了“位置”,没有保存“对象的身份”。 以米米…

作者头像 李华
网站建设 2026/10/15 15:45:19

群晖升级后Photos找不到了?照片没丢

群晖升级后 Photos 找不到了?照片没丢,是套件换了名字:三步找回入口 不少人家里的群晖 NAS 升级系统之后,突然发现桌面上熟悉的照片套件没了——原来叫 Photo Station,现在主菜单里翻遍了也找不到,进套件中…

作者头像 李华