第十一章-SpringBoot 与检索
ElasticSearch 分布式搜索服务,底层基于 Lucene
安装 elasticsearch
docker search elasticsearch
docker pull elasticsearch
docker images
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 elasticsearch
http://localhost:9200/
Elasticsearch 快速入门
文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
ES: 集群-索引-类型-文档-属性
MySQL: ?-数据库-表-记录-列
使用 PostMan 发送请求
请求方式
POST /{index}/{type}/{id}
基本操作
# 存入文档
PUT /data/employee/1
{
"name": "Tom",
"age": 23
}
# 获取文档
GET /data/employee/1
# 检查存在
HEAD /data/employee/4
# 返回状态码
# 存在:200
# 不存在:404
# 删除
DELETE http://localhost:9200/data/employee/3
# 更新文档
PUT /data/employee/1
{
"name": "Tom",
"age": 24
}
# 搜索数据
GET /data/employee/_search
# 使用查询字符串
GET /data/employee/_search?q=name:Tom
# 使用查询体
POST /data/employee/_search
{
"query": {
"match": {
"name": "Tom"
}
}
}
# 复杂查询
POST /data/employee/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "Tom"
}
},
"filter": {
"range": {
"age": {
"gt": 20
}
}
}
}
}
}
# 短语搜索(必须完全匹配)
POST /data/employee/_search
{
"query": {
"match_phrase": {
"name": "Tom Steve"
}
}
}
# 高亮结果 会增加em标签
POST /data/employee/_search
{
"query": {
"match_phrase": {
"name": "Tom Steve"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
SpringBoot 整合 Jest 操作 ES
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
SpringBoot 支持两种技术和 ES 交互
- Jest 默认不生效 io.searchbox.client.JestClient
- SpringData ElasticSearch 操作 ES
- Client
- ElasticsearchTemplate
- ElasticSearchRepository
1、使用 Jest
Github: https://github.com/searchbox-io/Jest
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.4</version>
</dependency>
版本适配
Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Boot |
---|---|---|---|
Neumann | 4.0.x | 7.6.2 | 2.3.x |
Moore | 3.2.x | 6.8.6 | 2.2.x |
Lovelace | 3.1.x | 6.2.2 | 2.1.x |
Kay | 3.0.x | 5.5.0 | 2.0.x |
Ingalls | 2.1.x | 2.4.0 | 1.5.x |
来源:
https://docs.spring.io/spring-data/elasticsearch/docs/4.0.2.RELEASE/reference/html/#preface.versions
# 拉取
docker pull elasticsearch:7.6.2
# 单节点启动
docker run -d \
-e ES_JAVA_POTS="-Xms256m -Xmx256m" \
-e "discovery.type=single-node" \
-p 9200:9200 \
-p 9300:9300 \
--name ES1 \
elasticsearch:7.6.2
# 查看所有容器
docker ps -a
# 删除
docker rm <容器ID>
# 查看日志
docker logs -f <容器ID>
查看数据
http://localhost:9200/data/_search
SpringBoot 操作 elasticsearch
文档:
https://github.com/spring-projects/spring-data-elasticsearch
package com.example.demo.pojo;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName="data")
public class Book {
private Integer id;
private String name;
private String author;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
'}';
}
}
package com.example.demo.repository;
import com.example.demo.pojo.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
List<Book> findByNameLike(String name);
}
package com.example.demo;
import com.example.demo.pojo.Book;
import com.example.demo.repository.BookRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import java.util.Optional;
@SpringBootTest
public class ElasticSearchTest {
@Autowired
public BookRepository bookRepository;
@Test
public void testSave(){
Book book = new Book();
book.setId(1);
book.setName("<tom>");
book.setAuthor("Jack");
bookRepository.save(book);
}
@Test
public void testQuery01(){
Optional result= bookRepository.findById(1);
if(result.isPresent()){
System.out.println(result.get());
}
}
@Test
public void testQuery02(){
List<Book> list = bookRepository.findByNameLike("To");
System.out.println(list);
}
}
接口方法命名