Elasticsearch 安装与交互
![](http://xpbag.com/wp-content/uploads/2020/08/1596805278-1a785dbb9ad6943.png)
Elasticsearch
搜索引擎式数据库
什么是Elasticsearch?
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
一、生活中的数据
1.生活中的数据分类
1)结构化数据
行数据,以二维表的形式展示的数据
2)非结构化数据
没有具体结构,视频,文本,音乐文件
3)半结构化数据
xml表格办公软件,HTML
2.搜索的种类
1)结构化数据搜索
结构化数据有固定结构,我们会给他建立关系,生成二维表查询
2)非结构化数据搜索
1.顺序扫描
2.全文搜索
二、Elasticsearch介绍
1.什么Elasticsearch?
是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。
Elasticsearch是基于lucene开发而来的
#Elasticsearch不能完全代替数据库
2.ES和数据库结构对比
mysql | ES |
---|---|
库(database) | 索引(index) |
表(table) | 类型(type) |
列(字段) | 项 |
真实数据行 | 文档(doc) |
3.ES原理
1.存储数据时进行全文检索
2.全文检索后建立倒排索引
4.全文检索
将一个数据的内容转化拆分
1.分词
2.找到关键词
3.搜索索引
4.匹配,命中,计算命中率
5.根据命中率进行排序
5.倒排索引
java 是世界上最好的语言
php 是世界上最好的语言
python 是世界上最好的语言
分词后的值(词条) | 文档1 | 文档2 | 文档3 |
---|---|---|---|
java | 命中 | ||
是 | 命中 | 命中 | 命中 |
世界上 | 命中 | 命中 | 命中 |
最好的 | 命中 | 命中 | 命中 |
语言 | 命中 | 命中 | 命中 |
php | 命中 | ||
python | 命中 |
6.倒排索引术语
1.词条:索引最小的存储单位,拆分一组词之后,每一个字或者词
2.词典:词条存储的地方,一般在内存中
3.倒排表:记录多个词命中的次数和顺序
4.倒排文件:存储倒排表的地方,一般在磁盘中
7.ES功能
1.分布式存储
2.全文搜索,结构化检索,数据分析
全文搜索:select * from table;
结构化检索:select * from table where id > 1;
数据分析:select count(*) from table;
8.使用场景
1.大量数据存储
2.搜索数据
3.分析数据(ELK)
4.搜索高亮显示
9.ES特点
1.可以部署单点或者集群
2.高性能
3.支持分布式
4.不需要会java
5.功能丰富
6.部署简单
10.相关概念
cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
river:代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
gateway:代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
discovery.zen:代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
Transport:代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
三、部署ES
1.服务器时间同步(重要)
[root@db01 ~]# yum install -y ntpdate
[root@db01 ~]# ntpdate time1.aliyun.com
2.安装java环境
#上传
[root@db01 ~]# rz jdk-8u181-linux-x64.rpm
#安装
[root@db01 ~]# rpm -ivh jdk-8u181-linux-x64.rpm
3.安装ES
1.上传或下载包
[root@db01 ~]# rz elasticsearch-6.6.0.rpm
#下载地址:https://www.elastic.co/downloads/elasticsearch
2.安装
[root@db01 ~]# rpm -ivh elasticsearch-6.6.0.rpm
3.根据提示继续操作
[root@db01 ~]# systemctl daemon-reload
[root@db01 ~]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@db01 ~]# systemctl start elasticsearch.service
4.验证
[root@db01 ~]# netstat -lntp
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 20040/java
tcp6 0 0 127.0.0.1:9300 :::* LISTEN 20040/java
[root@db01 ~]# curl 127.0.0.1:9200
{
"name" : "FIddisT",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "m8Y9neWHRxat7V1tVijMxA",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
4.ES相关配置文件
[root@db01 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml #ES主配置文件
/etc/elasticsearch/jvm.options #jvm虚拟内存配置
/etc/elasticsearch/log4j2.properties #日志配置
/etc/elasticsearch/role_mapping.yml #规则配置
/etc/elasticsearch/roles.yml
/etc/elasticsearch/users
/etc/elasticsearch/users_roles
/etc/init.d/elasticsearch #启动脚本
/etc/sysconfig/elasticsearch #系统配置
/usr/lib/sysctl.d/elasticsearch.conf #参数配置
/usr/lib/systemd/system/elasticsearch.service #启动程序
5.配置ES
[root@db01 ~]# vim /etc/elasticsearch/elasticsearch.yml
#集群名称
#cluster.name: my-application
#节点名称
node.name: node-1
#指定数据目录
path.data: /service/es/data
#指定日志目录
path.logs: /service/es/logs
#开启内存锁
bootstrap.memory_lock: true
#ES监听地址
network.host: 10.0.0.51 127.0.0.1
#ES端口
http.port: 9200
#集群的地址
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#集群投票切换
#discovery.zen.minimum_master_nodes:
#culster transport port
transport.tcp.port: 9300
transport.tcp.compress: true
discovery.zen.ping.unicast.hosts: ["192.168.60.201", "192.168.60.202","192.168.60.203"]
#集群个节点IP地址,也可以使用els、els.shuaiguoxia.com等名称,需要各节点能够解析
discovery.zen.minimum_master_nodes: 2 #为了避免脑裂,集群节点数最少为 半数+1
#总配置
[root@db01 ~]# grep "^[a-z]" /etc/elasticsearch/elasticsearch.yml
node.name: node-1
path.data: /service/es/data
path.logs: /service/es/logs
bootstrap.memory_lock: true
network.host: 10.0.0.51,172.16.1.51,127.0.0.1
http.port: 9200
#集群配置
transport.tcp.port: 9300
transport.tcp.compress: true
discovery.zen.ping.unicast.hosts:["172.16.1.51", "172.16.1.52","172.16.1.53"]
discovery.zen.minimum_master_nodes: 2
-----------------------
相同配置集群中的52和53机器
6.根据配置文件创建目录
#创建数据目录和日志目录
[root@db01 ~]# mkdir /service/es/{data,logs} -p
#授权
[root@db01 ~]# chown -R elasticsearch.elasticsearch /service/es/
7.重启ES
#重启ES
[root@db01 ~]# systemctl restart elasticsearch.service
#启动失败,查看日志
[2020-08-10T10:38:56,170][ERROR][o.e.b.Bootstrap ] [node-1] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
#说明内存未锁定
#配置启动文件中内存锁
[root@db01 ~]# vim /usr/lib/systemd/system/elasticsearch.service
[Service]
... ...
LimitMEMLOCK=infinity
#再次启动ES
[root@db01 ~]# systemctl daemon-reload
[root@db01 ~]# systemctl start elasticsearch.service
8.验证
#浏览器访问 http://10.0.0.51:9200/
{
#节点名称
"name" : "node-1",
#集群名称
"cluster_name" : "elasticsearch",
#集群的uuid
"cluster_uuid" : "KCRhZiS2QWSADsuDwwKC9g",
#版本信息
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
四、跟ES进行交互
1.curl命令的方式
1)特点
1.使用不方便,容易出错,命令复杂
2.不需要要安装任何服务,只需要curl命令
#ES不能完全代替数据库
1.ES的库不可修改,表修改属性困难,容易出错
2.ES没有用户验证和权限控制
2)使用方式
#创建索引(库)
[root@db01 ~]# curl -XPUT '10.0.0.51:9200/student?pretty'
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "student"
}
#添加数据
[root@db01 ~]# curl -XPUT '10.0.0.51:9200/stu/user/1?pretty' -H 'Content-Type: application/json' -d '{"name": "lhd","sex":"man","age":"18","about":"good good study","interests":["chinese","english"]}'
{
"_index" : "stu",
"_type" : "user",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
#查看数据
[root@db01 ~]# curl -GET '10.0.0.51:9200/student/user/1?pretty'
{
"_index" : "stu",
"_type" : "user",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "lhd",
"sex" : "man",
"age" : "18",
"about" : "good good study",
"interests" : [
"chinese",
"english"
]
}
}
2.使用head插件的方式
插件是为了完成不同的功能,官方提供了一些插件但大部分是收费的,另外也有一些开发爱好者提供的插件,可以实现对elasticsearch集群的状态监控与管理配置等功能,我们现在要安装的是Elasticsearch的head插件,此插件提供elasticsearch的web界面功能。
安装Elasticsearch的head插件时,要安装npm,npm的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。
在Elasticsearch 5.x版本以后不再支持直接安装head插件,而是需要通过启动一个服务方式。
Github地址:https://github.com/mobz/elasticsearch-head
1)特点
1.查看数据简单,操作简单
2.需要安装nodejs环境,安装费时
2)安装插件方式一:
#安装npm(只需要在一个节点安装即可,如果前端还有nginx做反向代理可以每个节点都装)
[root@elkstack01 ~]# yum install -y npm
#进入下载head插件代码目录
[root@elkstack01 src]# cd /usr/local/
#从GitHub上克隆代码到本地
[root@elkstack01 local]# git clone git://github.com/mobz/elasticsearch-head.git
#克隆完成后,进入elasticsearch插件目录
[root@elkstack01 local]# cd elasticsearch-head/
#清除缓存
[root@elkstack01 elasticsearch-head]# npm cache clean -f
#使用npm安装n模块(不同的项目js脚本所需的node版本可能不同,所以就需要node版本管理工具)
[root@elkstack01 elasticsearch-head]# npm install -g n
#安装最新版本n模块
[root@elkstack01 elasticsearch-head]# n stable
#生成grunt
[root@elkstack01 elasticsearch-head]# npm install grunt -save
#确认生成grunt文件
[root@elkstack01 elasticsearch-head]# ll node_modules/grunt
#执行安装grunt
[root@elkstack01 elasticsearch-head]# npm install
#后台启动head插件(切记,必须在插件目录下执行启动命令)
[root@elkstack01 elasticsearch-head]# npm run start &
#验证端口是否启动成功
[root@elkstack01 elasticsearch-head]# netstat -lntup
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 11293/grunt
#启动成功后,修改elasticsearch配置文件
[root@elkstack01 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
#添加如下两行,开启跨域访问支持(添加在配置文件最后即可)
http.cors.enabled: true
http.cors.allow-origin: "*"
#重启elasticsearch
[root@elkstack01 elasticsearch-head]# /etc/init.d/elasticsearch restart
3)安装插件方式二:
1.在电脑上解压es-head-0.1.4_0.crx.zip,解压到一个目录
2.谷歌浏览器,右上角,三个点或者三个杠
3.更多工具--扩展程序
4.右上角打开开发者模式
5.加载已解压的扩展程序,选择解压问价你的目录
6.右上角有个放大镜或者拼图,点击进去
7.输入地址:http://10.0.0.51:9200/ 后点击连接查看