第一章 Elasticsearch简介
1.1 什么是Elasticsearch
Elaticsearch,简称为es, es是一个开源的==高扩展的分布式全文检索引擎==,它可以近乎实时的检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ES使用Java开发。Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
第二章 相关软件的安装
2.1 Elasticsearch安装
1、下载ES压缩包
目前Elasticsearch最新的版本是7.4.2,我们使用6.8.0版本,建议使用JDK1.8及以上
Elasticsearch分为Linux和Window版本,基于我们主要学习的是Elasticsearch的Java客户端的使用,所以我们课程中使用的是安装较为简便的Window版本,项目上线后,公司的运维人员会安装Linux版的ES供我们连接使用。
Elasticsearch的官方地址:https://www.elastic.co/cn/downloads/past-releases
2.2 安装ES插件ElasticSearch-head
1.在Chrome浏览器地址栏中输入:chrome://extensions/
2. 打开Chrome扩展程序的开发者模式
3. 将资料中的ElasticSearch-head-Chrome插件.crx
拖入浏览器的插件页面
2.3 安装Kibana
1、什么是Kibana
Kibana是ElasticSearch的数据可视化和实时分析的工具,利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
https://www.elastic.co/cn/products/kibana
1.解压
2.修改elasticsearch服务器的地址
修改kibana配置支持中文:
i18n.locale: "zh-CN"
4、运行访问
4.1 进入安装目录下的bin目录
4.2 双击运行,启动成功
4.3 发现kibana的监听端口是5601,我们访问:http://127.0.0.1:5601
4.1 索引库操作
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
1.创建索引库
发送请求:
# 在kibana中,不用写地址和端口,/heima是简化写法,真实请求地址是:http://127.0.0.1:9200/heima
# 请求方法:PUT
PUT /heima
响应结果:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "heima"
}
“acknowledged” : true, 代表操作成功
“shards_acknowledged” : true, 代表分片操作成功
“index” : “heima” 表示创建的索引库名称
注意:创建索引库的分片数默认5片,在7.0.0之后的ElasticSearch版本中,默认分片数变为1片;
2.查看索引库
发送请求:
# 请求方法GET
GET /heima
响应结果:
{
"heima" : {
"aliases" : {
}, //别名
"mappings" : {
}, //映射ddl
"settings" : {
"index" : {
"creation_date" : "1573610302775",
"number_of_shards" : "5",
"number_of_replicas" : "1", //副本数
"uuid" : "6Ffe20CIT76KchAcvqE6NA",
"version" : {
"created" : "6080099" //当前索引库的版本
},
"provided_name" : "heima"
}
}
}
}
响应内容解释:
{
"heima【索引库名】" : {
"aliases【别名】" : {
},
"mappings【映射】" : {
},
"settings【索引库设置】" : {
"index【索引】" : {
"creation_date【创建时间】" : "1573610302775",
"number_of_shards【索引库分片数】" : "5",
"number_of_replicas【索引库副本数】" : "1",
"uuid【唯一标识】" : "6Ffe20CIT76KchAcvqE6NA",
"version【版本】" : {
"created" : "6080099"
},
"provided_name【索引库名称】" : "heima"
}
}
}
}
3.删除索引库
发送请求:
# 请求方法:DELETE
DELETE /heima
响应结果:
{
"acknowledged" : true
}
4.2 类型(type)及映射(mapping)操作
有了索引库
,等于有了数据库中的database
。接下来就需要索引库中的类型
了,也就是数据库中的表
。创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)
1.配置映射
给heima这个索引库添加了一个名为goods
的类型,并且在类型中设置了4个字段:
- title:商品标题
- subtitle: 商品子标题
- images:商品图片
- price:商品价格
发送请求:
PUT /heima/goods/_mapping
{
"properties": {
"title":{
"type": "text",
"analyzer": "ik_max_word"
},
"subtitle":{
"type": "text",
"analyzer": "ik_max_word"
},
"images":{
"type": "keyword",
"index": false
},
"price":{
"type": "float",
"index": true
}
}
}
响应结果:
{
"acknowledged" : true
}
内容解释:
PUT /索引库名/_mapping/类型名称 或 索引库名/类型名称/_mapping
{
"properties": {
"字段名称":{
"type【类型】": "类型",
"index【是否索引】": true, //默认为true
"store【是否存储】": true,
"analyzer【分析器】": "分词器"
}
...
}
}
类型名称:就是前面将的type的概念,类似于数据库中的表
字段名:任意填写,下面指定许多属性,例如:
- type:类型,Elasticsearch中支持的数据类型非常丰富,说几个关键的:
-
String类型,又分两种:
- text:可分词
- keyword:不可分词,数据会作为完整字段进行匹配
-
Numerical:数值类型,分两类
- 基本数据类型:long、interger、short、byte、double、float、half_float
- 浮点数的高精度类型:scaled_float
-
Date:日期类型
-
Array:数组类型
-
Object:对象
-
- index:是否索引,默认为true,也就是说你不进行任何配置,所有字段都会被索引。
- true:字段会被索引,则可以用来进行搜索。默认值就是true
- false:字段不会被索引,不能用来搜索
- store:是否将数据进行独立存储,默认为false
- 原始的文本会存储在
_source
里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source
里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。
- 原始的文本会存储在
- analyzer:分词器,这里的
ik_max_word
即使用ik分词器
2.查看映射
发送请求:
# 请求方法:GET
GET /heima/goods/_mapping
响应结果:
{
"heima" : {
"mappings" : {
"goods" : {
"properties" : {
"images" : {
"type" : "keyword",
"index" : false
},
"price" : {
"type" : "float"
},
"subtitle" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"title" : {
"type" : "text",
"analyzer" : "ik_max_word"
}}}}}
}
3.一次创建索引库及配置映射(常用)
刚才的案例中,我们是把创建索引库和类型分开来做,其实也可以在创建索引库的同时,直接制定索引库中的类型
发送请求:
PUT /heima1
{
"settings": {
},
"mappings": {
"goods":{
"properties": {
"title":{
"type": "text",
"analyzer": "ik_max_word"
},
"subtitle":{
"type": "text",
"analyzer": "ik_max_word"
},
"images":{
"type": "keyword",
"index": false
},
"price":{
"type": "float",
"index": true
}
}
}
}
}
响应结果:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "heima1"
}
请求内容解释:
PUT /{索引库名称}
{
"settings【设置】": {},
"mappings【映射】": {
"{类型名称}":{
"properties": {
"title":{
"type【类型】": "text",
"index【是否索引】": true,
"store【是否存储】": true,
"analyzer【分析器】": "ik_max_word"
}
...
}
}
}
}
4.3 文档操作
文档,即索引库中某个类型下的数据,会根据规则创建索引,将来用来搜索。可以类比做数据库中的每一行数据。
1.新增文档
发送请求:
POST /heima/goods
{
"title":"小米手机",
"images":"http://image.leyou.com/12479122.jpg",
"price":2699.00
}
响应结果:
{
"_index" : "heima",
"_type" : "goods",
"_id" : "EwVLY24BL4R5dXuhZ--1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
响应结果解析:
{
"_index【索引库】" : "heima",
"_type【类型】" : "goods",
"_id【主键id】" : "EwVLY24BL4R5dXuhZ--1",
"_version【版本】" : 1,
"result【操作结果】" : "created",
"_shards【分片】" : {
"total【总数】" : 2,
"successful【成功】" : 1,
"failed【失败】" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
可以看到结果显示为:created
,是创建成功了。
另外,需要注意的是,在响应结果中有个_id
字段,这个就是这条文档数据的唯一标示
,以后的增删改查都依赖这个id作为唯一标示。可以看到id的值为:EwVLY24BL4R5dXuhZ–1,这里我们新增时没有指定id,所以是ES帮我们随机生成的id。
2.查看文档
根据rest风格,新增是put,查询是get(post也可以用来做查询),不过查询一般都需要条件,这里我们