Elasticsearch
- 安装配置
- JDK依赖
- Elastic安装配置
#下载elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-linux-x86_64.tar.gz
#解压elasticsearch
tar -zxvf elasticsearch-7.2.0-linux-x86_64.tar.gz
解压后的目录结构:
#创建用户以及授权
useradd es
passwd es
chown -R es /usr/local/elasticsearch-7.2.0
#开放防火墙端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --reload
#切换用户并进入目录
su es
cd /usr/local/elasticsearch-7.2.0/bin
#运行elasticsearch
./elasticsearch
#后台启动
nohup ./elasticsearch >es.log 2>&1 &
#测试是否启动成功
- 开放外网访问
#修改配置文件
vim config/elasticsearch.yml
启动后会如果出现如下问题:
问题1:
#解决虚拟内存不够引起错误
#切换回root用户,修改配置文件
exit
vim /etc/sysctl.conf
vm.max_map_count=655360
#生效配置
sysctl -p
问题2:
vi /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
ulimit -n 65535
ulimit -Hn 65536
1. IK分词安装与使用
1.4.1下载IK
1.4.2解压IK
解压到elasticsearch-7.2.0/plugins/ik目录下面(直接包含一个conf文件夹和一堆.jar包)
- Elasticsearch Header插件下载
下载地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster
·1.4.3 IK测试
- Elasticsearch Header插件安装
elasticsearch-head是elasticsearch的管理工具,可以用于数据的浏览和查询。elasticsearch-head是一款开源软件,被托管在github上面。运行elasticsearch-head会用到grunt,而grunt需要npm包管理器,所以nodejs是必须要安装的。
- 配置elasticsearch允许跨域访问
vim /usr/local/elasticsearch-7.2.0/config/elasticsearch.yml
尾部追加如下两行代码:
#开放防火墙端口
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --reload
- 安装Nodejs
- 从官网下下载最新的nodejs,Download | Node.js
- 通过ftp工具上传到linux服务,解压安装包
tar -xvf node-v12.16.1-linux-x64.tar.xz
- 设置环境变量
echo 'export PATH=$PATH:/usr/local/nodejs/bin' >> /etc/profile
source /etc/profile
- 验证是否安装成功
node -v
- 安装grunt
npm install -g grunt-cli
cd /usr/local/elasticsearch-head
npm install
#如果报错,则输入:
npm -g install phantomjs-prebuilt@2.1.16 --ignore-script
#修改Gruntfile.js
vim Gruntfile.js
#在connect-->server-->options下面添加:hostname:'*'
,允许所有IP可以访问
#启动
grunt server
#后台启动
npm run start &
- Logstash安装配置
1.6.1 下载安装
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.tar.gz
tar -xzvf logstash-7.2.0.tar.gz
./logstash -e 'input { stdin { } } output { stdout {} }'
1.6.2、同步数据
cd /usr/local/logstash-7.2.0
vim /config/mysql.conf
#前台运行
bin/logstash -f config/mysql.conf
#后台运行
nohup bin/logstash -f config/mysql.conf &
- Kibana安装配置
1.7.1、安装配置
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.2.0-linux-x86_64.tar.gz
tar -xzvf kibana-7.2.0-linux-x86_64.tar.gz
vim /usr/local/kibana-7.2.0-linux-x86_64/conf/kibana.yml
server.host: “0.0.0.0”
#开放防火墙端口
firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --reload
bin/./kibana —allow—root
1.7.2、创建索引模式
输入http://localhost:5601,如下图所示:
点击【创建索引模式】,如下图所示:
输入对应的索引前缀,点击【下一步】,如下图所示:
选择时间筛选字段名称,点击【创建索引模式】,如下图所示:
1.7.3、查看索引数据
1.7.4、开发工具
- Elasticsearch核心概念
Elasticsearch是一个基于Lucene并采用Restful API 标准的高可扩展性和高可用性的实时数据分析的全文检索工具。
NRT(准实时): Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
Node(节点):单个的装有ElasticSearch服务并且提供故障转移和扩展的服务器。
Cluster(集群):一个集群就是由一个或多个Node组织在一起共同工作,共同分享整个数据具有负载均衡功能的集群,集群名称是唯一标识,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
Index(索引):索引就是一个拥有几分相似特征的文档的集合。
Type(类型):一个索引中,你可以定义一种或者多种类型。
Document(文档):一个文档是一个可以被索引的基础信息单元。
Field(列):Field是ElasticSearch中最小单位,相当于数据的某一列。
Shards(分片):一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。因此ElasticSearch将索引分成若干份,每个部分就是一个shard ,当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。 分片好处就是可以对数据进行水平分割,扩展内容容量,提高查询性能和吞吐量。
Replicas(复制):Replicas是索引的一份或者多份拷贝 提供高可用。
分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。
Elasticsearch跟关系型数据库对照如下图:
- Lucene、Solr、ElasticSearch
现在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。
- Kibana操作Elasticsearch
4.1、创建索引
4.2、设置setting
主分片和备分片不会出现在同一个节点上,如果你只有一个节点,那么备份分片都无法分配(unassigned),此时cluster status会变成Yellow
4.3、设置mapping
4.4、插入或修改数据
4.5、局部更新文档
4.6、查询数据
4.6、模糊查询数据
- Elasticsearch常用的查询
5.1 match_all查询
查询指定索引下的所有文档,会匹配所有文档,不是非常有用,用户很少会搜索全部的内容。
5.2 term查询
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇。
(es从5.X版本以后,将string类型变为了过期类型,取而代之的是text和keyword数据类型,text类型在存储数据的时候会默认进行分词,并生成索引。而keyword存储数据的时候,不会分词建立索引)
5.3 match查询
match和term的区别是,match查询的时候elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程。match查询相当于模糊匹配,只包含其中一部分关键词就行。
5.4 match_phrase查询
match_phrase是短语匹配查询,每个单词的位置之间可以留有余地,这种余地叫做slop,用来表示词组中多个分词之间的距离,slop默认为0。和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留包含了所有搜索词条的文档,并且词条的位置要邻接。
5.5 match_phrase_prefix查询
原理跟match_phrase类似,唯一的区别是把最后一个term作为前缀去搜索。
hello就是去进行match,搜索对应的文档
w作为前缀,去扫描整个索引,找到所有w开头的文档
然后找到所有的文档中既包含hello又包含w开头的字符的文档
根据slop去计算,看在slop范围内查找正好文档中的hello和w开头的单词的位置相匹配。
max_expansions:制定prefix最多匹配多少个term,超过这个数量就不继续匹配了,限定性能。
5.6 multi_match查询
multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询。multi_match存在三种类型,分别是best_fields
,most_fields
以及cross_fields
。默认情况下,查询的类型是 best_fields
,这表示它会为每个字段生成一个 match
查询,然后将它们组合到 dis_max
查询的内部。
上面这个查询用 multi_match
重写成更简洁的形式:
可以使用 ^
字符语法为单个字段提升权重,在字段名称的末尾添加 ^boost
,其中 boost
是一个浮点数:
5.7、bool查询
bool查询允许你在单独的查询中组合任意数量的查询,指定的查询子句中表明哪些部分是必须(must)匹配、应该(should)匹配或者是不能(must_not)匹配上elasticsearch索引的数据。
如果指定了must子句,minimum_should_match默认为0,如果没有指定must子句,minimum_should_match默认为1。
- 如果指定bool查询的某部分是must匹配,只有匹配上这些查询的结果才会被返回。
- 如果指定bool查询的某部分是should匹配,只有匹配上指定数量子句看文档才会被返回。
- 如果没有指定must匹配的子句,文档至少要匹配一个should子句才能返回。
- 最后,must_not子句会使得匹配其的文档被移出结果集合。
bool查询子句 | 等价的二元操作 |
must | query1 AND query2 AND query3 |
must_not | NOT query1 AND NOT query2 AND NOT query3 |
should | query1 OR query2 OR query3 |
- SpringBoot2.x整合elasticsearch
新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到7.6.X版本了,为了更好的使用Elasticsearch的新特性,所以弃用了spring-boot-starter-data-elasticsearch依赖,而改为直接使用Spring-data-elasticsearch,以便启用对新版本支持,目前的版本对应关系如下
Elasticsearch有两种连接方式:transport、rest。transport通过TCP方式访问ES(只支持java),rest方式通过http API 访问ES(没有语言限制)。
ES官方建议使用rest方式, transport 在7.0版本中不建议使用,在8.X的版本中废弃。
pom.xml
application.yml
客户端连接配置类