什么是ElasticSearch?
ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。
作用于全文搜索,结构化搜索,分析。
ES的主要概念与Mysql相比
- Index表示一个数据库
- Type表示一张表
- Doucument表示一行数据
- Field表示字段
安装ES
下面演示的是用windows系统安装ES
- 访问 Elasticsearch 官网
https://www.elastic.co/cn/downloads/elasticsearch 下载安装包: - 将zip文件解压到C盘,进入 C:\elasticsearch-2.4.4\bin 目录,双击执行
elasticsearch.bat,该脚本文件执行 ElasticSearch 安装程序,稍等片刻,打开浏览器,输入
http://localhost:9200 ,显式以下画面,说明ES安装成功。
安装head插件
作用:
为了便于管理ES,本文使用head插件,这是最初级的管理工具,在浏览器中显示ES集群,索引等信息,十分好用。
1.因为运行head需要借助grunt命令,所以需要grunt命令,进入nodejs目录下,执行命令:npm install -g grunt-cli,将grunt安装为全局命令。
2.到head目录下下载包,执行命令:npm install,若出现error错误,可尝试以管理员身份运行cmd,重新执行此命令,期间下载pathomjs可能时间比较长,需要耐心等待。
3.到head插件目录,运行grunt server,启动head。(可以进入elasticsearch-head下Gruntfile.js文件,修改启动端口,默认是9100)如下图,成功连接9100端口
4.重新启动elasticsearch.bat,访问http://localhost:9100/,即可看到head效果
如果不能打开网站:
打开路径 "…\elasticsearch\config\ " 下的 elasticsearch.yml 文件,在文件末尾添加如下代码:
http.cors.enabled: true
http.cors.allow-origin: “*”
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: “X-Requested-With, Content-Type, Content-Length, X-User”
安装logstash 插件
作用:
用来同步mysql的数据到ES中
Windows环境:
1、下载logstash
地址: https://www.elastic.co/cn/downloads/logstash
2、下载: mysql-connector-java.jar
在logstash目录下创建一个mysql目录,把驱动文件放进去。
2、修改配置文件
在安装目录下,创建新的配置文件,命名为:mysqltoes.conf
这个文件名可以换成其他的,启动时脚本命令改成对应的就可以了。
在conf文件中加入以下内容:
input {
//多张表的同步只需要设置多个jdbc的模块就行了
jdbc {
# mysql 数据库链接,shop为数据库名
jdbc_connection_string => "jdbc:mysql://数据库IP地址:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
# 用户名和密码
jdbc_user => "root"
jdbc_password => ""
# 驱动
jdbc_driver_library => "E:/DevelopEnvironment/Logstash/logstash-7.2.0/mysql/mysql-connector-java-8.0.16.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
#是否分页
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#直接执行sql语句
statement =>"select * from employee"
# 执行的sql 文件路径+名称
# statement_filepath => "/hw/elasticsearch/logstash-6.2.4/bin/test.sql"
#设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 索引类型
#type => "jdbc"
}
}
output {
elasticsearch {
#es的ip和端口
hosts => ["http://ip:9200"]
#ES索引名称(自己定义的)
index => "blog"
#文档类型
document_type => "log"
#设置数据的id为数据库中的字段
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
坑一:
conf用UTF-8编码
坑二:
#自增ID
document_id => “%{数据库中的id}”
坑三:
statement_filepath => “D:/logstash-7.6.1/sql/test.sql” 的意思是 执行指定的sql文件
sql语句是查询具体你要的哪一个表的语言 比如 selectfrom student
而不是selectfrom 数据库名字 .
或者是 直接执行sql语句 例如 statement =>"select * from student "
Springboot如何整合ES
- 方法一
- 用JPA直接操作ES
application.properties中配置
## 开启repositories
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.client.cluster-nodes =127.0.0.1\:9300
spring.data.elasticsearch.client.reactive.username=elasticsearch
先创建实体类
**
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@Document(indexName = "sl_test", type = "_doc")
public class Student implements Serializable {
private static final long serialVersionUID=1L;
@Id
private String sno;
@Field
private String sname;
@Field
private String ssex;
@Field
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime sbirthday;
@Field
private String sclass;
}
创建类集成ElasticsearchRepository<Student,String> 前面一个参数填实体类 后面一个参数填写 ID字段属性
public interface StudentRepostitory extends ElasticsearchRepository<Student,String> {
}
Controler层
@RestController
@RequestMapping("/es")
public class StudentController {
@Autowired
private StudentRepostitory studentRepostitory;
@RequestMapping("/id")
public Student findStudentById(String id){
Optional<Student> optional = studentRepostitory.findById(id);
return optional.get();
}
}
坑一:
时间坑-LocalDateTime反序列化的问题
- 方法二ElasticsearchTemplate 操作ES
操作查询
@RestController
@RequestMapping("/es2")
public class StudentHandler {
@Autowired
private ElasticsearchTemplate template;
//测试查询
@RequestMapping("/test")
public List<Student> test() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery()).build();
return template.queryForList(searchQuery,Student.class);
}
}
更多方法麻烦大家自己搜索一下。本文演示的是最基本的功能。