ElasticSearch

ElasticSearch

1. 什么是Restful

1. restful: 一种软件架构风格,如果一个架构符合REST原则,就称它为 RestFful 架构风格

2. rest : Resources Representation State Transfer 资源的表现层状态转化。设计原则 设计约束 设计思路 设计约定…

3. 资源(Resources): 所谓"资源",网络中一切事物统称为资源,就是网络上的一个实体,或者说是网络上的一个具体信息

每一个资源都存在一个唯一资源标识符(url)

4. 表现层(Representation) : 我们把"资源"具体呈现出来的形式,叫做它的"表现层"。

5. 状态转化(State Transfer): 客户端通过操作服务器中的资源,使资源发生某种状态转变,而这种转化是建立在表现层之上的,所以就是"表现层状态转化" CRUD 增删改查

6. REST原则

1. 指一个URL代表一个唯一资源
2. 使用Rest的URL替换传统URL

在这里插入图片描述

3. 通过HTTP协议里面四个动词:GET、POST、PUT、DELETE

对应四种服务器端的基本操作:

GET用来获取资源

POST用来更新资源(也可以用于添加资源)

PUT用来添加资源(也可以用于更新资源)

DELETE用来删除资源。

2. 什么是全文检索

全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。

全文检索(Full-Text Retrieval(检索))以文本作为检索对象,找出含有指定词汇的文本。全面、准确和快速是衡量全文检索系统的关键指标。

关于全文检索,我们要知道:

1 只处理文本。
2 不处理语义。
3 搜索时英文不区分大小写。
4 结果列表有相关度排序。

3. 什么是ElasticSearch

Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库。想要 使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。

4. ES的应用场景 json格式数据 restful

Es主要以轻量级JSON作为数据存储格式,这点与MongoDB有 点类似,但它在读写性能上优于 MongoDB 。同时也支持地理位置查询 ,还方便地理位置和文本混合查询 。 以及在统计、 日志类数据存储和分析、可视化这方面是引领者。

5. ES的安装

1. 安装前准备 centos7 + java 8 + elastic 7.10.2

2. 在官方网站下载ES wget http://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.1.tar.gz

3. 用普通用户启动es,上传es到普通用户的家目录,并安装elasticsearch

4. elasticsearch的目录结构

    bin                         可执行的二进制文件的目录
    config                    	配置文件的目录
    lib                         运行时依赖的库
    logs        		运行时日志文件
    plugins                   	es中提供的插件

5. 运行es服务 在bin目录中执行 ./elasticsearch

启动成功

在这里插入图片描述

6. 测试ES是否启动成功 在命令终端中执行: curl http://localhost:9200 出现以下信息:

在这里插入图片描述

7. 开启ES远程访问 vim elasticsearch.yml 将原来network修改为以下配置: network.host: 0.0.0.0

在这里插入图片描述

8. 关闭网络防火墙

systemctl stop firewalld 关闭本次防火墙服务

systemctl disable firewalld 关闭开启自启动防火墙服务

9. 启动时错误解决方案

在这里插入图片描述

错误一

重新连接root

查看是否修改完成
在这里插入图片描述

错误二

在这里插入图片描述

错误三

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HkMI8ELp-1646563052021)(/Users/cc/Library/Application Support/typora-user-images/image-20220302161746805.png)]

全部修改完要退出重登虚拟机连接 否则不生效

http://172.16.246.133:9200 访问成功

在这里插入图片描述

6. ES中基本概念

1. 接近实时(NRT Near Real Time )

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒内)

2. 索引(index)

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的)并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字索引类似于关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。

Elasticsearch中的索引有多层的意思:
a 某一类文档的集合就构成了一个索引,类比到数据库就是一个数据库
(或者数据库表);
b它还描述了一个动作,就是将某个文档保存在elasticsearch的过
程也叫索引;
c 倒排索引。

3. 类型(type)

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念

NOTE: 在5.x版本以前可以在一个索引中定义多个类型,6.x之后版本也可以使用,但是不推荐,在7~8.x版本中彻底移除一个索引中创建多个类型

索引是库,类型是表(5.x)

4. 映射(Mapping)

Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema(对表的字段、类型的约束),用于定义一个索引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型

简洁:mapping 是ES每一个文档的约束信息,例如属性的类型,是否能被索引等。

5. 文档(document)

**一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。**比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。

具体的一条数据,类比到数据库就是一条记录。
在这里插入图片描述

6. 概念关系图

在这里插入图片描述

面试题:5.x过渡到6.x版本的变化?

7. Kibana

1. 简介ES的可视化工具

在这里插入图片描述

2. 安装及启动

安装tar包解压

root下修改config —> kinaba.yml

server.host: "172.16.246.133"                		#Kibana服务器主机名 (虚拟机ip)
elasticsearch.hosts: ["http://172.16.246.133:9200"] #Elasticsearch服务器地址

启动:http://172.16.246.133:5601/

3. 使用

1. Dev Tools可以用来设置

默认6版本每创建一个索引就会有5个备份,7版本需要自己设置

索引创建成果标志

10. RestAPI

1. 基本CRUD

PUT /dangdang/       创建索引(不能有大写字母)
DELETE /dangdang     删除索引
DELETE /*            删除所有索引(执行这个操作后kibana也会异常关闭,需要重新运行)
GET /_car/indices?v  查看全部索引信息  加上?v是查看表头

# 类型操作  index/type(mapping)  一个索引中只能存在一个类型 
# mapping type:text keyword date integer long double boolean ip

# 创建类型(PUT POST)
# 用PUT创建要求索引不能存在(创建一个新索引)
PUT /ems
{
	"mapping":{
		"emp":{
			"properties":{
					"id":{"type":"keyword"},
					"name":{"type":"text"}
			}
		}
	}
}
# 文档操作:插入一条文档 PUT /索引/类型/1     这个1相当于ems/emp自带id,不是我们创建的那个
PUT /ems/emp/1
{
	"id":1,
	"name":"cc"
}

POST /ems/emp/1
{
	"id":1,
	"name":"cc"
}
# PUT和POST的区别是插入文档时PUT不会保留原有数据,直接替换原来全部的,POST会保留,推荐POST
# 假设插入文档没有提供文档id(也就是最后的那个数字),则es会自己给我们生成一个id

# 更新文档
# 1. 不保留原始数据更新(先删除后插入)
POST /ems/emp/1
{
	"name":"bb"
}
# 2. 保留原始数据更新,更新时添加新字段 POST /索引/类型/id/_update   {"doc:{}"}
POST /ems/emp/1/_update 
{
	"doc":{
		"name":"bb",
		// 添加新数据
		"bir":"2000-12-15"
	}
}
# 3. script更新(在原有的数据上)      POST /索引/类型/id/_update {"script":"ctx._source.类型 操作"}
POST /ems/emp/1/_update 
{
	"script":"ctx._source.name=yy"
}

# 文档批量操作 _bulk  添加(index) 删除(delete) 更新(update)
PUT /ems/emp/_bulk
// 生成新的
{"index":{"id:2"}}
	{"name":"aa"}
{"delete":{"id":1}}
{"update":{"id":"2"}}
	{"doc":{"name":"cc"}}

# 删除文档 DELETE /索引/类型/id
POST /ems/emp/1

# 查看类型   GET /索引名/_mapping/类型名
GET /ems/emp/_mapping/name
# 根据id查询文档中一条记录 GET /索引/类型/文档id
GET /ems/emp/1

11. ES中高级检索(Query)

1. 检索方式

1. 通过URL参数(QueryString)
2. 基于传递JSON作为请求体(request body) 推荐

在这里插入图片描述

3. QueryString

# 语法:GET /索引/类型/_search?查询条件
# q=*  查询所有  排序 sort 分页 from  size 只返回某个类型_source
GET /ems/emp/_search?q=*&sort=age:desc&size=5&from=0&_source=name

4. QueryDSL

特定领域对的查询语言

# 语法:GET /索引/类型/_search{}
# 1. 查询所有
GET /ems/emp/_search
{
	"query": {
		// 匹配所有文档
		"match_all":{}
	}
}

# 2. 查询所有并排序 sort   text字段无法排序
GET /emp/ems/_search
{
	"query": {
		"match_all": {}
	},
	"sort": [
    {
      "age": {
        "order": "desc"
      }
    },
    {
    	"bir": {
    		"order": "desc"
    	}
    }
	]
}

# 3. 分页查询 size from
GET /ems/emp/_search
{
	"query":{
			"match_all":{}
	},
	"size":"2",
	"from":"0",
	"sort": [
		{
		"age": {
			"order": "desc"
			}
		}
	]
}

# 4. 指定查询结果中返回指定字段_source
GET /ems/emp/_search
{
	"query": {
		"match_all": {}
	}
	"_source": ["name","age","content"]
}

# 5. queryDSL中term查询 基于关键词进行查询
# 1) type: 只有text类型分词  keyward、integer、date...不分词 
# 2) ES中默认使用分词器是标准分词器 StandardAnalyzer 中文-->单字分词 英文-->单词分词
# 查看分词器分词效果
GET /_analyze
{
	"text": "Redis is open source DB"
}
# 演示
GET /ems/emp/_search
{
	"query": {
		"term": {
			"content": {
				"value": "spring"
			}
		}
	}
}


# 6. 范围查询 range
GET /ems/emp/_search
{
	"query": {
		"range": {
			"age": {
				# 0-20 e结尾 包含
				"gte": 0,
				"lte": 20
			}
		}
	}
}

# 7. 前缀查询 基于关键词前缀(prefix)查询
GET /ems/emp/_search
{
	"query": {
		"perfix": {
			"address": {
				"value": "北京"
			}
		}
	}
}

# 8. 通配符查询 wildcard ?用来匹配一个任意字符 *用来匹配多个字符 只能放在后面
GET /ems/emp/_search
{
	"query": {
		"wildcard": {
			"FIELD": {
				# "value": "北?"
				"value": "北*"
			}
		}
	}
}

# 9. 多id查询(ids) 值为数组类型,用来根据一组id获取多个相应的文档
GET /emp/ems/_search
{
	"query": {
		"ids": {
			"values": ["1","2","3"]
		}
	}
}

# 10. fuzzy模糊查询  最大模糊错误必须在0-2之间
# 搜索关键词长度为2 不允许存在模糊
# 搜索关键词长度为3-5 允许一次模糊
# 搜索关键词长度大于5 允许最大两个模糊
GET /ems/emp/_search
{
	"query": {
		"fuzzy": {
			"content": "elasticsoarch"
		}
	}
}

# 11. 布尔查询(bool)  must:相当于&& should:相当于||  must_not: 相当于!
GET /ems/emp/_search
{
	"query": {
		"bool": {
		 # "must": [
		#	"should": [
	 must_not: [
				{
					"term": {
						"age": {
							"value": "23"
						}
					}
				},
					"term": {
						"address": {
							"value": "北京"
						}
					},
					"range": {
						"age": {
							"gte": 0,
							"lte": 30
						}
				}
			]
		}
	}
}

# 12. 高亮查询(highlight) 对查询结果二次渲染成高亮的
# 自定义高亮html标签:可以在highlight中使用pre_tags和post_tags
GET /emp/ems/_search
{
	"query": {
		"term": {
			"content": {
				"value": "redis"
			}
		}
	},
	"highlight": {
	  # 设置高亮类型
		"pre_tags": ["<span style='color:red'>"],
		"post_tags": ["</span>"],
		"fields": {
			# "content": {}
			"*": {}
		}
	}
}

# 即使设置了*也不会全部高亮,仍然是对content高亮,因为es默认是开启严格匹配的
# 如果要全部字段高亮,关闭严格匹配"require_field_match": "false"
# 假设还是没有,查看ik有没有开启
	"highlight": {
	  # 设置高亮类型
		"pre_tags": ["<span style='color:red'>"],
		"post_tags": ["</span>"],
		"fields": {
			"*": {}
		},
		"require_field_match": "false"
	}
}

# 13. 多字段查询(multi_match)
# 1. 如果搜索的字段分词,会对query先分词再搜索
# 2. 如果搜索的字段不分词,会直接使用query整体进行该字段搜索
GET /ems/emp/_search
{
	"query": {
		"multi_match": {
			"query": "Redis",
			"fields": ["content","address"]
		}
	}
}

# 14. 多字段分词查询(query_string) analyzer: 可以指定分词器
GET /ems/emp/_search
{
	"query": {
		"query_string": {
			"query": "Redis",
			"fields": ["name","content"]
		}
	}
}

12. 索引库原理

在这里插入图片描述

13. IK分词器

默认ES中采用标准分词器进行分词,这种方式并不适用于中文网站,因此需要修改ES对中文友好分词,从而达到 更加的搜索的效果。

1. 安装IK分词器

在线安装

cd /home/es/el…/bin

./el…-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.2/elasticsearch-analysis-ik-7.10.2.zip

重新启动es kibana

在线安装IK配置文件在es安装目录中analysis-ik目录

还可以本地安装

在这里插入图片描述

本地安装IK配置文件在 es安装目录/plugins/analysis-ik/configs

3. 测试IK分词器

IK分词器提供了两种mapping类型用来做文档的分词分别是
ik_max_word和ik_smart

在这里插入图片描述

GET /_analyze
{
	"text": "中华人民共和国国歌",
	# "analyzer": "ik_smart"
	"analtzer": ik_max_word"
}

4. 使用IK分词器

PUT /ems
{
	"mappings": {
		"emp": {
			"properties": {
				"name": {
					"type": "text"
					"analyzer": "ik_max_word"
					# 可写可不写,但是搜索的分词器一定要与索引一致
					# "search_analyzer": "ik_max_word"
				}
			}
		}
	}
}

# 放入文档测试

5. 配置扩展词

IK支持自定义扩展词典和停用词典,所谓扩展词典就是有些词并不是关 键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入 扩展词典。停用词典就是有些词是关键词,但是出于业务场景不想使用 这些关键词被检索到,可以将这些词放入停用词典。

如何定义扩展词典和停用词典可以修改IK分词器中config目 录中IKAnalyzer.cfg.xml这个文件。

注意:词典的编码必须为UTF-8,否则无法生效

1.修改vim IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">ext_dict.dic</entry>
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>

2.在ik分词器目录下config目录中创建ext_dict.dic文件 编码一定要为UTF-8才能生效 vim ext_dict.dic 加入扩展词即可

3.在ik分词器目录下config目录中创建ext_stopword.dic文件 vim ext_stopword.dic 加入停用词即可

ext_dict.dic ext_stopword.dic一行只能有一个词 不能有,分割

修改后的自定义字典只能对后续文档生效,对原始文档无效

4.删除es/data文件 重启es

6. 每次人工去增加热词显然是不现实的,可以增加一个应用EMS,统计热词,写成一个ext.txt,再追加,动态热词追加

在这里插入图片描述

7. 实现配置IK远程拓展词典

建立Springboot项目,选择lombok、web、devtools

properties

server.port=9090
server.servlet.context-path=/es/ext.txt

在webapp下新建ext.txt 输入几个测试数据

启动springboot,访问自己主机ip:9090/es/

测试linux能不能ping通自己主机ip:9090/es/

修改vim IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">ext_dict.dic</entry>
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">ext_stopword.dic</entry>
  	<!--用户可以在这里配置自己的远程拓展词字典-->
  	<entry key="remove_ext_dict">自己主机ip:9090/es/</entry>
</properties>

kibana测试

同理可以配置远程拓展停止词字典(remove_ext_stopwords)

14. 过滤查询(filter query)

1. 过滤查询

ES中的查询操作分为查询(query)和过滤(filter)。查询是之前提到的query查询,默认会计算每个返回文档的得分,然后根据得分排序。过滤filter只会筛选出符合的文档,不计算得分,可以缓存文档。

从性能考虑,过滤比查询更快

过滤适合大范围筛选数据,查询适合精准匹配数据。一般应用先使用过滤操作过滤数据,然后使用查询匹配数据

在这里插入图片描述

2. 过滤语法(query和filter组合使用需要用bool组合到一起)

GET /ems/emp/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"content": {
							"value": "框架"
						}
					}
				},
			],
      "filter": {
      	"range": {
      		"age": {
      			"gte": 0,
      			"lte": 23
      		}
      	}
      }
		}
	}
}

先filter再query

ES会自动缓存经常使用的filter

3. 常见过滤器类型

term:指定关键词过滤,数组

exists filter:过滤存在指定字段,获取字段不为空的索引记录使用

ids filter:过滤含有指定字段的索引记录

# 1. 基于指定的关键词过滤 term
GET /ems/emp_search{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				},
			],
      "filter": {
      	"term": {
      		"content": "架构"
      	}
      }
		}
	}
}

# 2. 多个关键词
GET /ems/emp_search{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				},
			],
      "filter": {
      	"term": {
      		"content": ["架构","Redis"]
      	}
      }
		}
	}
}

# 2. 基于指定的字段过滤 filter query
GET /ems/emp/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				}
			],
			"filter": {
				"exists": {
					"field": "address"
				}
			}
		}
	}
}

# 3. ids filter 
GET /ems/emp/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				}
			],
			"filter": {
				"ids": {
					"values": [
						"1",
						"2"
					]
				}
			}
		}
	}
}

15. Java操作ES

1. 基本结构

在这里插入图片描述

2. 操作

依赖

<!-- 注意:按道理来说只要引入elasticsearch-rest-high-level-client即可。但是因为引入elasticsearch跟对应的版本不符。所以需要额外引入elasticsearch的正确版本。否则启动失败 -->
<dependencies>
   <dependency>
       <groupId>org.elasticsearch.client</groupId>
       <artifactId>elasticsearch-rest-high-level-client</artifactId>
       <version>7.10.2</version>
   </dependency>
  
   <dependency>
       <groupId>org.elasticsearch</groupId>
       <artifactId>elasticsearch</artifactId>
       <version>7.10.2</version>
   </dependency>
  
     <dependency>
       <groupId>elasticsearch.plugin</groupId>
       <artifactId>transport-netty4-client</artifactId>
       <version>7.10.2</version>
   </dependency>
</dependencies>

启动远程es kb

注意:java操作用的是9300端口,因为transportClient使用的是TCP,kibana是RestFul连接

建立客户端链接:test -> java -> com.cc -> TestEs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ySlu7dV-1646563052026)(/Users/cc/Library/Application Support/typora-user-images/image-20220305151959861.png)]

1. CRUD

测试对索引的操作:test -> java -> com.cc -> TestIndexAndeTypeMapping

要用@Before,需要删掉xml中的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试对文档的操作:

添加文档

main -> java -> com.cc -> book

test -> java -> com.cc -> TestDocument

指定ID

在这里插入图片描述

自动生成ID

在这里插入图片描述

更新文档

在这里插入图片描述

删除文档

在这里插入图片描述

查询文档

查询一条
在这里插入图片描述

查询所有

在这里插入图片描述

term查询

在这里插入图片描述

2. 批量更新

在这里插入图片描述

在这里插入图片描述

3. 各种查询

查询所有见上

分页查询

在这里插入图片描述

倘若查询条件相同,只不过要区分term还是match_all查询,可以把查询结果单独封装,然后测试方法里面设置查询方式即可

查询条件

在这里插入图片描述

测试方法

在这里插入图片描述

4. 高亮查询

在这里插入图片描述

把结果放入emp对象
在这里插入图片描述

对输出结果高亮处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gWxqpScc-1646563052033)(/Users/cc/Library/Application Support/typora-user-images/image-20220305165927723.png)]

5. 过滤查询filter

在这里插入图片描述

6. 综合

在这里插入图片描述

16. SpringBoot Data操作ES

RestClient和ElasticSearchRespositoy

RestClient:强大、灵活、但是不能友好地对象操作

ElasticSearchRespositoy:对象操作友好

1. RestClient

依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置文件

server.port=8989
server.servlet.context-path=/es

6版本后不再推荐使用transportClient,而是使用RestClient

配置类

@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    // 这个client用来替换transportClient对象(9300)
    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
				//定义客户端配置对象
        //Rest接口9200
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()  
            .connectedTo("172.16.246.133:9200")
            .build();
        //通过RestClients对象创建
        return RestClients.create(clientConfiguration).rest();                         
    }
}

测试启动

test -> java -> com.cc -> TestRestClient

CRUD 基本操作跟transportClient一样,可能方法名有些不同

在这里插入图片描述
在这里插入图片描述

我们发现基本上操作跟transportClient差不多,但是有个问题就是我们每次更新对象需要转换成JSON格式,十分麻烦。所以还有一种使用ElasticSearchRespositoy接口进行操作,他是一个rest客户端

简单的查询可以使用ElasticSearchRespositoy,想做更强大的功能就使用RestClient

2. ElasticSearchRespositoy

依赖和配置和配置类不变

我们可以使用@Document将Emp的对象映射成ES中一条json格式文档

@Document: 
	作用:将对象映射成ES中一条json格式文档
	属性:
   	indexName:用来指定这个对象转为json文档存入哪个索引中,要求es服务器中之前不存在这个索引名
    type: 用来指定在当前这个索引下创建的类型名称
@Field:
	作用:用在属性上,代表mapping中的一个属性,一个字段
	属性:
		type:用来指定字段的类型(枚举,FieldType.xxx)
		analyzer: 指定分词器
		formate: 指定日期格式
@id:将对象中id属性与文档中_id一一对应		

新建entity com.cc.entity -> Emp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dhxlrFKG-1646563052034)(/Users/cc/Library/Application Support/typora-user-images/image-20220305191728684.png)]

自定义EmpResopsitory

新建dao com.cc.elasticsearch.dao -> EmpResopsitory接口

测试代码

test.java.com.cc.TestRestClient

1. CRUD

在这里插入图片描述
在这里插入图片描述

2. ElasticSearchRespositoy支持自定义指令

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们只需要在EmpResopsitory定义,无需实现

在这里插入图片描述

test
在这里插入图片描述

其他演示

在这里插入图片描述

3. 高亮查询

EmpResopsitory做不了高级查询例如高亮查询,所以需要借助RestFulClient

日期格式需要格式化

在这里插入图片描述

放入emp

在这里插入图片描述

17. es集群

1. 相关概念

es单个节点就可以集成集群,单个节点问题

1. 单节点压力问题 并发压力 物理资源上限压力
2. 数据冗余备份能力

集群cluster名称(only-one):elasticsearch

节点node(多个): 名称也是唯一的

分片与复制(shards & replicas)

分片

允许你水平分割/扩展你的内容容量允许你在分片(潜在地位于多个节点上)之上进行分布式的、并行的操作,进而提 高性能/吞吐量 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。
在这里插入图片描述

复制

故障转移机制,防止分片/节点离线数据丢失

在分片/节点失败的情况下,提供了高可用性。因为这个原因, 注意到复制分片从不与原/主要 (original/primary)分片置于同 一节点上是非常重要的。 扩展你的搜索量/吞吐量,因为 搜索可以在所有的复制上并行运行

每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个 索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。

一个索引的多个分片可以存放在集群中的一台主机上, 也可以存放在多台主机上,这取决于你的集群机器数量。主 分片和复制分片的具体位置是由ES内在的策略所决定的。
在这里插入图片描述

6默认

在这里插入图片描述

7默认都为1

2. 快速搭建集群

1 将原有ES安装包复制三份
# 即使指定了es的master是es自己决定的
	cp -r elasticsearch-7.10.2/ master/
	cp -r elasticsearch-7.10.2/ slave1/
	cp -r elasticsearch-7.10.2/ slave2/
	
2 删除复制目录中data目录 
	#注意:由于复制目录之前使用过因此需要在创建集群时将原来数据删除
	rm -rf master/data
	rm -rf slave1/data
	rm -rf slave2/data
	
3 编辑文件夹中config目录中jvm.options文件跳转启动内存(默认启动1g)
	vim master/config/jvm.options  
	vim slave1/config/jvm.options
	vim slave2/config/jvm.options
	#分别加入: -Xms300m -Xmx300m
	
4 分别修改三个文件夹中config目录中elasticsearch.yml文件
	vim master/config/elasticsearch.yml
	vim salve1/config/elasticsearch.yml
	vim slave2/config/elasticsearch.yml

#分别修改如下配置:
master/config/elasticsearch.yml
 
cluster.name: my-es  #集群名称(集群名称必须一致)
node.name: node-1   #节点名称(节点名称不能一致)
network.host: 0.0.0.0    #监听地址(必须开启远程权限,并关闭防火墙)
http.port: 9201  #监听端口(在一台机器时服务端口不能一致)
discovery.seed_hosts: ["172.16.246.133:9302", "172.16.246.133:9303"]    #另外两个节点的ip
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
gateway.recover_after_nodes: 3  #集群可做master的最小节点数
transport.tcp.port: 9301  #集群TCP端口(在一台机器搭建必须修改)
http.cors.enabled: true
http.cors.allow-origin: "*"


salve1/config/elasticsearch.yml

cluster.name: my-es
node.name: node-2
network.host: 0.0.0.0
http.port: 9202
discovery.seed_hosts: ["172.16.246.133:9301", "172.16.246.133:9303"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
gateway.recover_after_nodes: 3
transport.tcp.port: 9302
http.cors.enabled: true
http.cors.allow-origin: "*"

slave2/config/elasticsearch.yml

cluster.name: my-es
node.name: node-3
network.host: 0.0.0.0
http.port: 9203
discovery.seed_hosts: ["172.16.246.133", "172.16.246.133:9302"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
gateway.recover_after_nodes: 3
transport.tcp.port: 9303
http.cors.enabled: true
http.cors.allow-origin: "*"

5 启动多个es
./master/bin/elasticsearch
./slave1/bin/elasticsearch
./slave2/bin/elasticsearch
	
6 查看节点状态
	curl  http://10.102.115.3:9201
	curl  http://10.102.115.3:9202
	curl  http://10.102.115.3:9203

7 查看集群健康
http://172.16.246.133:9201/_cat/health?v

3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9HV75C6a-1646563052037)(/Users/cc/Library/Application Support/typora-user-images/image-20220306154523010.png)]

启动 集群id都一致说明成功
在这里插入图片描述

集群健康

在这里插入图片描述

如果要通过kibana查看,需要修改配置

在这里插入图片描述

设置成master的,然后重启kibana,然后重新连接(连接任意一个节点)

检测是否分片

3. es集群可视化工具head

1 访问github网站
	搜索: elasticsearch-head 插件
	
2 安装git
	yum install git
	
3 将elasticsearch-head下载到本地
	git clone git://github.com/mobz/elasticsearch-head.git

4. 安装nodejs
	#注意: 没有wget的请先安装yum install -y wget
	wget http://cdn.npm.taobao.org/dist/node/latest-v8.x/node-v8.1.2-linux-x64.tar.xz

5 解压缩nodejs(elasticsearch-head 插件依赖node)
	xz -d node-v10.15.3-linux-arm64.tar.xz
	tar -xvf node-v10.15.3-linux-arm64.tar

6. 配置环境变量
	mv node-v10.15.3-linux-arm64 nodejs
	mv nodejs /usr/nodejs
	vim /etc/profile
		export NODE_HOME=/usr/nodejs
		export PATH=$PATH:$JAVA_HOME/bin:$NODE_HOME/bin
	source /etc/profile
7	进入elasticsearch-head的目录
	npm config set registry https://registry.npm.taobao.org
	npm install
	npm run start

8 跨域
  编写节点的elastsearch.yml配置文件开启head插件的访问(上面已经修改了)
	http.cors.enabled: true
	http.cors.allow-origin: "*"

9.  启动访问head插件 默认端口9100
	http://172.16.246.133:9100  查看集群状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HvdRBelr-1646563052038)(/Users/cc/Library/Application Support/typora-user-images/image-20220306182233618.png)]
启动成功

连接任意一个节点

带边框:主分片 普通:拷贝分片 星:主节点

在这里插入图片描述

支持新建索引

在这里插入图片描述

创建成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uSQ6M17x-1646563052038)(/Users/cc/Library/Application Support/typora-user-images/image-20220306182946055.png)]

断掉一个节点依然正常工作

在这里插入图片描述

断掉两个数据同步到最后一个节点上

在这里插入图片描述

重新启动两台节点 数据恢复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值