Elasticsearch

  1. 安装配置
  1. JDK依赖

java 集成 ES创建索引模板 es kibana 创建索引_elasticsearch

java 集成 ES创建索引模板 es kibana 创建索引_大数据_02

  1. 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 &
#测试是否启动成功

curl http://127.0.0.1:9200

  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

源码下载:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.

1.4.2解压IK

解压到elasticsearch-7.2.0/plugins/ik目录下面(直接包含一个conf文件夹和一堆.jar包)

  1. Elasticsearch Header插件下载

下载地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

·1.4.3 IK测试

  1. Elasticsearch Header插件安装

elasticsearch-head是elasticsearch的管理工具,可以用于数据的浏览和查询。elasticsearch-head是一款开源软件,被托管在github上面。运行elasticsearch-head会用到grunt,而grunt需要npm包管理器,所以nodejs是必须要安装的。

  1. 配置elasticsearch允许跨域访问

vim /usr/local/elasticsearch-7.2.0/config/elasticsearch.yml

尾部追加如下两行代码:

#开放防火墙端口

firewall-cmd --zone=public --add-port=9100/tcp --permanent

firewall-cmd --reload

  1. 安装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

  1. 安装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 &

  1. 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 &

  1. 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、开发工具

  1. 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跟关系型数据库对照如下图:

  1. Lucene、Solr、ElasticSearch

现在主流的搜索引擎大概就是:Lucene,Solr,ElasticSearch。

  1. Kibana操作Elasticsearch

4.1、创建索引

4.2、设置setting

主分片和备分片不会出现在同一个节点上,如果你只有一个节点,那么备份分片都无法分配(unassigned),此时cluster status会变成Yellow

4.3、设置mapping

4.4、插入或修改数据

4.5、局部更新文档

4.6、查询数据

4.6、模糊查询数据

  1. 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_fieldsmost_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。

  1. 如果指定bool查询的某部分是must匹配,只有匹配上这些查询的结果才会被返回。
  2. 如果指定bool查询的某部分是should匹配,只有匹配上指定数量子句看文档才会被返回。
  3. 如果没有指定must匹配的子句,文档至少要匹配一个should子句才能返回。
  4. 最后,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

  1. 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

客户端连接配置类

6.1、根据ID查询对应的文档:


6.2、新增或删除一个文档:

6.3、批量插入文档:

6.4、批量删除文档:

6.5、Bool查询以及高亮显示:

6.6、根据查询条件删除

6.7、精确查询

6.8、匹配前缀查询