-
导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
-
配置ES
... spring: application: name: hrm-es-service data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端 ...
2.创建EmployeeDoc
/** * 针对于 Employee 表的文档映射 * indexName:索引库 * type:类型(表类型) */ @Document(indexName = "hrm" , type = "employee") public class EmployeeDoc { //对应文档的id @Id private Long id; @Field(type = FieldType.Keyword) //指定为 不分词 private String userName; private int age; @Field(type =FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word") private String intr; ...
3.创建索引库
@RunWith(SpringRunner.class) @SpringBootTest(classes = EsServiceApplication2050.class) public class ESTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; @Test public void testCreateIndex() { //创建索引 elasticsearchTemplate.createIndex(EmployeeDoc.class); //做文档映射 elasticsearchTemplate.putMapping(EmployeeDoc.class); } }
4.定义ElasticsearchRepository
@Repository public interface EmployeeElasticsearchRepository extends ElasticsearchRepository<EmployeeDoc,Long> {}
5.基本CRUD
@Autowired private EmployeeElasticsearchRepository employeeElasticsearchRepository; //初始化 @Test public void testCreateIndex() { //创建索引 elasticsearchTemplate.createIndex(EmployeeDoc.class); //做文档映射 elasticsearchTemplate.putMapping(EmployeeDoc.class); } //添加数据 @Test public void testAdd(){ //准备数据 EmployeeDoc employeeDoc = new EmployeeDoc(); employeeDoc.setAge(18); employeeDoc.setUserName("王大锤"); employeeDoc.setIntr("我爱中国"); //添加数据到es employeeElasticsearchRepository.save(employeeDoc); } //添加数据 @Test public void testUpdate(){ //准备数据 EmployeeDoc employeeDoc = new EmployeeDoc(); employeeDoc.setId(5L); //有id就是修改 employeeDoc.setAge(18); employeeDoc.setUserName("周伯通"); employeeDoc.setIntr("深得童子通真传"); //添加数据到es employeeElasticsearchRepository.save(employeeDoc); } //删除数据 @Test public void testDelete(){ employeeElasticsearchRepository.deleteById(5L); } //获取数据 @Test public void testGet(){ Optional<EmployeeDoc> optional = employeeElasticsearchRepository.findById(5L); System.out.println(optional.get()); }
6.高级查询分页
//通过索引库,高级查询和分页 /** * 用户名为 隔壁老王 * age在 10 - 20 * 按照 id排序降序 * 分页 每页 2条 取第一页 */ @Test public void testSearchAndPage() throws Exception{ //1.创建查询建造器对象 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); //2.给查询建造器添加查询条件对象 //1.创建组合查询条件对象 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //2.添加查询条件:分词查询:username List<QueryBuilder> must= boolQuery.must(); must.add(QueryBuilders.matchQuery("username","周伯通" )); //2.添加查询条件:范围查询:age:10到30 List<QueryBuilder> filter = boolQuery.filter(); filter.add(QueryBuilders.rangeQuery("age").lte(30).gte(10)); //3.给查询建造器添加查询条件对象 queryBuilder.withQuery(boolQuery); //3.给查询建造器添加分页对象:从第0页开始,每页2条 queryBuilder.withPageable(PageRequest.of(0,2 )); //4.给查询建造器添加排序 //1.创建排序对象:id,降序 FieldSortBuilder sortBuilder = new FieldSortBuilder("id").order(SortOrder.DESC); //2.给查询建造器添加排序 queryBuilder.withSort(sortBuilder); //5.创建查询对象 NativeSearchQuery searchQuery = queryBuilder.build(); //6.传给search方法,执行高级查询分页排序功能,得到分页对象 Page<EmployeeDoc> page = employeeElasticsearchRepository.search(searchQuery); //7.获取结果 //获得总条数 int totalPages = page.getTotalPages(); System.out.println(totalPages); //获得当前页数据 Iterator<EmployeeDoc> iterator = page.getContent().iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } }