10.Elastic Search
10.1 概念
ES是一个实时分布式搜索和分析引擎,基于Java并使用Lucene引擎作为核心来实现所有索引和搜索功能,通过RESTful API隐藏Lucene的复杂性。(同类型搜索引擎还有Solr等.)
应用:
- 维基百科使用ES提供全文搜索并高亮关键字,以及实时搜索、搜索纠错
- StackOverflow全文检索
- GitHub使用ES检索代码
- 日志数据分析:ELK技术,数据可视化 Kibana;存储、计算、搜索数据ElasticSearch;数据抓取Logstash、Beats
- 商品价格监控,用户设定商品价格阈值,当价格低于阈值时发消息给客户


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

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

倒排索引基本原理:


ES与MySQL概念对比
MySQL | ElasticSearch |
---|---|
Database | Index(索引,相同类型的文档集合) |
Tables(表) | Types(类型) |
Rows(行) | Documents(文档,JSON格式) |
Columns(列) | Field(字段) |
Schema | Mapping(映射,字段类型约束) |
SQL | DSL(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报错

添加这两行禁用认证:
-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

IK分词器
ES进行搜索时,会先将搜索词进行分词,根据分词结果倒排索引。但是ES默认分词器对中文支持性差,所以手动安装IK分词器。支持ik_smart
和ik_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分词器的中文分词是根据内置词典进行匹配和分词的,可以添加自定义词典.

停用词

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

修改索引库

文档
# 新增文档,若不指定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":{
"字段名":"新值"
}
}