简介
**ElasticSearch简介:**简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单个开源的分布式搜索引擎,可以用来实现搜索,日志统计,分析,系统监控等多种功能。
Elastic Stack(ELK): 是以Elasticsearch为核心的技术栈,其中包括beats。logstash,kibanba,Elasticsearch。
正向索引和倒排索引
正向索引,假设我们有一个商品表,id是主键
如果我们按照id查询数据,他会走索引,查询效率很快,但是一般来说我们是会按照title来搜索,sql语句如下:
select * from good where title like "%手机%"
他查询需要全表扫描,一个个去匹配,效率可想而知,这就是正向索引,他在做局部内容检索的时候效率十分底。
倒排索引
文档:每条数据就是一个文档,类似于数据库中一张表的一条数据
词条:就是把文档分成一个个词语
假如同样我们搜索华为手机,基于倒排索引,他首先会将华为手机进行分词,获得文档id之后基于id进行查询文档,这时候虽然经过两次检索,但是每次都是基于索引的,总的来说,效率很高。
MySQL和Es的概念对比
Mysql: 擅长事务类型操作,可以确保数据的安全和一致性
**Elasticsearch:**擅长海量数据的搜索、分析、计算
安装Elasticsearch和kibana
安装Elasticsearch
我们这里继续使用docker来安装
1,创建一个网络,因为我们需要让kibana容器和es互联
docker network create es-net
2,拉取镜像
docker pull elasticsearch
但是es有差不多一个G拉取速度太慢,建议下载制作好的文件,上传,直接加载成镜像,例如上传es.tar将他加载为镜像,速度会很快。
如果你直接拉取的镜像这个命令不需要执行:
docker load -i es.tar
3,运行es容器
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 "cluster.name=es-docker-cluster"
:设置集群名称 -
-e "http.host=0.0.0.0"
:监听的地址,可以外网访问 -
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:内存大小,因为他是基于java开发的 -
-e "discovery.type=single-node"
:非集群模式 -
-v es-data:/usr/share/elasticsearch/data
:挂载逻辑卷,绑定es的数据目录 -
-v es-logs:/usr/share/elasticsearch/logs
:挂载逻辑卷,绑定es的日志目录 -
-v es-plugins:/usr/share/elasticsearch/plugins
:挂载逻辑卷,绑定es的插件目录 -
--privileged
:授予逻辑卷访问权 -
--network es-net
:加入一个名为es-net的网络中 -
-p 9200:9200
:端口映射配置
4,浏览器输入ip:9200如果出现
安装成功!!!!
安装Kibana
kibana可以给我们提供一个elasticsearch的可视化界面,便于我们更方便使用es
1,拉取镜像
docker pull kibana
这里还是建议上传打包好的镜像,将他重新加载成镜像,如果直接拉取不需要执行这个命令
docker load -i kibana.tar
2,启动kibana容器
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
:端口映射配置
3,浏览器输入ip:5601即可查看-(启动较慢,稍等一会)
安装成功!!!
ES-操作索引库(类似MySQL的表)
mapping属性
mapping是对索引库中文的约束,常见的mapping属性包括:
type:字段数据类型,常见的简单类型有:
字符串:text(可分词文本),keyword(不可分词,例如国家,品牌,ip等等)
数值:long,integer,short,double,float
布尔:boolean
日期:date
对象:object
index:是否创建索引,默认为true。
analyzer:使用那种分词器。
properties:子字段,对象嵌套时需要。
创建索引库-类似于数据库的表
假如我们数据库有一个用户表,其中一条数据如下:
{
"id": 1,
"age": 21,
"weight": 52.1,
"isMarried": false,
"info": "csdn最靓的崽!!",
"email": "gde@nb.cn",
"scores": [ 99.1,99.5,98.9],
"name": {
"firstName": "蛋儿",
"lastName": "狗"
}
}
不难看出数据库表如何创建的,我们来看看在es中如何创建 索引库
这是一个示例:
# 创建索引库
PUT /索引库名称
{
"mappings": {
"properties": {
"字段1":{
"type":"类型,例如text",
, "analyzer": "使用哪种分词器"
},
"字段2":{
"type": "类型,例如keyword",
"index": false # 不适用索引
},
"字段3":{
"properties": {
"子字段1";{
"type":"字段类型"
},
"子字段2";{
"type":"字段类型"
}
}
}
}
}
}
实现之后(我们取少量字段):
# 创建索引库
PUT /userinfo
{
"mappings": {
"properties": {
"info":{
"type":"text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": false
},
"age":{
"type": "integer",
"index": false
},
"name":{
"properties": {
"dirstName":{
"type":"keyword"
},
"lastName":{
"type":"keyword"
}
}
}
}
}
}
注意:索引名必须小写!!
索引库查询
GET /索引库名
索引库删除
DELETE /索引库名
索引库修改
需要注意的是es在索引库创建的时候就会基于索引库创建倒排索引,如果修改索引库结构倒排索引就会失效,所以,es是不允许修改索引库 的,但是可以在索引库中增加新的字段。
# 向索引库中增加一个字段
PUT /索引库名/_mapping
{
"properties":{
"新字段名":{
"type":"字段类型"
}
}
}
Es-操作文档
(类似MySQL的数据)
索引库插入一条文档
示例语句:
# 向索引库中插入一条数据
POST /userinfo/_doc/文档id,例如1,2。。。
{
"字段1":"值1",
"字段2":"值2",
"字段3":{
"子属性1":"值3",
"子属性2":"值4"
}
}
具体实现:
# 向索引库中插入一条数据
POST /userinfo/_doc/1
{
"info":"csdn最靓的崽!!",
"email":"gde@nb.cn",
"age":"20",
"name":{
"dirstName":"狗",
"lastName":"蛋儿"
}
}
索引库查询的文档
# 查询id为1的数据
GET /索引库名/_doc/1
#查询所有数据
GET /userinfo/_search
{
"query": {
"match_all": {}
}
}
索引库删除一条文档
#删除id为1的数据
DELETE /userinfo/_doc/1
索引库修改文档
1,全量修改
原本插入文档使用的是POST请求这时候只需要换成PUT请求即可,它会将原有的文档删除在重新插入,例如:
# 全量修改 修改索引库中id为1的数据,如果不存在就插入
PUT /userinfo/_doc/1
{
"info":"csdn最靓的崽!!",
"email":"gde@nb.cn",
"age":"20",
"name":{
"dirstName":"狗",
"lastName":"蛋儿"
}
}
2,局部修改
# 局部修改
POST /userinfo/_update/1
{
"doc": {
"age":"99"
}
}
至此es基础篇完结!!!!!!