Elasticsearch常用指令(kibana)_kibana查看所有数据
es是非关系型数据库,优点主要是存储量较大,查询速度在大多数情况下都是比较快的。
由于项目的功能主要是存储和查询,所以选择了es当数据库来用,以下是常用的一些指令,注意es的版本不同会有些指令上的差异。本篇文章使用的版本为7.8。
1. 查看es版本 version -> number
GET /{ \"version\": { \"number\": \"7.8.0\" }}
2. 创建索引(es中的一个索引可以简单理解为mysql中的一张表)
mapping相当于mysql中的字段,创建后无法更改,只能新增,如果一定要更改,只推荐使用索引迁移。
PUT index_name{\"mappings\": { \"dynamic\": \"strict\", # 不允许动态增加字段\"properties\": {\"name\": {\"type\": \"keyword\"},\"age\": {\"type\": \"keyword\"}}}}
3. 插入文档(es中的一个文档可以简单理解为mysql中的一行数据)
插入一行数据并自动生成id,ES中会默认有一个_id字段,可以指定,也可以自动生成,唯一。
POST index_name/_doc{ \"name\" : \"aaa\"}
4. 获取索引映射(字段)
GET index_name/_mapping
5. 获取索引条数(总条数)
参考下边的条件搜索,将第一行的_search换为_count,就可以获得满足条件的文档条数
GET index_name/_count
6. 获取索引数据(无条件查询,获取前十条,如果总数量超过一万条,total只会显示10000)
GET index_name/_search
7. 条件查询
7.1 如果字段为text类型,存在两种查询方式:
① 字段名.keyword 将整个值视为一个整体来查询,类似mysql的查询方式
GET index_name/_search{ \"query\": { \"term\": { \"content.keyword\": \"原始内容\" } }} #搜到的数据中,所有文档的content的内容都是:原始内容
② 字段名直接搜,将根据分词器的分词查询
GET index_name/_search{ \"query\": { \"term\": { \"content\": \"原始内容\" } }}# 搜到的文档中,content字段为:原始文档数据xxx, 文档内容总述了xxxx 等
(如果查不出来,尝试加keyword和去掉keyword试试,可能就是字段数据类型的问题,也可以使用4的指令查看)
7.2 单一条件查询
搜索 content = 内容 的所有文档
must(必须满足)可以更换为should(可满足可不满足),或者must not(排除该条件)
term(等于)可以更换为range(范围查询),wildcard(通配符查询),还有其他的,但不常用
GET index_name/_search{ \"query\": { \"bool\": { \"must\": [ { \"term\": { \"content\": { \"value\": \"内容\" } } } ] } }}GET index_name/_search{ \"query\": { \"range\": { \"update_date\": { \"gte\": \"2025-05-01\", \"lte\": \"2025-05-31\", \"format\": \"yyyy-MM-dd\" // 指定日期格式 (可选) } } }}GET index_name/_search{ \"query\": { \"wildcard\": { \"name\": { \"value\": \"?aaa*\" } } }}// ?:匹配单个字符,*:匹配任意字符
7.3 多条件查询
must下只能有一个字段,因为要用来计算分数,其他查询可以使用filter来筛选
GET index_name/_search{ \"query\": { \"bool\": { \"must\": [ { \"term\": { \"language\": { \"value\": \"jp\" } } } ],\"must_not\": [ { \"exists\": { \"field\": \"age\" // 查询age字段为空(或不存在)的文档 } } ], \"filter\": [ { \"term\": { \"create_date\": { \"value\": \"2025-05-15 00:00:00\" } } },{\"term\": { \"name\": { \"value\": \"鹿目圆\"}}} ] } }}
7.4 查询字段是否存在
GET index_name/_count{ \"query\": { \"bool\": { \"must\": [ { \"exists\": { \"field\": \"name\" } } ] } }}
7.5 不需要评分时可以使用filter,数据量巨大的情况下,会比must快
GET index_name/_search{ \"query\": { \"bool\": { \"filter\": [ { \"term\": { \"content\": { \"value\": \"内容\" } } } ] } }}
上述这种条件查询,最多只能查询前一万条,如果需要获取所有文档,建议使用scroll
8. 滚动查询所有文档 scroll
查询条件设置和上边的查询一样
// 首次查询(设置条件)GET index_name/_search?scroll=2m{ \"slice\": { // 分片查询,可选 \"id\": 0, \"max\": 2 }, \"size\": 1000, \"query\": { \"bool\": { \"filter\": [ { \"term\": { \"language\": { \"value\": \"zh\" } } } ] } }}// 后续查询,条件固定,只需要传scroll idGET /_search/scroll{ \"scroll\": \"1m\", \"scroll_id\": \"FGluY2x\" // 首次查询返回的scroll id, 是串很长的数据,此处截短了}
9. 索引迁移
数据库存在必须更改的情况,只能使用数据迁移对其结构等进行更改
?slices=auto 并发操作,比不加快
// 索引迁移(并发)POST _reindex?slices=auto{ \"source\": { \"index\": \"old_index\" }, \"dest\": { \"index\": \"new_index\" }}// 删除原索引DELETE old_index// 将原索引名指向新索引POST _aliases{ \"actions\": [ { \"add\": { \"index\": \"new_index\", \"alias\": \"old_index\" } } ]}
10. 修改
修改数据量较大时,建议使用并发
// 根据字段值更新// 将索引下所有language为zh-cn的修改为zh, language可替换为其他字段名POST index_name/_update_by_query{ \"query\": { \"term\": { \"language.keyword\": \"zh-cn\" } }, \"script\": { \"source\": \"ctx._source.language = \'zh\'\", \"lang\": \"painless\" }, \"conflicts\": \"proceed\"}
11. 删除
删除前建议先使用_count确定是不是要删除的数据量,尽量避免误删
// 根据字段值并发删除符合条件的所有文档POST index_name/_delete_by_query?slices=auto{ \"query\": { \"term\": { \"name\": \"memory\" } }}
12. 强制刷新索引
POST index_name/_refresh
ES虽然是能够存储大量数据的非关系型数据库,但当数据量过大的时候,查询速度也会很慢。尤其建表之后无法修改字段,导致需要修改的时候就要迁移一次数据,很麻烦。前期要做好设计,对字段的设计,比如是否需要使用text类型,是否需要分词;数据量超大时要注意分片,如果默认创建,分片就是两个,如果后期查询时间太慢需要改分片数量,又需要进行一次数据迁移。所以要在前期考虑好这些参数。以及根据业务,灵活调整数据结构,如果有常用的搜索字段,可以和其他的关系型数据库联合使用,不是非要全都存在es里,否则后期都是坑;;