Elasticsearch

Elasticsearch

倒排索引,面向文档存储,文档数据会被序列化为json格式后储存

在这里插入图片描述

  • Es与数据库:

    • Mysql:擅长事物类型操作,可确保数据的安全和一致性
    • Elasticsearch:擅长海量数据的搜索、分析、计算
  • 索引(index):同类型文档的集合

  • 映射(mapping):索引中文档的约束,类似于表结构约束

  • 文档:一条数据就是一个文档,es中是json格式

  • 字段:json文档中的的字段

安装

部署单点ES

  • 创建网络

    docker network create es-net
    

    让es和kibana容器互联

  • 加载镜像

    docker pull elasticsearch:7.12.1
    

    Mac在镜像名称前加arm64v8/

  • 运行:

    docker run -d \
    	--name es \
        -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
        -e "discovery.type=single-node" \
        -v es-data:/usr/share/elasticsearch/data \
        -v es-plugins:/usr/share/elasticsearch/plugins \
        --privileged \
        --network es-net \
        -p 9200:9200 \
        -p 9300:9300 \
    elasticsearch:7.12.1
    
    • -e设置环境变量
      • "ES_JAVA_OPTS=-Xms512m -Xmx512m":内存大小
      • "discovery.type=single-node":非集群模式
      • "cluster.name=es-docker-cluster":设置集群名称
      • "http.host=0.0.0.0":监听的地址,可外网访问
    • -v挂载
      • es-data:/usr/share/elasticsearch/data:挂载数据卷卷,绑定es的数据目录
      • es-logs:/usr/share/elasticsearch/logs:挂载数据卷,绑定es的日志目录
      • es-plugins:/usr/share/elasticsearch/plugins:挂载数据卷,绑定es的插件目录
    • --privileged:授予逻辑卷访问权
    • --network es-net:加入一个名为es-net的网络中
    • -p 9200:9200:端口映射配置
  • 检查是否正常运行:

    curl http://localhost:9200
    

部署kibana

  • 拉取镜像:

    docker pull kibana:7.12.1
    

    版本需与ES一致

  • 部署:

    docker run -d \
    --name kibana \
    -e ELASTICSEARCH_HOSTS=http://es:9200 \
    --network=es-net \
    -p 5601:5601  \
    kibana:7.12.1
    
    • --network es-net :加入一个名为es-net的网络中,与elasticsearch在同一个网络中
    • -e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
    • -p 5601:5601:端口映射配置
  • 查看运行日志:

    docker logs -f kibana
    

    访问:http://127.0.0.1:5601

安装IK分词器

  • 在线安装ik插件(Mac推荐)(较慢,不推荐)

    网址:https://github.com/infinilabs/analysis-ik

    #进入容器内部,Mac报错:docker exec -it -u 0 es /bin/bash
    docker exec -it elasticsearch /bin/bash
    
    # 在线下载并安装
    ./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
    
    #查看ik插件
    elasticsearch-plugin list
    
    #退出
    exit
    #重启容器
    docker restart elasticsearch
    
  • 离线安装ik插件(推荐)

    • 查看数据卷目录

      docker volume inspect es-plugins
      
    • 下载ik,解压安装宝,重命名为ik

      • 网址:https://release.infinilabs.com/
    • 将ik包拖到该目录(es容器插件的数据卷)

    • 重启容器

      # 容器容器
      docker restart es
      
      # 查看es日志
      docker logs -f es
      
    • 测试

      • IK分词器包含两种模式:

        • ik_smart:最少切分
        • ik_max_word:最细切分
        GET /_analyze
        {
          "analyzer": "ik_max_word",
          "text": "中华人民共和国国歌"
        }
        
扩展词词典
  • 配置ik分词器config目录中的IKAnalyzer.cfg.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
            <comment>IK Analyzer 扩展配置</comment>
            <!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
            <entry key="ext_dict">ext.dic</entry>
    </properties>
    
  • 新建ext.dic,在词典中添加拓展词条

    wow
    绝绝子
    
  • 重启elasticsearch

    docker restart es
    
    # 查看日志
    docker log -f elasticsearch
    

Tips:当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑

停用词词典
  • IKAnalyzer.cfg.xml配置文件内容添加:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
            <comment>IK Analyzer 扩展配置</comment>
            <!--用户可以在这里配置自己的扩展字典-->
            <entry key="ext_dict">ext.dic</entry>
             <!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典-->
            <entry key="ext_stopwords">stopword.dic</entry>
    </properties>
    
  • 在 stopword.dic 添加停用词

    赌博
    
  • 重启elasticsearch

    # 重启服务
    docker restart elasticsearch
    docker restart kibana
    
    # 查看 日志
    docker logs -f elasticsearch
    
  • 测试效果:

    GET /_analyze
    {
         
      "analyzer": "ik_max_word",
      "text": "中国不允许赌博!"
    }
    

    当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑

拼音分词器

自动补全用,详情看自动补全

网址:https://github.com/medcl/elasticsearch-analysis-pinyin

7.12.1:https://github.com/medcl/elasticsearch-analysis-pinyin/releases/tag/v7.12.1

须保持和ES版本一致

  • windows安装

    • 解压

    • 上传到虚拟机中,es的plugin目录

    • 重启es

      docker restart es
      
    • 在kibana测试

      POST /_analyze
      {
             
        "text": ["深岩银河是真滴好玩"],
        "analyzer": "pinyin"
      }
      
  • Mac安装

    • 进入es容器:

      docker exec -it -u 0 es /bin/bash
      
    • 下载py插件压缩包:

      ./bin/elasticsearch-plugin  install https://github.com/infinilabs/analysis-pinyin/releases/download/v7.12.1/elasticsearch-analysis-pinyin-7.12.1.zip
      
    • 查看py插件:

      elasticsearch-plugin list
      
    • 重启es:

      docker restart es
      
    • 在kibana测试:

      POST /_analyze
      {
             
        "text": ["深岩银河是真滴好玩"],
        "analyzer": "pinyin"
      }
      

部署ES集群

创建es集群:

要求Linux虚拟机至少有4G的内存空间

  • 编写一个docker-compose文件,如下示例:

    version: '2.2'
    services:
      es01:
        image: elasticsearch:7.12.1
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es02,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      es02:
        image: elasticsearch:7.12.1
        container_name: es02
        environment:
          - node.name=es02
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        volumes:
          - data02:/usr/share/elasticsearch/data
        ports:
          - 9201:9200
        networks:
          - elastic
      es03:
        image: elasticsearch:7.12.1
        container_name: es03
        environment:
          - node.name=es03
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es02
          - cluster.initial_master_nodes=es01,es02,es03
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        volumes:
          - data03:/usr/share/elasticsearch/data
        networks:
          - elastic
        ports:
          - 9202:9200
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    
    networks:
      elastic:
        driver: bridge
    
    • cluster.name 集群名称,es内集群名称一致会自动归类到同一集群下
  • es运行需要修改一些linux系统权限,修改/etc/sysctl.conf文件

    vi /etc/sysctl.conf
    
  • 添加如下内容:

    vm.max_map_count=262144
    
  • 执行命令,让配置生效:

    sysctl -p
    
  • 通过docker-compose启动集群:

    docker-compose up -d
    
集群状态监控

官网:https://github.com/lmenezes/cerebro

  • kibana可以监控es集群,但新版本需依赖es的x-pack 功能,配置较复杂(不推荐

  • 推荐使用cerebro来监控es集群状态

    夸克网盘有安装包解压即可:https://pan.quark.cn/s/6c282455342d

    • 进入bin目录

    • 双击cerebro.bat文件即可启动服务

    • 访问http://localhost:9000 即可进入管理页面

    • 输入ES任意节点的地址和端口,点击connect即可

      绿色的条,代表集群处于绿色(健康状态)

创建索引库
用Kibana的DevTools创建
  • 在DevTools中输入指令:

    PUT /索引库名
    {
         
      "settings": {
         
        "number_of_shards": 3, // 分片数量
        "number_of_replicas": 1 // 副本数量
      },
      "mappings": {
         
        "properties": {
         
          // mapping映射定义 ...
        }
      }
    }
    
用cerebro创建
  • 点击左上角more --> create index

  • 填写索引库信息:索引库名、分片数量、备份数量

  • 点击create即可

  • 回到首页,即可查看索引库分片效果

    实线是主分片,虚线是副本分片;主、副分片都在不同节点上

DSL

索引库操作

mapping属性

对索引库中文档的约束

  • type:字段数据类型,常见的类型:

    • 字符串:text(可分词的文本)、keyword(精确值)

    • 数值:long、integer、short、byte、double、float

    • 布尔:boolean

    • 日期:date

    • 对象:object

    • 地理坐标数据类型:

      • geo_point

        由纬度和经度确定的一个点。

        例如:“32.8752345,120.2981576”

      • geo_shape

        有多个geo_point组成的复杂几何图形。

        例如一条直线,“LINESTRING (-77.03653 38.897676,-77.009051 38.889939)”

  • index:是否创建索引,默认true

  • analyzer:选择分词器

  • properties:子字段

  • copy_to:字段拷贝,将当前字段拷贝到指定字段

    //示例
    "字段名1": {
         
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "bran": {
         
      "type": "keyword",
      "copy_to": "字段名1"
    }
    
创建索引库
PUT /{
   索引库名}
{
   
 "mappings": {
   
   "properties": {
   
     "字段名1": {
   
       "type": "text ",
       "analyzer": "ik_smart"
     },
     "字段名2": {
   
       "type": "keyword",
       "index": false
     },
     "字段名3": {
   
       "type": "object",
       "properties": {
   
         "子字段1": {
   
           "type": "keyword"
         },
         "子字段2": {
   
           "type": "keyword"
         }
       }
     },
     // ...略
   }
 }
}

示例:

PUT /test
{
   
  "mappings": {
   
    "properties": {
   
      "info": {
   
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
   
        "type": "keyword",
        "index": false
      },
      "name": {
   
        "type": "object",
        "properties": {
   
          "firstName": {
   
            "type": "keyword"
          },
          "lastName": {
   
            "type": "keyword"
          }
        }
      }
    }
  }
}
查看、删除索引库
  • 查看:

    GET /索引库名
    
  • 删除:

    DELETE /索引库名
    
修改索引库

索引库和mapping一旦创建无法修改,但可添加新的字段

PUT /索引库名/_mapping
{
   
  "properties": {
   
    "新字段名": {
   
      "type": "integer"
    }
  }
}

文档操作

新增文档
POST /索引库名/_doc/文档id
{
   
  "字段1": "值1",
  "字段2": "值2",
  "字段3": {
   
    "子属性1": "值3",
    "子属性2": "值4"
  },
  // ......
}
查看、删除文档
  • 查看:

    GET /索引库名/_doc/文档ID
    
  • 删除:

    DELETE /索引库名/_doc/文档ID
    
修改文档
  • 全量修改

    删除就文档,添加新文档

    PUT /索引库名/_doc/文档ID
    {
         
      "字段1"</
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值