ES使用操作

ES使用操作

索引操作

1. 创建索引

PUT请求是幂等的,即对同一个文档多次执行相同的PUT请求会产生相同的结果。这意味着多次执行PUT请求不会导致文档的重复或多次更新。而POST请求不是幂等的,多次执行相同的POST请求会创建多个相同的文档。

PUT http://{{ServiceIP}}/index_name

image-20230920220835051

2. 检索创建的索引

GET http://{{ServiceIP}}/_cat/indices?v

image-20230920222035205

表头含义
health当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status索引打开、关闭状态
index索引名
uuid索引统一编号
pri主分片数量
rep副本数量
docs.count可用文档数量
docs.deleted文档删除状态(逻辑删除)
store.size主分片和副分片整体占空间大小
pri.store.size主分片占空间大小

3. 检索索引详情

GET http://{{ServiceIP}}/index_name

image-20230920223222083

{
    "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

image-20230920221707813

文档操作

1. 文档创建

索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式

添加随机id文档
POST http://{{ServiceIP}}/index_name/_doc

在下面的id中可以看出是随机id

image-20230920222940800

{
    "_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数据,方便用于管理

image-20230920224134825

批量添加文档

[批量 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"
    }
  }
}

image-20230920225728595

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"
    }
  }
}

在这里只有一条数据匹配

image-20230920233837405

multi_match多字段查询

multi_match比是可以设置多个字段检索

POST http://{{ServiceIP}}/user/_search
{
  "query": {
    "multi_match": {
      "query":"content",
      "fields":["field1","field2"]
    }
  }
}

下面检索的就是name,tel字段中能匹配到wanghaonan的数据

image-20230920234947312

terms 检索

termsmysql中的in 一样

POST http://{{ServiceIP}}/index_name/_search
{
    "query": {
        "terms": {
            "field_name": [
                "content1",
                "content2"
            ]
        }
    }
}

image-20230920234422076

fuzzy模糊查询

fuzzy和term一样,也不会将query进行分词,但是不同的是它在进行匹配时可以容忍你的词语拼写有错误,至于容忍度如何,是根据参数fuzziness决定的。fuzziness默认是2,也就是在默认情况下,fuzzy查询容忍你有两个字符及以下的拼写错误。即如果你要匹配的词语为test,但是你的query是text,那也可以匹配到.

POST http://{{ServiceIP}}/user/_search
{
  "query": {
    "fuzzy": {
      "field_name":"content"
    }
  }
}

image-20230920235723842

range范围查询

range查询时对于某一个数值字段的大小范围查询

  1. gte:大于等于
  2. gt:大于
  3. lt:小于
  4. lte:小于等于
POST http://{{ServiceIP}}/index_name/_search
{
    "query": {
        "range": {
            "field_name": {
                "gte": 1,
                "lt": 5
            }
        }
    }
}

image-20230921000200665

高亮检索
POST http://{{ServiceIP}}/{{Index_name}}/_search
{
    "query": {
        "match": {
            "query_field_name": "query content"
        }name
    },
    "_source": [
        "show_field_name"
    ],
    "highlight": {
        "fields": {
            "highlight_field_na'me": {}
        }
    }
}

image-20230921155636970

高亮字段可以是正则匹配,匹配上的字符便会加上高亮

image-20230921161436450

聚合查询
POST http://{{ServiceIP}}/{{Index_name}}/_doc/_search
{
    "from": 0,
    "size": 0,
    "aggs": {
        "all_add": {// 聚合的名字
            "terms": {
                "field": "age"
            }
        }
    }
}

image-20230921163631562

官网上还给了例子再局和内部还可以镜像其他的操作,聚合加强版操作

image-20230921164016549

使用id进行检索

这个方法很少用太笨了

GET http://{{ServiceIP}}/index_name/_doc/id

image-20230920230256165

分页检索
GET http://{{ServiceIP}}/index_name/_search
// 这里检索的意思是从下标0开始向后检索两个和mysql一样
{
    "query": {
        "match_all": {}
    },
    "from": 0, // 起始的下标位置 
    "size": 2 // 检索的大小
}

image-20230920231017441

排序检索
POST http://{{ServiceIP}}/index_name/_search
{
    "query": {
        "match_all": {}
    },
    "from":0, // 从第0个开始
    "size":3, // 显示3个
    "_source":["age"],// 只显示age字段
    "sort": { // 排序
        "field_name": { // 根据age字段排序
            "order": "asc" // 正序排序
        }
    }
}

image-20230920231854081

多条件检索

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整体和原文进行匹配

  1. must:代表且的关系,也就是必须要满足该条件
  2. should:代表或的关系,代表符合该条件就可以被查出来
  3. must_not:代表非的关系,也就是要求不能是符合该条件的数据才能被查出来

上面检索的意思是nameage分词检索必须匹配wanghaonan18,或tel完全匹配123456的数据

image-20230920233405916

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之类的,这里便不去介绍如何安装了,感兴趣的可以查阅相关文章。

image-20230920225056686

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值