1.怎么学习这门科课程
- 当遇到困难先跳过后面自然会懂
- 必须要动手,写代码
- 学会了基础走出去
2.初识Elasticsearch
2.1ES概念和使用场景
1.分布式---高可用,负载均衡
2.全文检索----对全文内容进行搜索功能
3.实时快速
4.Restful-----非常友好遍历
当年要在大量数据之上进行分析的情况下用es
2.2ES vs MYSQL
2.3ES和kibana安装
1.官网:www.elastic.co
2.找到下载入口
3.在右侧寻找到past releases 下载历史版本
4.同样kibana也是一样
5.进入bin目录运行bat命令开启es判断es安装成功(9200)
6。在kibana的bin中运行判断暗转成功(5601)
7.先启动es再启动kibana,因为是配套的
2.4使用和ES错误
2.4.1使用
其实就是http与json的交互方式,下面就是json
GET localhost:9200/_all 看下面所有的json数据
PUT localhost:9200/test 创建索引(相当于数据库)test
DELETE localhost:9200/test 删除索引test
PUT localhost:9200/
PUT localhost:9200/test/_doc/1 GET /index名/_doc(默认的type(表),6版本以后可省略)/id : 根据id查(数据编号)
GET localhost:9200/test/_doc/1 搜索id==1的数据
GET localhost:9200/test/_doc/_search/q=age:25 在命中找到数据
kibana使用
GET _all
GET /person/_doc/1
下面为全文检索:
should must match 相当于or and =
2.4.2错误
404错误:不允许自动创建(put)索引,在配置文件中去允许那么配置文件:D:\software\elasticsearch-7.14.0-windows-x86_64\elasticsearch-7.14.0\config\elasticsearch.yml中添加配置如:action.auto_create_index: +acc*,-bank*这里限制了acc开头的索引允许自动创建,用”+”表示允许这里限制了bank开头的索引禁止自动创建,用”-”表示禁用。那么重启elasticSearch服务后acc的可以正常创建了。
406错误:请求换文档json
3.ES和MYSQL的全文检索
3.1MYSQL
select * from 表 where a like "%spring%" or b like "%spring%";
3.2ES
水平扩展,全文检索的能力更强
4.MYSQL和ES的数同步
一般想法都是要有一个定期任务,查询mysql的数据条数如果比es的多,删除再重写 这里一般用中间件logstash来完成,和之前下载方式一样,用来换装数据。
网站:Download Logstash Free | Get Started Now | Elastic
4.1config.yml的配置文件
mysql.yml 是我用现成的yml文件重命名而来
input {
jdbc {
jdbc_driver_library => "F:\MavenJarPackage\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
# 8.0以上版本:一定要把serverTimezone=UTC天加上
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_user => "root"
jdbc_password => "123"
schedule => "* * * * *"
statement => "SELECT * FROM t_blog WHERE update_time > :sql_last_value and update_time < NOW()"
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "update_time"
last_run_metadata_path => "syncpoint_table"
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["127.0.0.1:9200"]
# 索引名称 可自定义
index => "blog"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{id}"
document_type => "blog"
}
stdout {
# JSON格式输出
codec => json_lines
}
}
4.2logstash的运行和结果
- logstash的下载
(1). 至官网下载,下载版本与ES版本相匹配同为6.3.2版本 - 运行logstash
(1). 打开cmd输入logstash -f ../config/mysql.yml
查看相关结果
(1). 打开kibana,输入GET /blog/_stats,查看blog是否同步成功,index_total就是影响条数
(2). 输入POST /blog/_search{},查看blog详情信息
4.3可能出现的错误
1.运行logstash -f 出现无法找到主类:logstash 启动报找不主类或无法加载 java - 晨曦曙光 - 博客园
2.运行logstash -f不动,出现两行短的话
原因:路径上可能有中文
3.其他原因
看日志,查百度,mysql.yml中的错误,检查挺好解决,驱动,数据库,表名要对上,配置文件出错
实在没办法重新装一遍。
5集成ES
5.1ES的自带分词器与其特点
1.standard : ES默认分词器,将单词转换为小写,去除停用词与符号,支持中文——单字切分
2.simple :通过非字母字符进行切分,统一化为小写,去除数字类型字符
3.whitespace :不支持中文,不转换为小写,只去除空格,
4.language :特定语言的分词器,不支持中文
5.ES默认分词器效果
5.2IK分词器
1.由于ES默认分词器对于中文分词效果不理想,改用IK分词器(对中文分词效果优于默认分词器)
2.IK分词器的下载——至github搜索IK分词器进行下载,下载版本与ES版本相匹配同为6.3.2版本
ES配置IK分词器
Release v6.3.2 · medcl/elasticsearch-analysis-ik · GitHub
(1) 至ES的安装目录,打开plugins创建IK文件夹。将IK分词器压缩包解压内容复制至此。
(2) 重新打开ES
3.内置两个分词器:ik_smart和ik_max_word(前面有什么词就分什么词,后面各个拆分)
ik_smart分词效果:
ik_max_word分词效果:
5.3IK分词原理
在ik压缩包中的config目录下有多个字典,主要字典为main.dic,我们也可以添加词语在分词器中来增加分词
6.springboot项目
6.1创建项目和相关问题
6.1.1创建项目
1.新建项目选择spring初始化化,定义包名称,再定义组件名称(所在目录)
2.挑选依赖
6.1.2相关问题
1.出现java不匹配,可以通过设置中的项目模块改,还可以改pom.xml中的java版本号
2.springboot版本不搭配,在创建的时候选择版本错了,选择2.7.8版本
3.运行main方法难以发现数据源:在resources中的配置文件中没有配置东西
6.2环境配置以及项目结构
6.2.1步骤
1.pom文件
<?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.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.imooc.demo</groupId>
<artifactId>springboot_es</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_es</name>
<description>springboot_es</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</project>
2.es配置文件
(1). 注意事项:
spring.data.elasticsearch.cluster-name需得与本地es配置想匹配;可在浏览器输入localhost:9200进行查看。
#通用数据源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123
#Hikari数据源专用配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
#JPA相关配置
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
#es
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.cluster-name=elasticsearch
#mVc
spring.mvc.static-path-pattern=/**
spring.devtools.livereload.enabled=true
spring.devtools.restart.additional-paths=static/**
#日期格式化4
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
3.启动成功,连接成功
6.2.2问题
问题一:
解决方案:
6.3项目结构和JPA演示
jpa就像mybatis
6.3.1项目结构
6.3.2 jpa步骤
1.先建立es和mysql在entity和repository中,再创建软件包MysqlBlog和MysqlBlogRepository中
实体类,MysqlBlog内容:
package cn.imooc.demo.springboot_es.entity.mysql;
import lombok.Data;
import javax.persistence.*;
/*
DROP TABLE IF EXISTS `t_blog`;
CREATE TABLE `t_blog` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`title` varchar(60) DEFAULT NULL COMMENT '博客标题',
`author` varchar(60) DEFAULT NULL COMMENT '博客作者',
`content` mediumtext COMMENT '博客内容',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
*/
//@data注解的作用:代替setter、getter方法,配置好以后就可反复使用
@Data
@Table(name = "t_blog")//需要与mysql中的表一一对应起来
//作用:代表是该类是实体类。
@Entity
public class MysqlBlog {
//设置主键和主键自增长
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
//创建java实体
private String id;
private String title;
private String author;
//虽然content是string类型,但是太大了(不是varchar),所以要指定列的类型
@Column(columnDefinition = "mediumtext")
private String content;
//下面两个不需要变化,springData会进行自动转化为表中对应的字段
private String createTime;
private String update_time;
}
MysqlBlogRepository内容:继承jpa接口
package cn.imooc.demo.springboot_es.repository.mysql;
import cn.imooc.demo.springboot_es.entity.mysql.MysqlBlog;
import org.springframework.data.jpa.repository.JpaRepository;
//两个参数:第一个为你要操纵的哪一个实体(表),第二个实体中主键的数据类型
//继承了jpa,增删查改都能够正常使用了
public interface MysqlBlogRepository extends JpaRepository<MysqlBlog, Integer> {
}
2.再controller中增加请求路径和自动装配数据
package cn.imooc.demo.springboot_es.controller;
import cn.imooc.demo.springboot_es.entity.mysql.MysqlBlog;
import cn.imooc.demo.springboot_es.repository.mysql.MysqlBlogRepository;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class IndexController {
//自动装配
@Autowired
MysqlBlogRepository mysqlBlogRepository;
//就是你访问默认路径的时候就会直接走到这个端口访问index.html
@RequestMapping("/")
private String index() {
List<MysqlBlog> all = mysqlBlogRepository.findAll();
System.out.println(all.size());
return "index.html";
}
}
6.4集成ES
6.4.1流程
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.创建实体类esblog
package cn.imooc.demo.springboot_es.entity.es;
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Data
//前面两个代表document数据同步到springboot当中去,createindex是删除原来的blog再重新创建一个,但一般我们都是先创建的,所以设置为false
@Document(indexName = "blog", type = "blog", useServerConfiguration = true, createIndex = false)
public class EsBlog {
//对应mysqlblog里的数据
//设置主键
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String author;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String content;
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss||yyyy-mm-dd||epoch_millis")
private String createTime;
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss||yyyy-mm-dd||epoch_millis")
private String update_time;
}
3.创建接口MysqlBlogRepository便于增删查改
package cn.imooc.demo.springboot_es.repository.mysql;
import cn.imooc.demo.springboot_es.entity.mysql.MysqlBlog;
import org.springframework.data.jpa.repository.JpaRepository;
//两个参数:第一个为你要操纵的哪一个实体(表),第二个实体中主键的数据类型
//继承了jpa,增删查改都能够正常使用了
public interface MysqlBlogRepository extends JpaRepository<MysqlBlog, Integer> {
}
4.测试
package cn.imooc.demo.springboot_es;
import cn.imooc.demo.springboot_es.entity.es.EsBlog;
import cn.imooc.demo.springboot_es.repository.es.EsBlogRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Iterator;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootEsApplicationTests {
//自动装配抽象类,因为已经加载了实体类在其中
@Autowired
EsBlogRepository esBlogRepository;
@Test
public void testEs() {
//查看所有数据放进迭代器中
Iterable<EsBlog> all = esBlogRepository.findAll();
Iterator<EsBlog> iterator = all.iterator();
//选出第一组数据
EsBlog next = iterator.next();
//查看第一组数据的名字
System.out.println("----------" + next.getTitle());
}
}
6.4.2问题
1.启动时失败了,可能是es和kibana没有开启,因为pom只是连接的依赖,就像mysql一样需要到本机中拿数据。
2.没有启动类:启动类中因为设为public
3.空错误,可能是你的实体类中的表没数据,建议先kibana查看一下正确的索引和表名再填写