Elasticsearch学习笔记(1) -- 环境安装和简单CRUD

406 阅读4分钟

1、核心概念

  • Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

  • Cluster:集群,集群中有多个节点(Node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点。集群中有多个节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点。

  • Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。

  • Document&field:文档,es中的最小数据单元。一个document可以是一条客户数据,一条商品分类数据等,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

    product document

    { "product_id": "1", "product_name": "高露洁牙膏", "product_desc": "高效美白", "category_id": "2", "category_name": "日化用品" }

  • Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引等,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据(所有的商品document)。

  • Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

  • shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

  • replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。

2、环境安装

为了快速安装elasticsearch的环境,采用docker-compose来安装。本次安装ealsticsearch集群为双节点,为了查询方便,安装kibina。完整脚本如下:

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
    container_name: es02
    environment:
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet
  kibana:
    image: kibana:7.3.0
    container_name: kibana
    restart: always
    depends_on: 
      - es01
    environment:
      SERVER_NAME: kibana
      ELASTICSEARCH_HOSTS: http://es01:9200 
    #volumes:
    # - ./kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - 5601:5601
    networks:
      - esnet    

volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local

networks:
  esnet:

执行docker-compose up启动,本地访问curl http://localhost:9200,可以得到如下结果:

image-20190808171026876

在浏览器访问Kibina,默认地址为:http://localhost:5601,左侧点击进入Dev Tools界面。执行GET _cluster/health来查看集群健康状况。

image-20190808172540682

3、集群健康检查和简单操作索引

es提供了一套api,叫做cat api,可以查看es中各种各样的数据。

3.1、集群健康状况

GET /_cat/health?v(?v代表显示列头)

image-20190808172708184

​ green:每个索引的primary shard和replica shard都是active状态的 ​ yellow:每个索引的primary shard都是active状态的,但是部分replica shard处于不可用的状态 ​ red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了

3.2、查询索引

GET /_cat/indices?v

image-20190808172940215

3.3、创建索引

PUT /test_index?pretty

image-20190808173755758

执行后查询索引:

image-20190808173834279

3.4、删除索引

DELETE /test_index?pretty

image-20190808173942552

  • 执行后查询索引:

image-20190808173249504

4、商品的CRUD操作

4.1、新增商品

PUT /index/type/id
{
  "json数据"
}

es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索

PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

PUT /ecommerce/product/2
{
    "name" : "jiajieshi yagao",
    "desc" :  "youxiao fangzhu",
    "price" :  25,
    "producer" :      "jiajieshi producer",
    "tags": [ "fangzhu" ]
}

PUT /ecommerce/product/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}

4.2、获取商品

GET /ecommerce/product/1

4.3、更新商品

4.3.1、全量更新

PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

4.3.2、部分更新

POST /ecommerce/product/1/_update
{
  "doc": {
    "name": "jiaqiangban gaolujie yagao"
  }
}

4.4、删除商品

DELETE /ecommerce/product/1