简介
Elasticsearch是什么?
Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。
Elasticsearch相关概念说明
概念 | 说明 |
索引库(indices) | indices是index的复数,代表许多的索引 |
类型(type) | 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引(目前6.X以后的版本只能有一个类型),类似数据库中的表概念。数据库表中有表结构,也就是表中每个字段的约束信息;索引库的类型中对应表结构的叫做映射(mapping) ,用来定义每个字段的约束。 |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档 |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
Elasticsearch和mysql的对应关系
Elasticsearch | MySQL |
索引库(indices) | Database 数据库 |
类型(type) | Table 数据表 |
文档(Document) | Row 行 |
域字段(Field) | Columns 列 |
映射配置(mappings) | 每个列的约束(类型、长度) |
安装
1.下载
es官网下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
最新是 7.12.1 版本,这里选择 7.12.0 搭建案例 demo。
下载好了后,上传到 linux,解压压缩包在 /opt 下,
执行命令,启动 es,
sh /opt/elasticsearch-7.12.0/bin/elasticsearch
启动报错:can not run elasticsearch as root
es 不是以 root 用户启动,所以我们需要新建一个 es 用户来操作,
[root@localhost bin]# adduser es #添加es用户
[root@localhost bin]# passwd es #设置密码
[root@localhost bin]# chown -R es /opt/elasticsearch-7.12.0 #将对应的文件夹权限赋给该用户
创建好 es 用户后,切换到该用户重新启动 es,
[root@localhost bin]# su es
[es@localhost bin]$ sh /opt/elasticsearch-7.12.0/bin/elasticsearch
打开浏览器访问 ip:9200,浏览器提示无法连接,这里需要给 es 配置外网访问。编辑 elasticsearch.yml,可以看到配置中全是注释的配置,咱们不动那些注释过的,只添加自己的新配置。添加一行配置:network.host: 0.0.0.0
[es@localhost root]$ vim /opt/elasticsearch-7.12.0/config/elasticsearch.yml
然后再次启动 es,发现这次启动失败了,信息如下
不过不慌,小问题,切换到 root 用户下,编辑 /etc/security/limits.conf 文件,增加配置,用户退出后重新登录生效。
* soft nofile 65536
* hard nofile 65536
再次编辑 /etc/sysctl.conf 文件,增加配置 vm.max_map_count=262144,保存退出后然后执行 sysctl -p 使其生效。
切换到 es 用户,再次启动 es,依旧报错,信息如下:
集群的节点问题,继续去修改 elasticsearch.yml,追加配置
cluster.initial_master_nodes: ["node-1"]
保存退出后。启动 es,不报错并且启动成功。
打开浏览器访问 ip:9200,返回一个 json 字符串,es 启动成功。
2.使用
从这个网址构建一个springboot工程:https://start.spring.io/
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo-es</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.4.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
spring:
# data:
# elasticsearch:
# client:
# reactive:
# endpoints: 192.168.59.128:9200
elasticsearch:
rest:
uris: 192.168.59.128:9200
编写实体类 User,对应与 es 中的索引。
package com.example.demo.controller.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author 相柳
* @date 2021/5/21
*/
@Data
@Document(indexName = "user")
public class User {
@Id
private String username;
private String password;
private String info;
}
新建 EsController 和 EsService,其中 EsService 继承自 ElasticsearchRepository。
package com.example.demo.controller;
import com.example.demo.controller.entity.User;
import com.example.demo.controller.service.EsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
public class EsController {
@Autowired
private EsService esService;
@GetMapping("/getFromEs")
public String getFromEs(@RequestParam String userName) {
Optional<User> byId = esService.findById(userName);
if (byId.isPresent()) {
return byId.get().toString();
}
return "failed";
}
@GetMapping("/insertEs")
public String insertEs() {
User user = new User();
user.setUsername("jack");
user.setPassword("123");
user.setInfo("jack 666");
esService.save(user);
return "success";
}
}
package com.example.demo.controller.service;
import com.example.demo.controller.entity.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* @author 相柳
* @date 2021/5/21
*/
public interface EsService extends ElasticsearchRepository<User, String> {
}
好,接下来启动项目,启动成功依次执行:
http://localhost:8080/insertEs
http://localhost:8080/getFromEs?userName=jack
分别插入 jack,然后查找 jack。结果如下:
至此,整合完成,一个简单的 es demo 已经搭建出来了。
虽然很简单,但是正是有了这个简单开头,对于后续各种复杂的问题,才有解决的希望,才能有迹可循。