Elasticsearch(ES)是一个基于Lucene构件的开源、分布式、RESTful接口全文搜索引擎。ES还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级别的数据。它可以在很短的时间内在存储、搜索和分析大量的数据。它通常作为具有复杂所搜场景情况下的核心发动机。
ES就是为考可用和可扩展而生的。可以通过购置性能更强的服务器来完成。
大型分布式日志分析系统ELK,elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)
电商系统搜索系统、网盘搜索引擎等。
Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用json作为文档序列化的格式,比如下面这条用户数据:
{
"user":"zfl",
"sex":"0",
"age":"23"
}
关系型数据库:数据库->表->行->列
Elasticsearch:索引(Index)->类型(type)->文档(Documents)->字段(Fields)
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
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
下载kibana-6.2.4-windows-x86_64安装包并解压
修改 config/kibana.yml
将默认配置改成如下:
server.port:5601(默认)
server.host: 本机ip(默认localhost)
elasticsearch.url: es地址
启动kibana
双击bin目录下的kibana.bat启动即可。
创建索引
PUT /lnh
查询索引
GET /lnh
添加文档 /索引名称/类型/id
PUT /lnh/user/1
{
"user":"lnh",
"sex":"0",
"age":"23"
}
http://192.168.15.130:9200/lnh/user/_search
GET /lnh/user/_mget
{
"ids":["1","2"]
}
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在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,一般用于模糊查询。
使用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插件)。
下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意:ik分词器插件版本要与es版本保持统一。
已经把Elasticsearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据库表,映射(mapping)相当于数据表的表结构。Elasticsearch中的映射(mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等。
文档映射就是给文档中的字段指定字段类型、分词器。
使用 GET /lnh2/stu/_mapping
字符串
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"
}
}
}
- 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
准备三台服务器集群
服务器名称 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启动时会有,可以配置。
该资源汇总于蚂蚁课堂,做一次梳理,都说好记性不如烂笔头。
原文:https://www.cnblogs.com/aliases/p/13728400.html