SpringCloud学习笔记(十)ElasticSearch基础1~3

10.Elastic Search

10.1 概念

ES是一个实时分布式搜索和分析引擎,基于Java并使用Lucene引擎作为核心来实现所有索引和搜索功能,通过RESTful API隐藏Lucene的复杂性。(同类型搜索引擎还有Solr等.)

应用:

  • 维基百科使用ES提供全文搜索并高亮关键字,以及实时搜索、搜索纠错
  • StackOverflow全文检索
  • GitHub使用ES检索代码
  • 日志数据分析:ELK技术,数据可视化 Kibana;存储、计算、搜索数据ElasticSearch;数据抓取Logstash、Beats
  • 商品价格监控,用户设定商品价格阈值,当价格低于阈值时发消息给客户
image-20230703155801590
image-20230703155826385

倒排索引

正排索引:文档->关键字的映射

image-20230703155927352

倒排索引:关键字->文档的映射

image-20230703155949956

倒排索引基本原理:

image-20230703160221570
image-20230703160230077

ES与MySQL概念对比

MySQLElasticSearch
DatabaseIndex(索引,相同类型的文档集合)
Tables(表)Types(类型)
Rows(行)Documents(文档,JSON格式)
Columns(列)Field(字段)
SchemaMapping(映射,字段类型约束)
SQLDSL(JSON风格请求语句,实现CRUD,与语言无关)
擅长事务,确保数据安全性和一致性擅长海量数据的搜索、分析、计算

10.2 安装

安装ES和Kibana

可以采用docker-compose一键安装ELK,也可以分别部署。

docker-compose方法:

 # docker-compose.yml
 version: '3'
 services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.8.1
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - 9200:9200
      - 9300:9300
 ​
  kibana:
    image: docker.elastic.co/kibana/kibana:8.8.1
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch #要求了es先启动
       
 # 在docker-compose.yml所在目录启动
 docker-compose up

分别部署:

1.创建网络

创建桥接网络让ES和Kibana容器互联。在Docker中,桥接网络是一种默认的网络驱动程序,它允许容器通过桥接接口连接到宿主机的网络。通过将容器加入同一个桥接网络,这些容器可以相互通信,并且宿主机也可以与这些容器进行通信。

 docker network create es-net

2.加载es和kibana镜像,注意这两者版本要一致(不建议用最新8.8.1版本,因为ik分词器还没出对应版本)(2023年7月4日更新:17小时前ik8.8.1更新了!)

 docker pull elasticsearch:8.8.1
 docker pull kibana:8.8.1

3.运行docker容器

运行es

 docker run -d \
 --name es \
 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ #设置ES运行内存512M,我的linux运行内存比较小
 -e "discovery.type=single-node" \ #单点模式,集群时要改
 -v es-data:/usr/share/elasticsearch/data \
 -v es-plugins:/usr/share/elasticsearch/plugins \
 --privileged \ #允许容器获取root权限
 --network es-net \ #加入刚刚建立的网络
 -p 9200:9200 \ #用户访问端口
 -p 9300:9300 \ #ES各节点互联端口,其实单点模式暂时用不到
 elasticsearch:8.8.1

如果启动后访问ip:9200报错

image-20230703165559754

添加这两行禁用认证:

 -e "xpack.security.enabled=false"
 -e "xpack.security.enrollment.enabled=false"

运行Kibana

 docker run -d \
 --name kibana \
 -e ELASTICSEARCH_HOSTS=http://es:9200 \ #因为加入了es-net,要告诉kibana es的地址,es是容器名称
 --network=es-net \
 -p 5601:5601 \
 kibana:8.8.1

进入Kibana控制台,可以使用RESTful API操作ES

image-20230703170902518

IK分词器

ES进行搜索时,会先将搜索词进行分词,根据分词结果倒排索引。但是ES默认分词器对中文支持性差,所以手动安装IK分词器。支持ik_smartik_max_word两种分词模式。

两种安装方法:

1.直接安装,下载过程会很慢

 
 # 进入容器安装
 docker exec -it es /bin/bash
 ​
 # 在线下载安装,一定要安装和es版本对应的ik插件!!!(呜呜但是8.8.1还没出)
 ./bin/elasticsearch-plugin install
 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.7.0/elasticsearch-analysis-ik-8.7.0.zip
 #退出
 exit
 # 重启容器
 docker restart es

2.下载后上传到服务器或虚拟机

 #查看插件挂载的实际路径
 docker volume inspect es-plugins
 #[
 #    {
 #        "CreatedAt": "2023-07-03T16:37:54+08:00",
 #        "Driver": "local",
 #        "Labels": null,
 #        "Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
 #        "Name": "es-plugins",
 #        "Options": null,
 #        "Scope": "local"
 #    }
 #]
 #本地文件上传到服务器指定位置后解压
 scp D://...//elasticsearch-analysis-ik-8.8.1.zip username@ip:/var/lib/docker/volumes/es-plugins/_data/elasticsearch-analysis-ik-8.8.1
# 进入zip所在文件夹解压
unzip elasticsearch-analysis-ik-8.8.1.zip
# 删除 zip
rm elasticsearch-analysis-ik-8.8.1.zip 
 #重启容器
 docker restart es

扩展词库和停用词

ik分词器的中文分词是根据内置词典进行匹配和分词的,可以添加自定义词典.

image-20230703211706906

停用词

image-20230703211731999

10.3 原生操作-索引库/文档

索引库

mapping属性

常见mapping属性

  • type:字段数据类型,常见简单类型
    • 字符串:text(可分词文本)、keyword(精确值,不可分词)
    • 数值:long、integer、short、byte、double、float
    • 布尔:boolean
    • 日期:date
    • 对象:object
    • ⭐ES中没有数组类型,但允许一个字段有多个值
  • index:是否创建倒排索引,默认为true(有索引可以参与搜索)
  • analyzer:使用哪种分词器(text)
  • properties:该字段的子字段

创建索引库

image-20230703212759158

修改索引库

image-20230703213302319

文档

 # 新增文档,若不指定id,则ES自动生成id
 POST /索引库名/_doc/文档id
 {
  "字段1":"值1",
  "字段2":"值2",
  "字段3":{
  "子属性1":"值3.1",
  "子属性2":"值3.2"
  },
  #...
 }
 # 查看文档
 GET /索引库名/_doc/文档id
 # 删除文档
 DELETE /索引库名/_doc/文档id
 ​
 # 修改文档
 # 全量修改,删除旧文档,添加新文档;若id不存在则直接新增
 PUT /索引库名/_doc/文档id
 {
  "字段1":"值1",
  "字段2":"值2",
  #...
 }
 # 增量修改,修改指定字段值
 POST /索引库名/_update/文档id
 {
  "doc":{
  "字段名":"新值"
  }
 }

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注