ElasticSearch的基本操作

1. 节点

概念:节点是一个服务器,属于某个集群数据,参与集群的索引和搜索功能。与集群一样,节点也是通过名称来标识的。默认情况下,启动时会分配给节点一个UUID(全局唯一的标识符)作为名称。如果需要,可以节点取名,通常取名时应考虑功能方便识别和管理。默认情况下,节点加入名为elaticsearch的集群,通过设置节点的集群名,可加入指定集群。

2. 索引

​ 索引是具有某种特征的文档集合,相当于一本书的目录,如果,可以为客户数据建立索引,为订单数据建立另一个索引。索引由名称标识,可以使用改名称,对索引中的文档进行建立索引、搜索、更新和删除等操作。一个集群中,索引数量不受限制。

​ 类似于rdbms的database,对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中。在7.之后被淘汰

3. 类型(Type)

​ 类似于rdbms的table,但是与其说像table,其实更像面向对象中的class,同一Json的格式的数据集合。

4. 文档(Document)

文档是可以建立索引的基本信息单元,相当于书的具体章节。

列如:可以为单个客户创建一个文档,为单个订单创建另外一个文档。文档用JSON(JavaScript对象表示法)表示。在索引中,理论上可以存储任意数量的文档。

类似于rdbms的row、面向对象里的object

5. 字段|属性(Field)

​ 相当于字段,属性

6. 分片与副本(Shards & Replicas)

索引可能存储大量数据,数据量可能超过单个节点的硬件限制。

切割方式有:

​ a.水平切割:允许水平切割内容,以便内容可以存储到普通的服务器中

​ b. 允许跨分片操作(如查询时,查询多个分片),提高性能/吞吐量

7. ES概念与MySQL关系对比

MYSQLES5.XES6.XES7.X
Databaseindex
TableTypeIndex(成了摆设)Index(被移除掉)
RowDocumentDocument
ColumnFieldField

3.ElasticSearch RestFulAPI(DSL)

1. 全局操作

  1. 查看集群的健康情况

    GET /_cat/health?v

    status的值含义

    1. green(绿) 一切正常(集群功能齐全)

    2. yellow(黄) 所有数据可用,但是有些副本尚未分配(集群功能完全)

    3. red(红) 有些数据不可用(集群部分功能)

  2. 查看节点情况

  3. GET /_cat/nodes?v

2. 对索引的操作

  1. 查询各个索引的状态

    GET /_cat/indices?v

  2. 创建索引

    PUT /moviee_index
    #PUT /索引名

  3. 删除索引

    DELETE /moviee_index

    返回true表示删除成功

  4. 查看某一个索引的分片情况

    GET /_cat/shards/moviee_index

3. 对文档的操作

  1. 创建文档

    格式:PUT/索引名/类型名/文档id

    PUT /moviee_index/movie/1
    {
      "id":100,
      "name":"operation red sea",
      "doubanScore":8.5,
      "actorList":[
          {"id":1,"name":"zhang yi"},
          {"id":2,"name":"hai qing"},
          {"id":3,"name":"zhang han yu"}
        ]
    }

  2. 查询某一个索引中的全部文档

    GET /movie_index/_search
    DELETE /movie_index/movie/3

  3. 根据文档id查看文档

    格式:GET/索引名/类型名/文档名id

    GET /movie_index/movie/3

  4. 根据文档id,删除某一个文档

    格式:DELETE /索引名/类型名/文档id

     

    删除成功后会给"result"的值标为:"deleted"

  5. 对文档的修改

    语法格式:PUT/索引名/类型名/文档id

    PUT /movie_index/movie/3
    {
      "id":300,
      "name":5.0,
      "actorList":[
          {"id":4,"name":"zhang suishan"}
        ]
    }

  6. 更新某一个文档的字段值

    #语法:POST /索引名/类型/文档id/_update
    POST /movie_index/movie/3/_update
    {
      "doc": {"name":"小红"}
    }
    #其中要更新的内容必须放在"doc"中

  7. 批处理

    语法格式: POST /索引名/类型名/_bulk

    1. 需要一:批量创建两个文档

    POST /movie_index/movie/_bulk
    {"index":{"_id":66}}
    {"id":300,"name":"incident red sea","doubanScore":5.0,"actorList":[{"id":4,"name":"zhang cuishan"}]}
    {"index":{"_id":88}}
    {"id":300,"name":"incident red sea","doubanScore":5.0,"actorList":[{"id":4,"name":"zhang cuishan"}]}
    1. 在一个批量操作中,先更新第一个文档(ID 为 66),再删除第二个文档(ID 为 88)

      POST /movie_index/movie/_bulk
      {"update":{"_id":"66"}}
      {"doc": { "name": "wudangshanshang" } }
      {"delete":{"_id":"88"}}

  8. 根据某字段的名称查询(这里根据电影名称查询)

    #根据电影名称查询
    GET /movie_index/_search
    {
      "query":{
        "match":{
          "name": "operation red sea"
        }
      }
    }
    #match表示分词查询

  9. 不分词查询(这里根据影员的名字查询),相当于mysql中的like查询

    GET /movie_index/_search
    {
      "query": {
        "match_phrase": {
          "actorList.name": "zhang han yu"
        }
      }
    }
    #不分词查询match_phrase

  10. 不分词,通过精准匹配进行查询 term精准匹配

    #不分词,通过精准匹配进行查询 term精准匹配
    GET /movie_index/_search
    {
      "query": {
        "term": {
          "actorList.name.keyword":"zhang han yu"
        }
      }
    }
    #查询影员名字为"zhang han yu"的电影

  11. 容错匹配

    #容错匹配
    GET /movie_index/_search
    {
      "query": {
        "fuzzy": {
          "name": "rivar"
        }
      }
    }
    #这里的rivar原本为:"river",但是也能查询出结果来
  12. 范围过滤

    #范围过滤,将豆瓣评分在6到9的文档查询出来
    GET /movie_index/_search
    {
      "query": {
        "range": {
          "doubanScore": {
            "gte": 6,
            "lte": 9
          }
        }
      }
    }

  13. 根据某字段降序排序

    #按照豆瓣评分降序排序
    GET /movie_index/_search
    {
      "sort": [
        {
          "doubanScore": {
            "order": "desc"
          }
        }
      ]
    }
    #"sort"关键字
    #"doubanScore":这是文档中的某个字段
    #"desc"降序排序的关键字

  14. 将包含river的所有电影按照评分降序排序

    #按照豆瓣评分降序排序
    GET /movie_index/_search
    {
      "query": {
        "match": {
          "name": "river"
        }
      },
      "sort": [
        {
          "doubanScore": {
            "order": "desc"
          }
        }
      ]
    }

  15. 分页查询

    #表示从第一条数据开始,查询一条数据数来
    GET /movie_index/_search
    {
      "from": 0
      , "size": 1
    }
    ​
    #from的值表示查询的起始位置,size表示要显示几条数据

  16. 查询指定字段

    GET /movie_index/_search
    {
      "_source": ["name","doubanScore"]
    }

  17. 将查询的关键字在查询结果中高亮显示出来

    #将查询的关键字在查询结果中高亮显示出来
    GET /movie_index/_search
    {
      "query": {
        "match": {
          "name":"river"
        }
      },
      "highlight": {
        "fields": {"name":{}}
      }
    }
    #查询结果中river高亮显示

4. 聚合操作

  1. 需要一:取出每个影员共参演了多少部电影

    #aggs  聚合操作的关键字
    #myaggs 聚合的名字,自己可以随意取名
    #聚合类型,这里选择terms
    #actorList.name.keyword 表示根据actorList.name分组,但是不分词
    GET /movie_index/_search
    {
      "aggs": {
        "myaggs": {
          "terms": {
            "field": "actorList.name.keyword",
            "size": 10
            }
        }
      }
    }

  2. 每个影员参演电影的平均分是多少,并按评分排序

    #
    GET /movie_index/_search
    {
      "aggs": {
        "groupByName": {        #分组名
          "terms": {
            "field": "actorList.name.keyword",
            "size": 10,
            "order": {
              "avg_score": "asc"        #这里的是在下面求的平均分拍升序
            }
          },
          "aggs": {
            "avg_score": {
              "avg": {  #求平均值
                "field": "doubanScore"      #求doubanScore字段的平均值
              }
            }
          }
        }
      }
    }
    ​
    #注意在json代码内部是不可以添加注释的,这里是为了方便注解

5. 分词

  1. 英文默认分词

    GET /_analyze
    {
      "text": "hello word"
    }

  2. 中文默认分词(不推荐使用)

    GET /_analyze
    {
      "text": "我是一个非常爱睡觉的人"
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GQYOneWater

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值