ElasticSearch基础1之环境搭建和springboot整合
什么是ElasticsearchElasticsearch (ES)是一个基于Lucene构建的开源、分布式、RESTful 接口全文搜索引擎。Elasticsearch 还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据。它可以在很短的时间内在储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动...
·
- 什么是Elasticsearch
Elasticsearch (ES)是一个基于Lucene构建的开源、分布式、RESTful 接口全文搜索引擎。Elasticsearch 还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据。它可以在很短的时间内在储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。
Elasticsearch就是为高可用和可扩展而生的。可以通过购置性能更强的服务器来完成。
官网:https://www.elastic.co/downloads/elasticsearch
中文社区https://es.xiaoleilu.com/
什么是PB级别https://baike.baidu.com/item/PetaByte/5910820
- Elasticsearch优势
1、横向可扩展性:只需要增加台服务器,做一点儿配置,启动一下Elasticsearch就可以并入集群。
2、分片机制提供更好的分布性:同一个索引分成多个分片(sharding);分而治之的方式可提升处理效率。
3、高可用:提供复制( replica) 机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用节点上。
- Elasticsearch应用场景
大型分布式日志分析系统ELK elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)
大型电商商品搜索系统、网站站内搜索、网盘搜索引擎等。
- Elasticsearch存储结构
Elasticsearch是文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
关系数据库存储方式为 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns){ "name" : "admin", "sex" : 0, "age" : 25 }
Elasticsearch存储方式为 ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields) - Kibana可视化界面
Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。
你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。
你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。
Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示Elasticsearch查询的变化。 - linux安装elasticsearch
环境: 本次安装的JDK环境是JDK1.8(64),elasticsearch版本6.0以上,es默认启动内存是1G
--------------使用端口----
9300端口: ES节点之间通讯使用
9200端口: ES节点 和 外部 通讯使用
- 下载elasticsearch-6.4.3
地址:
下载完成后,将文件上传到/usr/local下 - 解压elasticsearch
cd /usr/local tar -zxvf elasticsearch-6.4.3.tar.gz // 重命名 mv elasticsearch-6.4.3 elasticsearch6.4
- 修改elaticsearch.yml配置文件
// 进入config目录 vi elaticsearch.yml #################修改2处########### network.host: 192.168.127.132 // 默认注释掉的,并修改成你的服务器ip 或者设置为0.0.0.0表示允许外网访问 http.port: 9200 // 默认注释掉的,使用默认的9200
- 创建用户
因为elasticsearch不支持root用户启动,所以我们得创建非root用户,依次执行下面命令
// 创建分组 groupadd basic // 创建用户 密码123456 useradd xiaobo -g basic -p 123456 // 给用户授权elasticsearch6.4 chown -R xiaobo:basic elasticsearch6.4 // 切换用户 su xiaobo
- 切换非root账户,启动elasticsearch
注意: 不要使用root账户启动,
我们发现还是启动报错,继续下面步骤cd /usr/local/elasticsearch6.4/bin ./elasticsearch
- 启动报错1
解决:
// 切换root用户 su root cd /etc vi sysctl.conf ##############新增如下配置 vm.max_map_count=655360 ##############保存,退出 // 执行下面命令 sysctl -p
- 启动报错2
2个错误原因: 因为新创建的用户最大可创建文件数太小,最大虚拟内存太小vi /etc/security/limits.conf ###########配置如下内容, '*'号也要 * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 ##############保存、退出 //重启虚拟机 shutdown -r now
- 再次启动
// 关闭防火墙 systemctl stop firewalld.service cd /usr/local/elasticsearch6.4/bin // 后台启动 ./elasticsearch -d
- 测试
地址: http://192.168.127.132:9200/
如上图所示 , elastaisearch安装完成!!!
- Kibana可视化界面安装
- 下载 Kibana6.4.3,下载完成后,将文件上传到/usr/local下
地址:
- 解压
cd /usr/local tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz
- 重命名
mv kibana-6.4.3-linux-x86_64 kibana6.4
- 修改kibana.yml配置文件
cd kibana6.4/config/ vi kibana.yml #############修改3处 server.port: 5601 server.host: "192.168.127.132" elasticsearch.url: "http:// 192.168.127.132:9200" #############保存、退出
- 启动
// 先启动elasticseach
su xiaobo cd /usr/local/elasticsearch6.4/bin ./elasticsearch -d
// 启动kibanasu root cd /usr/local/kibana6.4/bin ./kibana
- 测试
http://192.168.127.132:5601
安装完成!!!
- Elasticsearch简单操作
我们一般数据库保存数据方式为: ⇒ 创建数据库 ⇒ 创建表 (user表) ⇒ 行(一条数据) ⇒ 列(Fields)
Elasticsearch保存数据方式为 ⇒ 创建索引(Index) ⇒ 创建类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
类似于mysql得操作:#######1、创建索引 PUT /basic #######2、查询索引 GET /basic #######3、创建文档 方式: /索引/文档/id 编辑同样使用该方法 PUT /basic/user/1 { "name":"xiaobo", "age":28, "address":"安徽合肥市" } #######3、查询文档 方式: /索引/文档/id GET /basic/user/1 #######4、删除索引 DELETE /basic
创建basic数据库
创建user表
添加一条id为1得user记录
其他查询语句
使用9200端口查询URL: http://192.168.127.132:9200/basic/user/_search#######使用POST自动生成ID添加数据 POST /basic/user/ { "name":"刘德华65", "age":65, "address":"中国" } #######指定id查询 GET /basic/user/7OUdFm0B_Kbnp8-CVruy #######查询所有 GET /basic/user/_search #######根据id集合查询 GET /basic/user/_mget { "ids":[1,2] } #######查询年龄等于19岁的用户 GET /basic/user/_search?q=age:19 #######查询年龄在30-65的并排序 GET /basic/user/_search?q=age[30 TO 65]&sort=age:desc #######排序并分页查询 GET /basic/user/_search?sort=age:desc&from=0&size=2 #######只展示name、age字段的属性值 GET /basic/user/_search?&_source=name,age
- Elasticsearch使用乐观锁进行版本控制
如下图所示: 每次对用户id为2进行修改,_version都会自增加1。
使用乐观锁机制保证多线程情况下安全问题,每次修改都会判断: where version=3
- Springboot整合ElasticSearch
- 创建Springboot项目,pom.xml引入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
- application.yml配置如下
注意: 集群名称cluster-name: elasticsearch,默认就是elasticsearch。查看: http://192.168.127.132:9200/spring: data: elasticsearch: ####集群名称 cluster-name: elasticsearch ####地址 cluster-nodes: 192.168.127.132:9300
如果需要修改,可以在/usr/local/elasticsearch6.4/config/elasticsearch.yml中配置, 我这里没改,就用默认的
- 创建实体类 UserEntity.java
indexName:索引名称import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; /** * Create by wangxb * 2019-09-08 18:48 */ @Document(indexName = "basic", type = "user") @Data public class UserEntity { @Id private String id; private String name; private Integer age; private String address; }
type: 文档类型名称 - 创建UserDAO.java
import com.basic.entity.UserEntity; import org.springframework.data.repository.CrudRepository; /** * Create by wangxb * 2019-09-08 18:53 */ public interface UserDAO extends CrudRepository<UserEntity, String> { }
- 创建IndexController.java
import com.basic.dao.UserDAO; import com.basic.entity.UserEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Optional; /** * Create by wangxb * 2019-09-08 18:54 */ @RestController public class IndexController { @Autowired private UserDAO userDAO; @RequestMapping("/addUser") public UserEntity addUser(@RequestBody UserEntity user) { return userDAO.save(user); } @RequestMapping("/findUser") public Optional<UserEntity> findUser(String id) { return userDAO.findById(id); } }
- 启动项目
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; /** * Hello world! * */ @SpringBootApplication @EnableElasticsearchRepositories(basePackages = "com.basic.dao") public class AppES { public static void main( String[] args ) { SpringApplication.run(AppES.class, args); } }
- 测试
添加数据: http://localhost:8080/addUser
查询数据: http://localhost:8080/findUser?id=8
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)