Elasticsearch(ES)是一个基于Lucene构件的开源、分布式、RESTful接口全文搜索引擎。ES还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级别的数据。它可以在很短的时间内在存储、搜索和分析大量的数据。它通常作为具有复杂所搜场景情况下的核心发动机。
ES就是为考可用和可扩展而生的。可以通过购置性能更强的服务器来完成。
Elasticsearch特点
- 横向可扩展性: 只需要增加台服务器,做一点配置,启动一下ES就可以并入集群。
- 分片机制提供更好的分布性: 同一个索引被分成多个分片(sharding),这点类似HDFS的块机制;mapreduce的分而治之的方式可提升处理效率。
- 高可用: 提供复制(replica)机制,一个分片可以存在多个副本,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用的节点上。
Elasticsearch应用场景
大型分布式日志分析系统ELK,elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)
电商系统搜索系统、网盘搜索引擎等。
Elasticsearch存储结构
Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用json作为文档序列化的格式,比如下面这条用户数据:
{
"user":"zfl",
"sex":"0",
"age":"23"
}
关系型数据库:数据库->表->行->列
Elasticsearch:索引(Index)->类型(type)->文档(Documents)->字段(Fields)
Linux环境安装ES
- 安装JDK环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
-
下载Elasticsearch安装包
官方文档:https://www.elastic.co/downloads/elasticsearch -
上传Elasticsearch安装包
-
解压Elasticsearch
目录结构说明如下:bin:脚本文件,包括ES启动&安装插件等 config:elasticsearch.yml(ES配置文件)、jvm.options(JVM配置文件)、日志配置文件等 JDK:内置的jdk lib:类库 logs:日志文件 modules:ES所有模块,包括X-pack等 plugins:ES已经安装的插件,默认没有插件 data:ES启动的时候,默认与logs同级,用来存储文档数据。该目录可在elasticsearch.yml中配置
-
修改elasticsearch.yml
-
启动elasticsearch
报错:不允许使用root用户直接运行
解决:
创建一个分组
groupadd lnhg
创建用户并添加进分组
useradd lnhu -g lnhg -p 123456
授予权限
chown -R lnhu:lnhg es安装目录
su lnhu 切换用户
继续报错:
编辑/etc/sysctl.conf添加如下参数:
vi /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
还会报一个错,崩溃…
编辑/etc/security/limits.conf添加如下参数:
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
到此单机版本搭建完成,重新启动服务,reboot。
- 访问Elasticsearch
关闭防火墙 systemctl stop firewalld.service
http://192.168.15.130:9200
- 端口区别(9200和9300)
9200端口:ES节点和外部通讯使用
9300端口:ES节点之间通讯使用
kibana环境安装(windows安装)
-
下载kibana-6.2.4-windows-x86_64安装包并解压
修改 config/kibana.yml
将默认配置改成如下:
server.port:5601(默认)
server.host: 本机ip(默认localhost)
elasticsearch.url: es地址
-
启动kibana
双击bin目录下的kibana.bat启动即可。 -
访问
http://ip地址:5601
Kibana 实现增删改查
-
创建索引
PUT /lnh
-
查询索引
GET /lnh
-
添加文档 /索引名称/类型/id
PUT /lnh/user/1
{
"user":"lnh",
"sex":"0",
"age":"23"
}
- 查询文档
GET /lnh/user/1
- 删除索引
DELETE /lnh
之后查询
调用RestFul创建文档
- 查询指定数据
http://192.168.15.130:9200/lnh/user/1
- 查询某类型的全部文档
http://192.168.15.130:9200/lnh/user/_search
高级查询
- 根据id进行查询
GET /lnh/user/1 - 查询当前所有类型的文档
GET /lnh/user/_search
- 根据多个ID批量查询
查询多个id分别为1、2GET /lnh/user/_mget { "ids":["1","2"] }
- 复杂条件查询
查询年龄为23岁的
GET /lnh/user/_search?q=age:23
查询年龄20-30岁之间的
GET /lnh/user/_search?q=age[20 TO 30]
注意: TO一定要大写
查询年龄20-30岁之间的,从0条数据到1条数据
GET /lnh/user/_search?q=age[20 TO 30]&from=0&size=1
DSL语言查询与过滤
什么是DSL语言
es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
示例
- 根据名称精确查询姓名
GET /lnh/user/_search
{
"query":{
"term":{
"user":"zfl"
}
}
}
说明:term是代表完全匹配,不进行分词器分析,文档中必须包含整个搜索的词汇。为精确搜索
- 根据名称模糊查询
GET /lnh/user/_search
{
"from":0,
"size":2,
"query":{
"match":{
"user":"partner"
}
}
}
说明:match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,一般用于模糊查询。
term与match的区别
- term查询不会对字段进行分词,会采用精确匹配。
- Match会根据该字段的分词器,进行分词查询。
使用filter过滤年龄
/lnh/user/_search
{
"query":{
"bool":{
"must":[
{
"match_all":{}
}
],
"filter":{
"range":{
"age":{
"gte":20,
"lte":30
}
}
}
}
},
"from":0,
"size":10,
"_source":["user","age"]
}
说明:_source表示指定返回哪些字段
分词器
什么是分词器
因为Elasticsearch中默认的标准分词器对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉子。因此引入中文分词器(ik插件)。
- 默认标准分词器
安装ik分词器
下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意:ik分词器插件版本要与es版本保持统一。
- 解压后的文件目录
- 在es安装目录下plugins目录下新建一个ik目录
- 将解压后的文件复制到plugins/ik目录下
- 重新启动es
说明:- ik_max_work:对讲文本做最细粒度的拆分,比如会将"中华人民共和国国歌"拆分成为"中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国歌",会穷尽各种可能的组合。
- ik_smart:会做最粗粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,国歌"。
自定义扩展词典
- 在es安装目录下plugins/ik/config目录下新建custom目录,并创建new_word.dic文件
- 向new_word.dic文件中添加自定义词汇
- 修改 config/IKAnalyzer.cfg.xml文件,将自定义的扩展字典位置填充
文档映射
介绍
已经把Elasticsearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据库表,映射(mapping)相当于数据表的表结构。Elasticsearch中的映射(mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等。
文档映射就是给文档中的字段指定字段类型、分词器。
使用 GET /lnh2/stu/_mapping
映射的分类
- 动态映射
我们知道,在关系数据库中,需要实现创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据库表中插入数据。而Elasticsearch中不需要实现定义映射(mapping),文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。 - 静态映射
在Elasticsearch中也可以实现定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。
基础数据类型
-
字符串
string,string类型包含text和keyword。
text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引。允许es来检索这些词,text不能用来排序和聚合。
keyword:该类型不需要进行分词,可以被用来检索过滤、排序和聚合,keyword类型只能用本身来进行检索(不可用text分词后的模糊检索) -
数值型
long、integer、short、byte、double、float -
日期型
date -
布尔型
boolean -
二进制型
binary -
数组类型
Array datatype
示例
- 创建文档类型并且指定类型
PUT /lnh2
POST /lnh2/_mapping/stu
{
"properties":{
"age":{
"type":"integer"
},
"sex":{
"type":"integer"
},
"name":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"home":{
"type":"keyword"
}
}
}
- 获取指定类型的mapping信息
- 获取索引信息
http://192.168.15.130:9200/lnh2/_settings
Elasticsearch集群管理
- 如何解决高并发
ES是一个分布式全文检索框架,隐藏了复杂的处理机制,包括分片机制,集群发现,分片负载均衡,请求路由。 - 基本概念
- cluster
代表一个集群,集群中有很多的节点,其中有一个为主节点,这个主节点是可以通过选举产生的,
主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,
这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和
整个es集群通信是等价的。
- shards
代表索引的分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到
不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
- replicas
代表索引的副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或
丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
- recovery
代表数据恢复或叫做重新分布,es在有节点加入或者退出时会根据机器的负载均衡对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
- 核心原理分析
1. 每个索引会被分成多个分片shards进行存储,默认创建索引是分配五个分片进行存储。
每个分片都会分布式部署在多个不同的节点上进行存储,该分片成为primary shards。
主分片定义好后,后面不能做修改。原因是在查询的时候,根据文档id%主分片数量获取分片位置。
路由算法:shard = hash(routing)%主分片数量。
2. 每一个主分片为了实现高可用,都会有自己对应的备份分片,主分片对应的备份分片不能存放在同一台服务器
上。主分片primary shards可以和其他replicas shards存放在一个Node节点上。
假设主分片3 备份1 主分片3个,每个主分片对应1个备份分片=3*2=6
主分片3 备份2 主分片3个,每个主分片对应的2个备份分片=3*3=9
Es集群环境搭建
-
准备三台服务器集群
服务器名称 IP地址 node-0 192.168.15.130 node-1 192.168.15.131 node-2 192.168.15.132
-
服务器集群配置修改(每台)
vi elasticsearch.yml cluster.name: lnh ###保证三台服务器节点集群名称相同 node.name: node-0 #### 每个节点名称不一样 其他两台为node-1 ,node-2 network.host: 192.168.15.130 #### 实际服务器ip地址 discovery.zen.ping.unicast.hosts: ["192.168.15.130", "192.168.15.131","192.168.15.132"]##多个服务集群ip discovery.zen.minimum_master_nodes: 1
-
启动
启动每个es,关闭防火墙 systemctl stop firewalld.service -
验证
访问:http://192.168.15.130:9200/_cat/nodes?pretty
*号代表主节点
注意:如果是克隆的机器,请先删除每台的data数据目录,默认在安装目录下data,es启动时会有,可以配置。
该资源汇总于蚂蚁课堂,做一次梳理,都说好记性不如烂笔头。