1、Elastic Search介绍
Elasticsearch是一个分布式的、基于RESTful API的搜索和分析引擎,广泛用于大规模数据存储和快速检索。它最初由Shay Banon于2010年开发,是开源的,并且是Elastic Stack(通常称为ELK Stack)的核心组成部分,其他组成部分包括Logstash、Beats(用于数据收集和处理)和Kibana(用于数据可视化)
ES 海量数据中快速查找目标数据
EKL ES + Kibana + Logstash
1.1、ES 的数据结构
一个 ES 实例就是一个数据库实例,
索引 index 就是数据表,
字段 Field 就是列信息,
文档 Document 就是行信息。
【对比】
MySQL:select * from test.user where name = “张三”;
ES:GET /test/user/_search?q=name:张三
1、配置 ES,启动 ES 实例
2、新建一个学生索引
3、不需要配置字段,ES 会自动识别
4、一个 JSON 代表一个学生,JSON 字符串中有学生属性字段 Field
MySQL
create table student(
name varchar(20),
sex char(2),
age int
);
ES:
PUT student/_create/1
{
"name":"张三",
"sex":"male",
"age":18
}
1.2、ES 为什么查询快
因为它采用倒排索引。
举例:
0、我在学校学习,学Java
1、我必须学 Java
2、学校教知识
学校 0、2
学习 0
学 Java 0、1
必须 1
教知识 2
我在学校学习,学Java --》我、在、学校、学习、学 Java
(0,3,100%) 0 章节命中了 3 次,100% 命中率
我必须在学校学Java --》我、必须、在、学校、学 Java
(0,2,66%)
(1,1,33%)
1.3、CRUD
1、添加数据
PUT class/_doc/1
{
"name":"张三",
"age":11
}
POST class/_doc
{
"name":"王五",
"age":11
}
2、查询数据
GET class/_doc/1
GET class/_search?q=name:李四
GET class/_search?q=name:(张三 OR 李四)
GET class/_search?q=name:(NOT 张三)
GET class/_search?q=age:<18
GET class/_search?q=age:(>=18 AND <=22)
GET class/_search?q=name:*三
GET class/_search
{
"from":0,
"size":2
}
3、修改数据
POST class/_update/1
{
"doc":{
"age":22
}
}
4、删除数据
DELETE class/_doc/1
2、Spring Boot 整合 ES
引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
索引操作
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
void contextLoads() throws Exception {
CreateIndexRequest request = new CreateIndexRequest("test_index");
CreateIndexResponse response = restHighLevelClient.indices()
.create(request, RequestOptions.DEFAULT);
System.out.println(response.index());
}
@Test
void getIndex() throws Exception {
GetIndexRequest request = new GetIndexRequest("test_index");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
@Test
void deleteIndex() throws Exception {
DeleteIndexRequest request = new DeleteIndexRequest("test_index");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
@Test
void add() throws Exception{
User user = new User(1, "张三");
IndexRequest request = new IndexRequest("mytest");
request.id("2");
request.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
System.out.println(response.status());
}
@Test
void get() throws Exception{
GetRequest request = new GetRequest("mytest","2");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
System.out.println(response.getSource());
}
@Test
void update() throws Exception{
UpdateRequest request = new UpdateRequest("mytest","2");
User user = new User(2, "李四");
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
@Test
void delete() throws Exception{
DeleteRequest request = new DeleteRequest("mytest","2");
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
EsRepository
package com.southwind.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Data
@Document(indexName = "blog")
public class EsBlog {
@Id
private Integer id;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String title;
private String author;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String content;
}
package com.southwind.repository;
import com.southwind.entity.EsBlog;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog,Integer> {
}