文章目录
一、Elasticsearch
1.1 Elasticsearch 简介
Elasticsearch
是一个基于Apache Lucene
的开源搜索引擎。无论在开源还是专有领域,Lucene
可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
Elasticsearch
也使用Java
开发并使用Lucene
作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API
来隐藏Lucene
的复杂性,从而让全文搜索变得简单。
特点:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎,不规则查询
- 可以扩展到上百台服务器,处理
PB
级结构化或非结构化数据
使用场景:
- 为用户提供按关键字查询的全文搜索功能
- 著名的
ELK
框架(Elasticsearch
、Logstash
、Kibana
),实现企业海量日志的处理分析的解决方案。大数据领域的重要一份子
1.2 Elasticsearch 存储结构
Elasticsearch
是面向文档(document oriented
)的,这意味着它可以存储整个对象或文档(document
)。然而它不仅仅是存储,还会索引(index
)每个文档的内容使之可以被搜索。在Elasticsearch
中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch
能够执行复杂的全文搜索的原因之一。
结构 | 描述 |
---|---|
cluster | 整个elasticsearch默认就是集群状态,整个集群是一份完整、互备的数据 |
node | 集群中的一个节点,一般只一个进程就是一个node |
shard | 分片,即使是一个节点中的数据也会通过hash算法,分成多个片存放,默认是5片 |
index | 相当于RDBMS的database, 对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中 |
type | 类似于RDBMS的table,但是与其说像table,其实更像面向对象中的class , 同一Json的格式的数据集合。ES6之后,一个index中只能有一个type |
document | 类似于RDBMS的 row、面向对象里的object |
field | 相当于字段、属性 |
二、Elasticsearch & Kibana 安装
2.1 单机版 ES 安装
① 添加用户、用户组
[root@hadoop100 ~]# adduser elk
[root@hadoop100 ~]# passwd elk
[root@hadoop100 ~]# groupadd es
[root@hadoop100 ~]# usermod -G es elk
② 授权
[root@hadoop100 ~]# vi /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
elk ALL=(ALL) ALL
③ 解压文件夹并修改文件所属、所属组
[root@hadoop100 ~]# tar -zxvf elasticsearch-6.3.1.tar.gz -C /opt/module
[elk@hadoop100 elasticsearch-6.3.1]# sudo chown -R elk elasticsearch-6.3.1/
[elk@hadoop100 elasticsearch-6.3.1]# sudo chgrp es elasticsearch-6.3.1/
④ 修改虚拟机参数
[elk@hadoop100 elasticsearch-6.3.1]# vim ./config/jvm.options
⑤ 解除默认配置对服务器性能的束缚
[elk@hadoop100 elasticsearch-6.3.1]# vim /etc/security/limits.conf
⑥ 进行其他配置
[elk@hadoop100 elasticsearch-6.3.1]# vim /etc/sysctl.conf
[elk@hadoop100 elasticsearch-6.3.1]# sysctl -p
[elk@hadoop100 elasticsearch-6.3.1]# vim config/elasticsearch.yml
⑦ 后台启动Elasticsearch
[elk@hadoop100 elasticsearch-6.3.1]# bin/elasticsearch -d
⑧ 远程访问
2.2 Kibana 安装
① 解压文件夹并修改文件名
[root@hadoop100 software]# tar -zxvf kibana-6.3.1-linux-x86_64 -C /opt/module
[root@hadoop100 module]# mv kibana-6.3.1-linux-x86_64/ kibana-6.3.1
② 修改配置文件
[root@hadoop100 kibana-6.3.1]# vim ./conf/kibana.yml
server.port: 5601
server.host: "192.168.182.100"
elasticsearch.url: "http://192.168.182.100:9200"
③ 启动Kinana
[root@hadoop100 kibana-6.3.1]# nohup ./bin/kibana &
2.3 Docker 安装 ES 和 Kibana
① 拉取镜像
#安装ElasticSearch
[root@mall ~]# docker pull elasticsearch:7.4.2
[root@mall ~]# docker pull kibana:7.4.2
② 创建存储文件
# 将es中配置文件挂载到外面的目录,通过修改虚拟机外面的文件夹es配置,进而修改docker中es的配置
[root@mall ~]# mkdir -p /mydata/elasticsearch/config
[root@mall ~]# mkdir -p /mydata/elasticsearch/data
[root@mall ~]# chmod -R 777 /mydata/elasticsearch/
# 配置 http.host:0.0.0.0 代表es可以被远程的任何机器访问,注意这里host:后需要有空格
[root@mall ~]# echo "http.host: 0.0.0.0">> /mydata/elasticsearch/config/elasticsearch.yml
③ 运行容器
# 将es中配置文件挂载到外面的目录,通过修改虚拟机外面的文件夹es配置,进而修改docker中es的配置
[root@mall ~]# docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
[root@mall ~]# docker run --name kibana \
-e ELASTICSEARCH_HOSTS=http://192.168.182.150:9200 \
-p 5601:5601 -d kibana:7.4.2
三、Elasticsearch 初步检索
3.1 _cat
GET /_cat/nodes
:查看所有节点GET /_cat/health
:查看es健康状况GET /_cat/master
:查看主节点GET /_cat/indices
:查看所有索引
3.2 插入文档
POST
新增。如果不指定id
,会自动生成id
。指定id
就会修改这个数据,并新增版本号PUT
可以新增可以修改。PUT
必须指定id
;由于PUT
需要指定id
,我们一般都用来做修改,不指定id
会报错
PUT /china/BeiJing/3
{
"name":"YMY",
"age":"200"
}
3.3 检索信息
① 检索单个信息
GET /china/BeiJing/1
② 检索全部信息
GET /china/BeiJing/_search
③ 根据字段检索
GET /china/BeiJing/_search?q=GuGong
④ 只查看_source数据
GET /china/BeiJing/1/_source
3.4 修改文档
① 修改文档
POST
操作会对比源文档数据,如果相同不会有什么操作,文档version
不增加;PUT
操作总会将数据重新保存并增加version
版本;
POST /china/BeiJing/2
{
"name":"GuGong2",
"age":"1000"
}
② 局部添加一个字段
带_update
对比元数据如果一样就不进行任何操作。看场景;对于大并发更新,不带update
;对于大并发查询偶尔更新,带update
;对比更新,重新计算分配规则。
POST /china/BeiJing/2/_update
{
"doc": {
"artificial":true
}
}
③ 并发修改带版本号
POST /china/BeiJing/2?if_seq_no=5&if_primary_term=1
{
"name":"GuGong",
"age":"1000"
}
3.5 删除文档 & 索引
① 删除文档
DELETE /china/BeiJing/1
② 删除索引
DELETE /china