概念
首先我们要使用SpringBoot整合ES我们先要明白ES是什么?它主要是为了干什么?
ES是一个基于Lucene的搜索服务器,它是一个分布式、高扩展、高实时的搜索与数据分析引擎.同时它还是一个基于RESTful web接口.简单来说,就是ES就是为了解决我们上亿条数据查询速度缓慢的一种技术.能够提高我们的查询数据的效率.
我们想要使用这个搜索服务器,当然我们先得安装这个服务器了,不然你用个锤子啊!
安装
- 上传ElasticSearch安装包
put e:/software/elasticsearch-7.4.0-linux-x86_64.tar.gz
- 执行解压操作
tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C /opt
- 创建普通用户. 因为安全问题,Elasticsearch 不允许root用户直接运行,所以要创建新用户,在root用户中创建新用户,执行如下命令:
useradd qishen # 新增qishen用户
passwd 123456 # 为qishen用户设置密码
- 为新用户授权
chown -R qishen:123456 /opt/elasticsearch-7.4.0 #文件夹所有者
将 /opt/elasticsearch-7.4.0文件夹授权给qishen用户,由上图可见,我们的文件夹权限赋给了qishen
- 修改elasticsearch.yml文件
vim /opt/elasticsearch-7.4.0/config/elasticsearch.yml
# ======================== Elasticsearch Configuration =========================
cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
cluster.name:配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称
node.name:节点名,elasticsearch会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
network.host:设置为0.0.0.0允许外网访问
http.port:Elasticsearch的http访问端口
cluster.initial_master_nodes:初始化新的集群时需要此配置来选举master
- 修改配置文件
新创建的qishen用户最大可创建文件数太小,最大虚拟内存太小,切换到root用户,编辑下列配置文件, 添加类似如下内容
# 切换到roo`在这里插入代码片`t用户
su root
#1. ===最大可创建文件数太小=======
vim /etc/security/limits.conf
# 在文件末尾中增加下面内容
qishen soft nofile 65536
qishen hard nofile 65536
# =====
vim /etc/security/limits.d/20-nproc.conf
# 在文件末尾中增加下面内容
qishen soft nofile 65536
qishen hard nofile 65536
* hard nproc 4096
# 注:* 代表Linux所有用户名称
#2. ===最大虚拟内存太小=======
vim /etc/sysctl.conf
# 在文件中增加下面内容
vm.max_map_count=655360
# 重新加载,输入下面命令:
sysctl -p
- 启动elasticsearch
su qishen # 切换到itheima用户启动
cd /opt/elasticsearch-7.4.0/bin
./elasticsearch #启动
我们启动完成之后,就可以去访问我们的ES,我们是否已经安装成功了,不过我们在访问之前一定要保证虚拟机上的防火墙是关掉的,不让就会被拦截,不能被访问。
#暂时关闭防火墙
systemctl stop firewalld
# 或者
#永久设置防火墙状态
systemctl enable firewalld.service #打开防火墙永久性生效,重启后不会复原
systemctl disable firewalld.service #关闭防火墙,永久性生效,重启后不会复原
浏览器输入http://192.168.149.135:9200/,如果出现下面的就说明访问成功了。
以上就是我们的ES安装,我们虽然已经安装好了服务端的ES,按道理已经可以使用了,但是我们直接这样查看我们的数据是相当不方便的,所以一般情况下我们都会通过客户端去访问我们ES中存的内容,这样就会方便很多。一般可以用来操作ES的客户端有:PostMan和Kibana还有head,但是一般情况我们都用kibanna,Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。而且它很方便。下面我们先介绍一下这个平台安装:
- 第一步也是先要去下载安装包,然后上传:
put E:\software\kibana-7.4.0-linux-x86_64.tar.gz
- 第二步解压 步骤都是一样的。
tar -xzf kibana-7.4.0-linux-x86_64.tar.gz -C /opt
- 修改配置
vim /opt/kibana-7.4.0-linux-x86_64/config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
server.name: "kibana-itcast"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
elasticsearch.requestTimeout: 99999
server.port:http访问端口
server.host:ip地址,0.0.0.0表示可远程访问
server.name:kibana服务名
elasticsearch.hosts:elasticsearch地址
elasticsearch.requestTimeout:请求elasticsearch超时时间,默认为30000,此处可根据情况设置
- 启动kibanna
由于kibana不建议使用root用户启动,如果用root启动,需要加–allow-root参数
# 切换到kibana的bin目录
cd /opt/kibana-7.4.0-linux-x86_64/bin
# 启动
./kibana --allow-root
- 访问
浏览器输入http://192.168.149.135:5601
Discover
:可视化查询分析器
Visualize
:统计分析图表
Dashboard
:自定义主面板(添加图表)
Timelion
:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools
:Console控制台(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management
:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。
这就安装成功了,是不是感觉简单啊,没错,就是很简单,步骤都是大差不差。我们安装完了就可以操作了,其实这个操作分为两种方式。一种是基于脚本的方法操作,一种是基于JavaAPI的方式。
ES核心概念
我们在学习ES应该是有对比的学习,首先它有三大核心:索引(就相当于我们数据库中的表)、映射(相当于于表结构)、文档(相当于表中的一行数据)。
里面还有一个比较重要的概念:倒排索引
== 一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,对应一个包含它的文档id列表。==
首先我们要先看ES得脚本操作,一般客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作:
GET:用来获取资源
POST:用来新建资源(也可以用于更新资源)
PUT:用来更新资源
DELETE:用来删除资源
首先我们介绍一下关于数据类型有哪些?
- 字符串
有两种方式
第一种:text类型的,会分词但是不支持聚合.
第二种:keyword类型,不会分词,支持聚合 - 数值
布尔:boolean.
二进制:binary
范围类型:integer_range, float_range, long_range, double_range, date_range
日期:date - 复杂数据类型
数组:[ ],对象{}
由于我们使用Postman作为客户端跟kibana不一样,这里我就只介绍kibana的使用,主要是用来使用脚本语言操作的
索引(相当于数据库表):
- 添加索引
PUT 索引名称
- 查询索引
GET /索引名称 #查询单个索引信息
GET /索引名称1,索引名称2... #查询多个索引信息
GET /_all #查询所有索引信息
- 删除索引
DELETE /索引名称
- 关闭索引
POST /索引名称/_close
- 打开索引
POST /索引名称/_open
映射(相当于表结构):
- 添加索引
PUT /索引名/_mapping
{
"properties":{
"属性名":{
"type": "属性类型",
"analyzer": "分词类型"
},
"属性名":{
"type": "属性类型"
}
}
}
- 创建索引并添加映射
PUT /索引名
{
"mappings": {
"properties": {
"属性名": {
"type": "属性类型"
},
"属性名": {
"type": "属性类型"
}
}
}
}
操作文档(相当于 表中数据):
- 添加文档,指定id
POST /索引名/_doc/id号
{
"属性名":"属性值",
"属性名":属性值,
"属性名":"属性值"
}
- 添加文档,不指定id
#添加文档,不指定id(系统会随机ID)
POST /索引名/_doc/
{
"属性名":"属性值",
"属性名":属性值,
"属性名":"属性值"
}
- 查询指定文档
GET /索引名/_search/指定ID
- 查询所有文档
GET /索引名/_search
- 删除指定id文档
DELETE /索引名/_doc/1
以上就是关于使用脚本操作ES的内容,但是因为ES是外国人弄得,所以他对中文的分词支持的不好,会将每个汉字都弄成一个词,这明显是不行的。所以,这里再说一个分词器的东西 ,这个东西可以 让我们的ES进行分词的时候能够按照字典的形式进行分词操作,这样就能满足我们的需求
因为这个是 一个插件,所以是需要我们进行安装的。
下面就说关键点了:
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词。是一个基于maven的项目。
下载地址为:https://github.com/medcl/elasticsearch-analysis-ik/archive/v7.4.0.zip
下载完成后,我们要对这个项目进行打包
mvn package
# 如果打包出错了 ,可能是我们现在的镜像地址不行,可以选择换成阿里的镜像地址
在maven的settings.xml配置文件中添加下面的话就行了 如果没有问题 可以忽略下方操作
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
ik分词器使用
它有两种模式,ik_max_word和ik_smart模式。
ik_max_word:做细粒度的拆分,对于中华人民共和国。会拆分成:中、中华 中华人 、人民、人民共和国、共和国。
ik_smart:做粗粒度的拆分,会拆成:中华、人民、共和国
上面就是举例子,不要较真啊 O(∩_∩)O
操作:
#方式一ik_max_word
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国"
}
#方式二ik_smart
GET /_analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}
使用ik分词器-查询文档
- 词条查询:term
词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索 - 全文查询:match
全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集
- 创建索引,添加映射,并指定分词器为ik分词器
PUT person2
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"address": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
- 添加文档
POST /person2/_doc/1
{
"name":"张三",
"age":18,
"address":"北京海淀区"
}
POST /person2/_doc/2
{
"name":"李四",
"age":18,
"address":"北京朝阳区"
}
POST /person2/_doc/3
{
"name":"王五",
"age":18,
"address":"北京昌平区"
}
- 查询映射
GET person2
- 查看分词效果
GET _analyze
{
"analyzer": "ik_max_word",
"text": "北京海淀"
}
- 词条查询:term
查询person2中匹配到"北京"两字的词条
GET /person2/_search
{
"query": {
"term": {
"address": {
"value": "北京"
}
}
}
}
- 全文查询:match
全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集
GET /person2/_search
{
"query": {
"match": {
"address":"北京昌平"
}
}
}
基础操作大概就这些了 后面说 与java代码结合如何操作,希望这些对大家 有所帮助。