ElasticSearch

ElasticSearch是一个基于Lucene的搜索服务器,提供分布式全文搜索引擎,对外服务是基于restful web接口

ES的使用案例

维基百科:全文检索、高亮显示、搜索推荐
GitHub:千亿级的代码行检索
StackOverflow、亚马逊等

对比数据库搜索

1.数据库查询语法复杂度高
2.关键字索引不全面
3.效率低

相关概念

1.Cluster

Cluster是指集群,ES集群由一个或多个节点组成,存在一个主节点,该注解点可以通过选举产生,主从节点是对于集群内部而言,对于外部来说ES集群是去中心化的,与集群中任何一个节点通信等同于和整个集群通信,所以主节点的存在不会产生单点安全隐患、并发访问瓶颈等问题

2.Index

index是指索引,相当于关系型数据库中的表,其中存储若干类似Document数据

3.Shards

Shards是指primary shard,代表索引的主分片,ES将一个完整的索引分成多个primary shard,形成分布式存储,并为搜索访问提供分布式服务,提高并发性能

primary shard的数量只能在创建索引时指定,后期不能再更改

4.Replicas

Replicas是指replica shard,代表索引的主分片的副本,ES可以为一个primary shard创建多个replica shard,用来提高容错性(当primary shard损坏或丢失时可以从replica shard中恢复)及查询效率(ES自动对搜索进行负载均衡,将并发的搜索请求发送给合适的节点)

5.Type

Type是指类型,每个Index中都必须有唯一一个Type,它是index的一个逻辑分类,数据Document是存储在索引下的type中的

5.x及更低版本中,一个index中可有多个type
6.x中,只能有一个type
7.x中,没有type

6.Document

Document是指文档,是ES中的最小数据单元,一个Document就是一条数据,一般使用json数据结构表示。
每个Index下的Type中都可以存储多个Document,一个Document中可定义多个filed(数据字段)

7.倒排索引

对数据进行分析,抽取数据中的词条,以词条作为key,对应数据的存储为止作为value,实现索引的存储,这种索引为倒排索引

Linux【CentOS】中安装ES

Linux版本:CentOS6.10
ES安装版本:6.3.1
ES6.x要求Linux内核必须3.5+

1.升级内核

# 查看Linux内核版本
uname -a

# 升级到最新内核版本
# 更新yum库
yum -y update
# 注册内核
rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
# 下载内核安装包
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
# 安装新版本内核
yum --enablerepo=elrepo-kernel install kernel-lt -y
vim /etc/grub.conf
# 修改内容:default=0
# 重启系统后生效

2.更改系统配置

# 修改文件创建限制,默认限制65535个,但ES至少需要65536个文件的创建权限
vim /etc/security/limits.conf
# 新增内容:
# * soft nofile 65536
# * hard nofile 65536
# *表示所有用户

# 修改线程开启限制,默认root用户可开启任意数量,非root用户开启1024个,ES至少需要4096个
# ES5.x之后,强制要求不能使用root用户启动ES进程,防止ES占用所有内存
# 2.x- ES为每个线程分配128K
# 3.x+ ES为每个线程分配286K
# 所以如果虚拟机内存为1G,那么最多启动3000+个线程,建议分配1.5G+的内存
vim /etc/security/limit.d/90-nproc.conf
# 修改内容:
# * soft nproc 4096

# ES需要开辟至少65536字节的虚拟内存,而Linux默认不允许任何用户和应用直接开辟虚拟内存(虚拟内存 - 长链接硬盘)
# 所以需要修改配置
vim /etc/sysctl.conf
# 新增内容:
# vm.max_map_count=655360

# 配置生效
sysctl -p

3.单机版ES安装

# 需要jdk环境
# 上传文件ES压缩文件
# 解压
tar -zxf elasticsearch-6.3.1.tar.gz

# 移动到指定目录
mv elasticsearch-6.3.1 /usr/local/es

# 创建新用户
adduser khue
# 初始化密码
passwd khue

# 查看用户
cut -d : -f 1 /etc/passwd
# 查看用户组
cut -d : -f 1 /etc/group

# 将es目录权限开放给khue用户
chown -R khue.khue /usr/local/es

# 启动
# 不要使用root用户启动,使用其他用户启动
# 切换用户
# root向其他用户切换不需要输入密码
su username
# 返回上一个的用户使用exit命令

# 前置启动,使用Ctrl+C关闭并退出
./elasticsearch

# 后置启动,使用kill pid命令结束,kill -9 pid表示强制关闭进程
./elasticsearch -d
# 查看Java进程号
jps

# 查看日志
tailf elasticsearch.log

# 客户端命令验证是否启动成功
# 默认只能使用localhost或127.0.0.1访问,本机IP或其他IP不可访问
# ES默认开放端口9200
curl http://localhost:9200
# 或
curl http://127.0.0.1:9200

# 允许任意客户端访问
# 修改配置
vim elasticsearch.yml
# 新增内容:network.host: 0.0.0.0
# 0.0.0.0表示所有地址均可访问
# 注意:network.host:后面必须存在空格
# 重启ES生效

安装成功图示

es增加别名字段 es 加字段_elasticsearch


4.集群版搭建

# 同一机器,依次启动多个ES即可自动搭建集群
# 注意:如果有data目录,则先删除data目录(该目录存放了集群信息)
# 可以不用配置端口号,ES遇到占用端口,会自动跳过该端口,重新分配一个新的未被占用的端口

# 不同机器,需要配置连接信息
vim config/elasticsearch.yml
# discovery.zen.ping.unicast.hosts: ["192.168.54.140","192.168.54.141"]
# discovery.zen.minimum_master_nodes:2 
# 默认先启动的为主节点

# 测试(任意安装ES的机器上测试)
curl http://localhost:9200/_cat/nodes

集群版安装成功图示

es增加别名字段 es 加字段_es增加别名字段_02

5.安装Kibana
Kibana是一个基于web的ES管理控制台

安装在任意安装有ES的机器上即可

# 上传文件
# 解压
tar -zxf kibana-6.3.1-linux-x86_64.tar.gz
# 移动到指定目录
mv kibana-6.3.1-linux-x86_64 /usr/local/kibana

# 开放访问权限
vim config/kibana.yml
# 添加内容:
# server.host: "0.0.0.0"

# 启动
# 前置启动
/usr/local/kibana/bin/kibana
# 关闭防火墙后,访问http://192.168.54.140:5601即可
# kibana默认开放端口5601

安装成功图示

es增加别名字段 es 加字段_ElasticSearch_03

常用命令

使用Kibana方便学习ES命令

使用Dev Tools工具

es增加别名字段 es 加字段_数据_04


es增加别名字段 es 加字段_ElasticSearch_05

# 查看节点信息
GET _cat/nodes
GET _cat/nodes?v

es增加别名字段 es 加字段_elasticsearch_06

# 查看健康状态
GET _cat/health
GET _cat/health?v

index操作

# 创建索引
# 索引名称必须小写,不能以 _ - + 开头
PUT test_index01

# 查看索引
GET _cat/indices?v

# 查看分片
GET _cat/shards?v

# 自定义分片数量
PUT test_index2
{
	"settings":{
		"number_of_shards":2,
		"number_of_replicas":1
	}
}

# 修改索引 
# primary shard不可修改,只能修改replica shard
PUT test_index2/_settings
{
	"number_of_replicas":3
}

# 删除索引
DELETE test_index2
DELETE test_index1,test_index2

document操作

# 7.x版本去掉type即可
# 新增文档 - 索引不存在则自动创建
PUT test_index01/test_type/1
{
	"name":"khue",
	"age":25
}

# 强制新增 - 先根据索引检查主键,存在则抛异常,不存在则新增
PUT test_index01/test_type/2/_create
或
PUT test_index01/test_type/2/?op_type=create
{
	"name":"joo",
	"age":26
}

# POST - 绝对新增,不用声明主键,由ES的GUID自动生成主键,保证分布式不重复,而UUID只能保证单机不重复
POST test_index01/test_type
{
	"name":"dream",
	"age":24
}
# 如果有数据源,建议使用PUT;如果没有明确数据源,建议使用POST

# 查询操作 - 只能用主键查询
GET test_index/test_type/1
GET _mget{
	"doc":[
	{"_index":"test_index01","_type":"test_type","_id":1},
	{"_index":"test_index02","_type":"test_type","_id":1}]
}
# 索引名称一样时,索引名称可GET /索引名/_mget{}

# 修改
# 替换/全量替换 - 同ID的PUT操作 - 标记原有document为deleted状态,再创建一个新的document来存储数据,以提高效率;当容量不足或空闲时,后台会回收deleted状态的document

# 更新/局部更新/部分更新 - ES更新时,底层逻辑都是先删除再新增
# 存在就更新,不存在就新增
POST test_index01/test_type/1/_update
{
	"doc":{
		"age":25,
		"gender":"male"
	}
}

# 删除
# 先标记为deleted,不删除,等存储空间不足或工作空闲时,才执行物理删除操作
DELETE test_index01/test_type/1

# bulk批量操作 - 增删改,使用POST
# 新增、更新两个对象,删除一个对象
# 增删改可以混合,要求一个对象一行,不能换行,以提高性能
# 批量操作是分开执行,无语法错误,但有一个操作异常,不影响其他操作
# 批量操作也不要太多,受内存和网络影响,建议5-15MB之间,2000-5000条开始逐渐增加以测试
POST _bulk
# PUT新增
{"index":{"_index":"test_index","_type":"test_type","_id":4}}
{"name":"green","age":25}
# 强制新增
{"create":{"_index":"test_index","_type":"test_type","_id":5}}
{"name":"green","age":25}
# 无POST新增,因为bulk必须提供主键
# PUT更新
{"index":{"_index":"test_index","_type":"test_type","_id":4}}
{"name":"zhangsan","age":27}
# POST更新
{"update":{"_index":"test_index","_type":"test_type","_id":4}}
{"doc":{"age":30}}
# DELETE删除
{"delete":{"_index":"test_index","_type":"test_type","_id":4}}

Analyzer分词器

分词器是一个字符串解析拆分工具,分析写入document的文本数据field,将field数据拆分成一个个有完整含义的、不可再拆分的单词

Normalization标准化处理

标准化处理是用来强化分词器,提升召回率(recall)的。
分词器处理的结果通常会有一些不需要的、有异议的、包含时态转换等情况的数据,ES维护这些数据没有必要,这些数据就需要标准化处理
大小写、同义词、单复数、时态、简写
停用词