ES使用操作
索引操作
1. 创建索引
PUT请求是幂等的,即对同一个文档多次执行相同的PUT请求会产生相同的结果。这意味着多次执行PUT请求不会导致文档的重复或多次更新。而POST请求不是幂等的,多次执行相同的POST请求会创建多个相同的文档。
PUT http://{{ServiceIP}}/index_name
2. 检索创建的索引
GET http://{{ServiceIP}}/_cat/indices?v
表头 | 含义 |
---|---|
health | 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常) |
status | 索引打开、关闭状态 |
index | 索引名 |
uuid | 索引统一编号 |
pri | 主分片数量 |
rep | 副本数量 |
docs.count | 可用文档数量 |
docs.deleted | 文档删除状态(逻辑删除) |
store.size | 主分片和副分片整体占空间大小 |
pri.store.size | 主分片占空间大小 |
3. 检索索引详情
GET http://{{ServiceIP}}/index_name
{
"shopping": { // 索引名称
"aliases": {}, // 这是一个空对象,用于存储别名相关的配置信息。在此结果中,别名未定义。
"mappings": {}, // 这是一个空对象,用于存储索引的映射信息,包括字段的数据类型、分词器等。在此结果中,映射未定义。
"settings": { // 索引的设置信息,包含了索引级别的各种配置项
"index": { // 索引级别的设置信息
"routing": { // 路由策略的配置信息
"allocation": { //数据分片分配的配置信息
"include": { //包含数据分片分配相关配置的对象
"_tier_preference": "data_content" //控制数据分配偏好的配置项,指定了数据分配的偏好策略为"data_content"
}
}
},
"number_of_shards": "1", //索引的分片数,即在此结果中索引的分片数为1
"provided_name": "shopping", // 索引的提供的名称,即在此结果中索引的名称为"shopping"
"creation_date": "1695219617958", // 索引的创建日期,表示为一个时间戳
"number_of_replicas": "1", // 索引的副本数,即在此结果中索引的副本数为1
"uuid": "ELK_h7rTT-ePH04m5OOsYg", //索引id
"version": { // 索引的版本信息
"created": "7170599" // 索引的创建版本号
}
}
}
}
}
4. 删除索引
DELETE http://{{ServiceIP}}/index_name
文档操作
1. 文档创建
索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式
添加随机id文档
POST http://{{ServiceIP}}/index_name/_doc
在下面的id中可以看出是随机id
{
"_index": "user",// 索引信息
"_type": "_doc", // 文档类型
"_id": "_sXs5I4BawIgNvjwO-SQ", //id
"_version": 1, // 版本号,每一次对文档进行修改都会增加版本号
"result": "created", //结果 这里的 created 表示创建成功
"_shards": { //分片信息
"total": 2, //分片总数2
"successful": 1, //分片成功1
"failed": 0 // 分片失败0
},
"_seq_no": 0,
"_primary_term": 1
}
指定id添加文档
POST http://{{ServiceIP}}/index_name/_doc/id
在下下面就能看出是指定好的id数据,方便用于管理
批量添加文档
[批量 API |Elasticsearch 指南 8.13] |弹性的
http://{{ServiceIP}}/_bulk
{"index":{"_index":"books"}} // 这里指定添加文档的索引等信息
{"name":"Revelation Space","author":"Alastair Reynolds","release_date":"2000-03-15","page_count":585} // 这里时文档的json格式 内容
{"index":{"_index":"books"}}
{"name":"1984","author":"George Orwell","release_date":"1985-06-01","page_count":328}
{"index":{"_index":"books"}}
{"name":"Fahrenheit 451","author":"Ray Bradbury","release_date":"1953-10-15","page_count":227}
{"index":{"_index":"books"}}
{"name":"Brave New World","author":"Aldous Huxley","release_date":"1932-06-01","page_count":268}
{"index":{"_index":"books"}}
{"name":"The Handmaids Tale","author":"Margaret Atwood","release_date":"1985-06-01","page_count":311}
2. 文档查询
match检索
match
会将你搜索的query
进行分词的查询方法和mysql
中的模糊查询差不多
POST http://{{ServiceIP}}/index_name/_search
{
"query": {
"match": {
"field_name":"content"
}
}
}
term 精确匹配检索
term查询也是比较常用的一种查询方式,它和match的唯一区别就是match需要对query进行分词,而term是不会进行分词的,它会直接拿query整体和原文进行匹配。
match_phrase 分词精确检索
match_phrase和match一样也是会对你的搜索query进行分词,但是,不同的是它不是匹配到某一处分词的结果就算是匹配成功了,而是需要query中所有的词都匹配到,而且相对顺序还要一致,而且默认还是连续的
POST http://{{ServiceIP}}/index_name/_search
{
"query": {
"match_phrase": {
"name":"search content"
}
}
}
在这里只有一条数据匹配
multi_match多字段查询
multi_match比是可以设置多个字段检索
POST http://{{ServiceIP}}/user/_search
{
"query": {
"multi_match": {
"query":"content",
"fields":["field1","field2"]
}
}
}
下面检索的就是name
,tel
字段中能匹配到wanghaonan
的数据
terms 检索
terms
和mysql
中的in
一样
POST http://{{ServiceIP}}/index_name/_search
{
"query": {
"terms": {
"field_name": [
"content1",
"content2"
]
}
}
}
fuzzy模糊查询
fuzzy和term一样,也不会将query进行分词,但是不同的是它在进行匹配时可以容忍你的词语拼写有错误,至于容忍度如何,是根据参数fuzziness决定的。fuzziness默认是2,也就是在默认情况下,fuzzy查询容忍你有两个字符及以下的拼写错误。即如果你要匹配的词语为test,但是你的query是text,那也可以匹配到.
POST http://{{ServiceIP}}/user/_search
{
"query": {
"fuzzy": {
"field_name":"content"
}
}
}
range范围查询
range查询时对于某一个数值字段的大小范围查询
- gte:大于等于
- gt:大于
- lt:小于
- lte:小于等于
POST http://{{ServiceIP}}/index_name/_search
{
"query": {
"range": {
"field_name": {
"gte": 1,
"lt": 5
}
}
}
}
高亮检索
POST http://{{ServiceIP}}/{{Index_name}}/_search
{
"query": {
"match": {
"query_field_name": "query content"
}name
},
"_source": [
"show_field_name"
],
"highlight": {
"fields": {
"highlight_field_na'me": {}
}
}
}
高亮字段可以是正则匹配,匹配上的字符便会加上高亮
聚合查询
POST http://{{ServiceIP}}/{{Index_name}}/_doc/_search
{
"from": 0,
"size": 0,
"aggs": {
"all_add": {// 聚合的名字
"terms": {
"field": "age"
}
}
}
}
官网上还给了例子再局和内部还可以镜像其他的操作,聚合加强版操作
使用id进行检索
这个方法很少用太笨了
GET http://{{ServiceIP}}/index_name/_doc/id
分页检索
GET http://{{ServiceIP}}/index_name/_search
// 这里检索的意思是从下标0开始向后检索两个和mysql一样
{
"query": {
"match_all": {}
},
"from": 0, // 起始的下标位置
"size": 2 // 检索的大小
}
排序检索
POST http://{{ServiceIP}}/index_name/_search
{
"query": {
"match_all": {}
},
"from":0, // 从第0个开始
"size":3, // 显示3个
"_source":["age"],// 只显示age字段
"sort": { // 排序
"field_name": { // 根据age字段排序
"order": "asc" // 正序排序
}
}
}
多条件检索
bool查询是上面查询的一个综合,它可以用多个查询去组合出一个大的查询语句
GET http://{{ServiceIP}}/index_name/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "wanghaonan"
}
},
{
"match": {
"age": 18
}
}
],
"should": {
"term":{ //
"tel": "123456"
}
}
}
}
}
term查询是比较常用的一种查询方式,它和match的唯一区别就是match需要对query进行分词,而term是不会进行分词的,它会直接拿query整体和原文进行匹配
- must:代表且的关系,也就是必须要满足该条件
- should:代表或的关系,代表符合该条件就可以被查出来
- must_not:代表非的关系,也就是要求不能是符合该条件的数据才能被查出来
上面检索的意思是
name
和age
分词检索必须匹配wanghaonan
和18
,或tel
完全匹配123456
的数据
3. 文档修改
根据id修改
整体替换 相同id的文档 如果有个字段为空 也会被赋值为空
// POST :http://{{ServiceIP}}/{{Index_name}}/_doc/user20230920
{
"name":"wanghaonan update",
"address":"南京",
"age":18,
"email":"123456789@qq.com",
"tel":"123456"
}
修改指定字段
// POST : http://{{ServiceIP}}/{{Index_name}}/_update/user20230920
{
"doc": {
"name": "wanghaonan update",
"address": "南京11"
}
}
使用Script 脚本批量修改
// POST : http://{{ServiceIP}}/{{Index_name}}/_update_by_query
{
"script": {
"lang": "painless",
// 修改文档中name属性的值为zhangsan的为 whnn
"source": "if (ctx._source.name == 'zhangsan'){ctx._source.name='whnn'}"
}
}
4. 分词器
POST http://{{ServiceIP}}/_analyze
这里需要指定一个分词器,ES默认的分词器是standard,不过只支持英文分词,如果你用它来对中文进行分词的话会直接按字拆分,有一些中文分词器可以下载使用,像ik或者jieba之类的,这里便不去介绍如何安装了,感兴趣的可以查阅相关文章。