Elastic search 上篇

1. 今日内容
1.ES介绍
2.ES安装
3.ES语法
4.ES集群搭建
2. 学习目标
1.能够理解倒排索引计算
2.能够自己安装ES服务
3.能够掌握ES的基本语法
一 ES介绍
1. 简介

​ Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,用于存储PB级别的数据,易于扩展,es对lucene进行封装,让开发人员可以使用restful风格请求直接调用。

2. 走进lucene
介绍

开源的搜索引擎

倒排索引技术

倒排索引表建立

在这里插入图片描述

搜索过程

在这里插入图片描述

分词器

单字分词:

原句:

​ “我们是优秀的31期学员,年薪百万”

分词后:

我,们,是,优,秀,的,31,期,学,员,年,薪,百,万

双字分词:

原句:

​ “我们是优秀的31期学员,年薪百万”

分词后:

我们,们是,是优,优秀,秀的,的31,31期,期学…

词库分词:

预先制定好词库,词库中存在的词就可以拆分出来参与倒排索引表的建立,如果词库中不存在该词,那么不会拆分出来。

ik分词器(常用),庖丁分词器…

二、ES安装
1. 权限
  1. es为了安全在启动时不可以使用root用户启动
  2. 在操作所有与es相关的事情全部使用新建的用户来操作
  3. 在解决es安装过程中报错的问题全部使用root用户解决
2. ES安装命令
#1.新建用户es-31
useradd es-31
#2.设置密码  需要输入两次(最后一次是确认密码)
passwd es-31
#3.切换至es-31用户 root用户切换至其他用户不需要输入密码,root是最高权限的用户,其他用户切换至root用户需要输入root账号的密码
su - es-31
#4.上传es安装包
rz 
#5.解压
tar -xvf elasticsearch-6.8.0.tar.gz
#6.删除安装包
rm -rf elasticsearch-6.8.0.tar.gz
#7.重命名文件夹名称
mv elasticsearch-6.8.0 elasticsearch
#8.切换至配置文件夹
cd elasticsearch/config 
#9.修改jvm大小
vim jvm.options

-Xms256m
-Xmx256m
#10.修改es配置文件 以下配置的位置一定要与自己实际位置一致
vim elasticsearch.yml

path.data: /home/es-31/elasticsearch/data
path.logs: /home/es-31/elasticsearch/logs
network.host: 0.0.0.0

#11.切换至bin启动
cd /home/es-31/elasticsearch/bin/

./elasticsearch  #前台启动方式----》在当前窗口输出日志 ctrl+c停止运行
./elasticsearch -d  #后台启动方式----》在当前窗口不会输出日志

#12.使用root用户解决错误
#12.使用root用户解决错误
#12.使用root用户解决错误
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65535]

vim /etc/security/limits.conf

#在复制粘贴以下配置时需要注意粘贴进去后会自动追加注释 # 需要将注释去除,千万不要将* 删除,*表示对所有用户生效

#可打开的文件描述符的最大数(软限制) 
* soft nofile 65536 
#可打开的文件描述符的最大数(硬限制) 
* hard nofile 131072 
#单个用户可用的最大进程数量(软限制) 
* soft nproc 4096 
#单个用户可用的最大进程数量(硬限制) 
* hard nproc 4096

#13.关闭所有的会话窗口-----》crt关闭/连接工具关闭 ----》重新连接

#14.再次启动es测试访问
cd /home/es-31/elasticsearch/bin/

./elasticsearch  #前台启动方式----》在当前窗口输出日志 ctrl+c停止运行


http://ip:9200
3. 安装可视化插件

kibana安装命令

#1.必须使用es-31用户
#2.上传安装包 kibana-6.8.0-linux-x86_64.tar.gz
rz
#3.解压
tar -xvf kibana-6.8.0-linux-x86_64.tar.gz
#4.删除安装包
rm -rf kibana-6.8.0-linux-x86_64.tar.gz
#5.重命名
mv kibana-6.8.0-linux-x86_64 kibana
#6.修改配置文件
cd kibana/config

vim kibana.yml

#允许所有的ip访问
server.host: "0.0.0.0" 
#中文展示---》配置文件最后一行
i18n.locale: "zh-CN"

#7.切换至bin启动 要求先启动es再启动kibana,因为kibana在启动时回去连接es的9200端口
cd ../bin
./kibana

#8.访问
http://ip:5601

#9.使用开发工作

#10.如果发现kibana之前可以启动,突然启动不了
#a.查看es是否正常启动
#b.先停止kibana+es,再删除es data目录下面的所有数据
rm -rf /home/es-31/elasticsearch/data/*
4. 安装ik分词器
#1.必须使用es-31用户
#2.切换至 /home/es-31/elasticsearch/plugins
cd  /home/es-31/elasticsearch/plugins
#3.创建文件夹 文件夹名称必须叫 analysis-ik
mkdir  analysis-ik
#4.切换至 analysis-ik文件夹
cd analysis-ik
#5.上传安装包 elasticsearch-analysis-ik-6.8.0.zip
#6.解压
unzip elasticsearch-analysis-ik-6.8.0.zip
#7.删除安装包 (必须)
rm -rf elasticsearch-analysis-ik-6.8.0.zip
#8.切换至es bin目录启动es
cd ../../bin
./elasticsearch
#9.测试

ik分词测试

#ik_max_word  最细粒度分词
#ik_smart 最粗粒度分词
POST _analyze
{
  "text": "南京市长江大桥",
  "analyzer": "ik_smart"
}

POST _analyze
{
  "text": "南京市长江大桥",
  "analyzer": "ik_max_word"
}
5. 扩展和停止词库

扩展词典:顾名思义是在不满足用户需求的情况下,可以自定词典来进行分词

停止词典:顾名思义是在不满足用户需求的情况下,可以自定词典来不进行分词

#1.切换至词典目录
cd /home/es-31/elasticsearch/plugins/analysis-ik/config
#2.创建自己的词典
vim 31.dic

江大桥

#3.将扩展词典进行引用
 vim IKAnalyzer.cfg.xml 
 
 <entry key="ext_dict">31.dic</entry>
#4.访问测试

POST _analyze
{
  "text": "南京市长江大桥",
  "analyzer": "ik_max_word"
}
三 ES语法
0.对比关系

在这里插入图片描述

1. 索引库操作
#0. es是遵循restful风格请求

#1.创建索引库
PUT /blog1

#2.查看索引库
GET /blog1

#3.删除索引库
DELETE /blog1
2. 类型详解
PUT /索引库名称/_mapping/类型名称 或者 /索引库名称/类型名称/_mapping
{
	"properties":{
		"字段名称":{
			"type":"类型",
			"index": true,
			"store": false,
			"analyzer": "分词器"
		}
	}
}

type: 类型

  • String类型:

    • text—>文本,不可以参与聚合分组
    • keyword----->关键字,可以参与聚合分组,并且关键字不可以分词。
  • 数值类型:

    • 基本数据类型: Integer,double,long…
    • 高精度数据
  • 日期类型:

    • 一般不会使用日期数据类型,因为日期类型占用空间较大,一般使用毫秒值用long类型
  • 对象

  • 数组

index:
是否索引,默认值为true表示要进行索引。

store

​ 是否要独立存储的意思,默认值为false,表示不独立存储,独立存储的字段查询效率要更高一些。

analyzer

​ ik_max_word : 最细粒度分词(常用)

​ ik_smart

3. 类型语法
#1.创建索引库
PUT /heima
#2.创建类型
PUT /heima/_mapping/goods
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "subtitle": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images": {
      "type": "keyword",
      "index": "false"
    },
    "price": {
      "type": "float"
    }
  }
}
#3.查看类型
GET /heima/_mapping/goods
4. 文档操作
#1.新增文档-->id随机生成
POST /heima/goods
{
	"title": "小米手机",
	"images": "http://image.leyou.com/12479122.jpg",
	"price": 2699.00
}
#2.根据id查询文档
GET /heima/goods/_Im4uHQB0rCWCYLQr7Hq

#3.指定id新增文档
POST /heima/goods/1
{
	"title": "大米手机",
	"images": "http://image.leyou.com/12479122.jpg",
	"price": 2999.00
}

GET /heima/goods/1
#4.更新文档
POST /heima/goods/1
{
	"title": "超大米手机",
	"images": "http://image.leyou.com/12479122.jpg",
	"price": 3999.00
}
#5.删除文档
DELETE /heima/goods/1
#6.删除所有
POST heima/_delete_by_query 
{
	"query": {
		"match_all": {}
	}
}

在这里插入图片描述

在这里插入图片描述

5. 查询

初始化查询数据

千万不要格式化下面的数据操作,因为不识别,必须是压缩格式执行

POST /heima/goods/_bulk
{"index":{}}
{"title":"大米手机","images":"http://image.leyou.com/12479122.jpg","price":3288}
{"index":{}}
{"title":"小米手机","images":"http://image.leyou.com/12479122.jpg","price":2699}
{"index":{}}
{"title":"小米电视4A","images":"http://image.leyou.com/12479122.jpg","price":4288}
基本查询
#1.查询所有
POST /heima/_search
{
  "query": {
    "match_all": {}
  }
}
#2.模糊匹配查询 
POST /heima/_search
{
  "query": {
    "match": {
      "title": "小米手机"
    }
  }
}

#3.多字段匹配查询
#为了查询效果添加数据
POST /heima/goods
{
	"title": "华为手机",
	"images": "http://image.leyou.com/12479122.jpg",
	"price": 5288,
	"subtitle": "小米"
}

POST /heima/_search
{
  "query": {
    "multi_match": {
      "query": "小米",
      "fields": [
        "title",
        "subtitle"
      ]
    }
  }
}
#4.精确匹配查询 term
POST /heima/_search
{
  "query": {
    "term": {
      "price": {
        "value": "5288"
      }
    }
  }
}
#5.多条件精确查询 terms
POST /heima/_search
{
  "query": {
    "terms": {
      "price": [
        "2699",
        "5288"
      ]
    }
  }
}

在这里插入图片描述

_source结果过滤

includes: 包含查询字段,null值会自动过滤

excludes:不包含查询字段

#结果过滤查询 select * from table
# select title from table
POST /heima/_search
{
  "query": {
    "match_all": {}
  },
  "_source": {
    "includes": [
      "subtitle",
      "title"
    ]
  }
}

POST /heima/_search
{
  "query": {
    "match_all": {}
  },
  "_source": {
    "excludes": [
      "subtitle",
      "title"
    ]
  }
}
高级查询(了解)
  • bool组合查询

    GET /heima/_search
    {
        "query":{
            "bool":{
            	"must":     { "match": { "title": "小米" }},
            	"must_not": { "match": { "title":  "电视" }},
            	"should":   { "match": { "title": "手机" }}
            }
        }
    }
    
    #结果是只会查询到小米手机
    
  • 范围查询(rang)

在这里插入图片描述

POST /heima/_search
{"query": {
  "range": {
    "price": {
      "gte": 2699,
      "lte": 4288
    }
  }
}}
  • 模糊查询

    #1.新增测试数据
    POST /heima/goods/4
    {
        "title":"apple手机",
        "images":"http://image.leyou.com/12479122.jpg",
        "price":5899.00
    }
    #2.默认模糊查询支持错一个字母
    POST /heima/_search
    {
      "query": {
        "fuzzy": {
          "title": "appla"
        }
      }
    }
    #3.模糊查询最多支持错两个字母
    POST /heima/_search
    {
      "query": {
        "fuzzy": {
          "title": {
            "fuzziness": 2,
            "value": "appaa"
          }
        }
      }
    }
    
排序

需要指定排序字段

指定排序的方式

POST /heima/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}
高亮

pre_tags: 前置标签

post_tags: 后置标签

fields: 高亮字段

注意事项:

​ 不能使用查询所有来进行高亮,因为高亮需要将查询条件分词后进行高亮显示

POST /heima/_search
{
  "query": {
    "match": {
      "title": "小米手机"
    }
  },
  "highlight": {
    "pre_tags": "<span color='red'>",
    "post_tags": "</span>",
    "fields": {
      "title": {}
    }
  }
}
分页

limit 10,15

pageNum: 第几页

pageSize: 页大小

起始索引位置: int start = (pageNum -1)* pageSize

es中的分页:

from: 其实索引位置

size: 页大小

POST /heima/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 2
}
四、ES集群搭建
1. ES集群架构

在这里插入图片描述

在这里插入图片描述

2.ES搭建步骤:
#0.搭建集群
node-01  9201 9301
node-02  9202 9302
node-03  9203 9303
#1.做虚拟机快照
#2.删除es data目录下的数据
rm -rf /home/es-31/elasticsearch/data/*
#3.重命名es文件夹名称 操作此命令当前目录是在/home/es-31
mv elasticsearch elasticsearch-01
#4.修改配置文件
node-01配置文件:

cluster.name: itheima-31
node.name: node-01
path.data: /home/es-31/elasticsearch-01/data
path.logs: /home/es-31/elasticsearch-01/logs
http.port: 9201
transport.tcp.port: 9301
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301", "127.0.0.1:9302","127.0.0.1:9303"]
discovery.zen.minimum_master_nodes: 2

#5.复制
cp -r elasticsearch-01 elasticsearch-02
cp -r elasticsearch-01 elasticsearch-03
#6.修改复制好的节点
node.name: node-02
path.data: /home/es-31/elasticsearch-02/data
path.logs: /home/es-31/elasticsearch-02/logs
http.port: 9202
transport.tcp.port: 9302


node.name: node-03
path.data: /home/es-31/elasticsearch-03/data
path.logs: /home/es-31/elasticsearch-03/logs
http.port: 9203
transport.tcp.port: 9303

#7.多打开几个会话窗口同时启动

配置文件

3. kibana修改
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]

在这里插入图片描述

4. 集群使用测试
PUT /heima
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
  "mappings": {
    "goods": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃 哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值