安装部署
先前部署项目部署es的流程
下载elasticsearch
https://www.elastic.co/cn/downloads/elasticsearch
解压安装elasticsearch
修改配置文件,配置为单个节点
config/elasticsearch.yml
discovery,seed_hosts:[“127.0.0.1:9200”]
cluster.initial_master_nodes:[“node-1”]
因为部分elasticsearch支持的jdk版本不一样,所以可以自己再给elasticsearch配置一个jdk版本
启动elasticsearch
因为elasticsearch不能以root用户启动,所以 要新建一个用户用来启动elasticsearch
adduser 新用户名
passwd 初始化新用户的密码
使用root用户找到sudoers文件,赋予可读写权限
whereis sudoers
修改权限
chomd -v u+w sudoers的路径
进入sudoers文件,在root下添加
新用户用户名 ALL=(ALL) ALL
切换到新用户
su 新用户名
之后进入elasticsearch目录下,进入bin目录,后台运行elasticsearch
./elasticsearch -d
部署问题(使用版本为7.16)
启动配置
- es的安装目录下的config/elasticsearch.yml
集群名设置
cluster.name: 集群名
节点名设置
node.name: 当前节点名
任何ip都能访问
network.host: 0.0.0.0
启动端口
http.port: 9200
jdk版本不对
一般使用的jdk为8版本,但是es版本不支持jdk8,所以要给es专门配置一套jdk
es要求的版本最低为11版本
所以,下载11版本的jdk,并在环境变量中配置ES_JAVA_HOME即可
启动权限问题
按照上述的方式配好用户后,可能还是会提示没有权限启动
启动的时候不能使用sudo方式,不然依旧是“不能以root用户启动es”的报错
最直接的方式就是新建一个用户后,把es的安装目录的权限分给新用户
例如(root用户下)
adduser es
chown -R es es安装目录
jvm警告
Java HotSpot™ 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
这个错误需要修改es安装目录下的config/jvm.optionsn
将
-XX:+UseConcMarkSweepGC
修改为
-XX:+UseG1GC
无法使用问题
部署完之后不仅要访问ip:端口
查看启动状态
也需要ip:端口/_cat/nodes?pretty
检查是否正常
如果显示
{
"error": {
"root_cause": [
{
"type": "master_not_discovered_exception",
"reason": null
}
],
"type": "master_not_discovered_exception",
"reason": null
},
"status": 503
}
则还是没有准备,去安装目录下的conf/elasticsearch.yml
中检查配置
查看两个内容,这两个节点的内容一定要一致
cluster.initial_master_nodes: ["node1"]
node.name: node1
文件权限与存储大小问题
报错内容
ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch/elasticsearch/logs/my-application.log
解决方案
切换到root用户修改一些内容
elasticsearch用户拥有的可创建文件描述的权限太低,至少需要65536,
vim /etc/security/limits.conf # 在最后面追加下面内容
es启动用户 hard nofile 65536
es启动用户 soft nofile 65536
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量
vim /etc/sysctl.conf # 在最后面追加下面内容
vm.max_map_count=655360
执行 sysctl -p
介绍
es是一个分布式,高扩展,高实时的搜索与数据分析引擎,通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变的简单,本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据
核心概念
es是面向文档的搜索引擎
es和数据库的比对
数据库 | es |
---|---|
数据库 | 索引 |
表 | types |
行 | documents |
字段 | fields |
文档
es的数据存储格式相当于索引下的类型里面的json格式的数据
因为es是面向文档的搜索,所以一个文档就是es中可搜索的最小的单元
类比于mysql中,就是把mysql中的一行数据以json的格式保存在es中
类型
相当于数据库的表,一个索引下可以有很对类型,但是在es6.0开始,type就已经主键废弃了,但是依旧可以设置多个类型,但是在7.0开始,一个索引只能有一种类型了(_doc)
索引
不同特性的文档存放在不同的索引里
索引名称必去全部都是小写
单个集群中可以定义任意多个索引
索引具有mapping和setting的概念,mapping用来定义文档字段的类型,setting用来定义不同数据的分布
基本操作
创建一个空的索引
创建一个0副本2分片的repledata索引
PUT /ropledata
{
"settings": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
}
修改副本数量(分片数量无法修改)
PUT ropledata/_settings
{
"number_of_replicas" : "2"
}
删除索引
DELETE /ropledata
插入数据
插入数据的时候可以指定ID,不指定的话es会帮我们生成
id是101而不是数据中的"id":1
//指定id
POST /ropledata/_doc/101
{
"id":1,
"name":"且听_风吟",
"page":"https://ropledata.blog.csdn.net",
"say":"欢迎点赞,收藏,关注,一起学习"
}
修改数据
es的文档是不可以修改的,但是可以覆盖,es的数据修改本质上就是对文档的覆盖
es对数据的修改分为全局更新和局部更新
全局更新是替换操作,就算是数据一样也会执行替换操作
局部更新是只有遇到新得内容的时候才会去更新
所以局部更新会比全局更新效率高
全局更新
PUT /ropledata/_doc/101
{
"id":1,
"name":"且听_风吟",
"page":"https://ropledata.blog.csdn.net",
"say":"再次欢迎点赞,收藏,关注,一起学习"
}
局部更新
POST /ropledata/_update/101
{
"doc":
{
"say":"奥力给"
}
}
查询数据
GET /ropledata/_doc/101
删除数据
DELETE /ropledata/_doc/101
查询语句
查询当前索引下全部的内容,并返回指定属性值的数据内容
(因为7.0之后是没有type的概念了,所以使用了_doc,如果还有type的概念的话,可以把_doc替换为相对应的type名即可查询)
GET /topledata/_doc/_search
{
"query":{
"match_all":{
}
},
"_source":["属性值","属性值"]
}
查询指定字符查找内容,并按照倒序排列,从第0条数据开始,查找10条数据(也就是分页查询)
GET /topledata/_doc/_search
{
"query":{
"mathc":{
"属性值":"关键字"
}
},
"sort":[
{
"属性字段":{
"order":"desc"
}
}
],
"from":0,
"size":10
}
match
对于match而言,是根据分词来查询的,如果match中存在两个分词,那个他会一个一个查询,之后取他们的一个并集
可以使用match_phrase来指定精准查询不需要分词查
多条件查询
bool过滤可以用来合并多个过滤条件查询结果的布尔逻辑
must多个查询条件的完全匹配,相当于and
must_not多个查询条件的相反匹配,相当于not
should至少有一个查询条件匹配,相当于or
这些参数分别可以继承一个过滤条件或者一个过滤条件的数组
GET /topledata/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"属性值":"关键词"
}
}
]
},
"filter":{
"range":{
"关键词":{
"判断符":内容
}
}
}
}
}
聚合分析
es5之后fielddata默认是false,需要开启这个才能进行聚合
GET /topledata/_mapping/product
{
"properties":{
"tags":{
"type":"text",
"fielddata":true
}
}
}
获取某一列以不同分组的总和,并以某个条件做排序操作,并使用range过滤指定范围的数据
terms和term类似,单terms允许指定多个匹配条件,如果某个字段指定了多个值,那么需要文档一起做匹配
GET /topledata/_doc/_search
{
"query":{
"match":{
"属性值":"关键词"
}
},
"aggs":{
"聚合名称":{
"terms":{
"field":"属性值",
"range":[
{
"from":值,
"to":值
},
{
"from":值,
"to":值
}
],
"order":{
"下面的那个aggs的名称":"desc"
}
}
},
"aggs":{
"自定义名称":{
"avg":{
"field":"属性值"
}
}
}
}
}
整合springboot
引入elasticsearch启动包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置yml文件
spring:
elasticsearch:
uris: http://ip:端口
#当前部署的es并没有账号和密码
#username:
#password:
测试内容
实体类
新建一个实体类来标识一个索引
@Data
@Document(indexName = "testdemo")
public class EsDemoModel {
@Id
private String id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Text)
private String team;
}
方法
和redis类似,拥有一个ElasticsearchRestTemplate可以引用文章来源:https://www.toymoban.com/news/detail-406968.html
保存
@Test
void EsSaveTest(){
EsDemoModel esDemoModel = new EsDemoModel();
esDemoModel.setName("panther");
esDemoModel.setTeam("marvel");
elasticsearchRestTemplate.save(esDemoModel);
}
查询
@Test
void EsSearchTest(){
Query query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("man").defaultField("name")).build();
SearchHits<EsDemoModel> search = elasticsearchRestTemplate.search(query, EsDemoModel.class);
List<EsDemoModel> collect = search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
System.out.println(collect);
}
修改
es的操作和redis类似,如果遇到有相同_id的内容,就会覆盖,所以查出来之后再保存可以保证对一条数据的修改文章来源地址https://www.toymoban.com/news/detail-406968.html
删除
@Test
void EsDelete(){
Query query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("super man").defaultField("name")).build();
elasticsearchRestTemplate.delete(query,EsDemoModel.class);
}
到了这里,关于ES 部署,问题及整合spring boot 简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!