1. 步骤分析
- 创建maven项目
- 导包
- 配置yml
- 入口类
- 测试
- 创建索引+做类型映射
- crud
- 高级查询+分页+排序(DSL)
2. 步骤实现
2.1 创建maven项目
略过
2.2 导包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--springboot 对spring data es支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.3 配置yml
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端
2.4 入口类
package cn.wangningbo.es;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ESApplication {
public static void main(String[] args) {
SpringApplication.run(ESApplication.class, args);
}
}
2.5 测试
package cn.wangningbo.es;
import cn.wangningbo.es.doc.Employee;
import cn.wangningbo.es.repository.EmployeeDocRepository;
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.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ESApplication.class)
public class ESTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
/**
* 先测试ElasticsearchTemplate是否可以注入进来
*
* @throws Exception
*/
@Test
public void test() throws Exception {
System.out.println(elasticsearchTemplate);
}
}
2.6 创建索引+做类型映射
- 运行ElasticSearch服务
- 准备映射
package cn.wangningbo.es.doc;
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;
@Document(indexName = "hrm_test", type = "employee")
public class Employee {
@Id
private Long id;
@Field(type = FieldType.Keyword)//不会分词建立索引
private String name;
private Integer age;
@Field(type = FieldType.Text)//分词建立索引
private String intro;
//模糊查询所有字段 //投机-有空格就会分词
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String all; //把keyword要作用的字段,通过空格来拼接
//提供get、set、构造、toString方法
}
- 执行下面这个测试方法(创建索引+做类型映射)
/**
* 创建索引并做类型映射
* @throws Exception
*/
@Test
public void testPre() throws Exception {
elasticsearchTemplate.createIndex(Employee.class);
elasticsearchTemplate.putMapping(Employee.class);
}
2.7 crud
准备
package cn.wangningbo.es.repository;
import cn.wangningbo.es.doc.Employee;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface EmployeeDocRepository extends ElasticsearchRepository<Employee, Long> {
}
crud操作
@Autowired
private EmployeeDocRepository employeeDocRepository;
/**
* 添加一个
*
* @throws Exception
*/
@Test
public void testAdd() throws Exception {
Employee employee = new Employee(1L, "tom", 18, "温顺的猫咪!");
employee.setAll(employee.getName() + " " + employee.getIntro());
employeeDocRepository.save(employee);
}
/**
* 添加多个
*
* @throws Exception
*/
@Test
public void testAddAll() throws Exception {
List<Employee> employees = new ArrayList<>();
for (int i = 0; i < 50; i++) {
Employee employee = new Employee(2L + i, "tom" + i, 19 + i, "温顺的猫咪!" + i);
employees.add(employee);
}
employeeDocRepository.saveAll(employees);
}
/**
* 查询一个(根据id)
*
* @throws Exception
*/
@Test
public void testFindOne() throws Exception {
System.out.println(employeeDocRepository.findById(2l).get());
}
/**
* 查询所有
*
* @throws Exception
*/
@Test
public void testFindAll() throws Exception {
Iterable<Employee> employees = employeeDocRepository.findAll();
employees.forEach(employee -> System.out.println(employee));
}
/**
* 删除一个(根据id)
*
* @throws Exception
*/
@Test
public void testDelete() throws Exception {
employeeDocRepository.deleteById(1l);
}
/**
* 修改一个(修改同添加!id存在就是修改,不存在就是添加)
*
* @throws Exception
*/
@Test
public void testUpdate() throws Exception {
Employee employee = employeeDocRepository.findById(2l).get();
employee.setName("杰瑞");
employeeDocRepository.save(employee);
}
2.8 高级查询+分页+排序(DSL)
@Autowired
private EmployeeDocRepository employeeDocRepository;
/**
* dsl(高级查询+分页+排序)
*
* @throws Exception
*/
@Test
public void testDSL() throws Exception {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//封装查询对象
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.matchAllQuery());
List<QueryBuilder> filter = boolQueryBuilder.filter();
filter.add(QueryBuilders.rangeQuery("age").gte(20).lte(40));
//查询
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
//排序 //根据age字段进行升序排序
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.ASC));
//分页 //page:0就是第1页,size:10就是每页显示10条
nativeSearchQueryBuilder.withPageable(PageRequest.of(0, 10));
//截取字段 //前面是需要显示的字段,后面是排除的字段
nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id", "name", "age"}, null));
//封装结果
Page<Employee> search = employeeDocRepository.search(nativeSearchQueryBuilder.build());
//获取所有元素个数
long totalElements = search.getTotalElements();
//遍历查看所有元素
search.forEach(employee -> System.out.println(employee));
}
网友评论