导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
实体类注解
@Data
@AllArgsConstructor
@NoArgsConstructor
/**
* indexName = "course",数据库名
* type = "course" 表名
*/
@Component
@Document(indexName = "course",type = "course")
public class CourseDocumentDto {
@Id
private Long id;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String courseName;
@Field(type = FieldType.Keyword)
private String gradeName;
@Field(type = FieldType.Double)
private BigDecimal price;
}
application.yml配置
spring:
application:
name: service-search
#ES
elasticsearch:
rest:
uris: http://localhost:9200
CRUD
创建索引映射
@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Test
public void test() {
elasticsearchRestTemplate.createIndex(CourseDocumentDto.class);
elasticsearchRestTemplate.putMapping(CourseDocumentDto.class);
}
ElasticsearchRestTemplate 注意不要写错了呦,会报错
b. 创建接口
@Repository
public interface ICourseRepository extends ElasticsearchRepository<实体类名,id的类型> {
}
这个时候就可以CRUD了
注入刚才的接口,有很多可调用的方法
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SerachApplication.class)
public class SearchTest {
//注入刚才写的接口,
@Resource
private ICourseRepository2 iCourseRepository;
@Test
public void testAdd() {
for (int i = 0; i < 100; i++) {
CourseDocumentDto courseDocumentDto = new CourseDocumentDto();
courseDocumentDto.setId(Long.valueOf(i));
if (i % 3 == 0) {
courseDocumentDto.setCourseName("菜鸟");
} else if (i % 3 == 1) {
courseDocumentDto.setCourseName("青铜");
} else {
courseDocumentDto.setCourseName("黄金");
}
courseDocumentDto.setPrice(new BigDecimal("2000.00"));
courseDocumentDto.setGradeName("钻石");
CourseDocumentDto save = iCourseRepository.save(courseDocumentDto);
System.out.println(save);
}
}
@Test
public void testfind() {
for (CourseDocumentDto courseDocumentDto : iCourseRepository.findAll()) {
System.out.println(courseDocumentDto);
}
}
@Test
public void testfindId() {
Optional<CourseDocumentDto> byId = iCourseRepository.findById(1L);
System.out.println(byId);
}
@Test
public void testUpdate() {
CourseDocumentDto courseDocumentDto = new CourseDocumentDto();
courseDocumentDto.setId(1L);
courseDocumentDto.setCourseName("菜鸟");
courseDocumentDto.setPrice(new BigDecimal("2000.00"));
courseDocumentDto.setGradeName("大神");
CourseDocumentDto save = iCourseRepository.save(courseDocumentDto);
System.out.println(save);
}
@Test
public void testDel() {
iCourseRepository.deleteAll();
this.testfind();
}
@Test
public void testfindGaoji() {
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
// 名字中包含java
boolQueryBuilder.must(new MatchQueryBuilder("courseName", "java"));
// 价格在1000-3000
boolQueryBuilder.filter(new RangeQueryBuilder("price").gte(1000).lte(3000));
// 按id的倒叙
builder.withSort(new FieldSortBuilder(new FieldSortBuilder("id").order(SortOrder.ASC)));
// 一页10条
builder.withPageable(PageRequest.of(1, 5));
builder.withQuery(boolQueryBuilder);
SearchQuery searchQuery = builder.build();
Page<CourseDocumentDto> search = iCourseRepository.search(searchQuery);
long hit = search.getTotalElements();
System.out.println("命中 :" + hit);
search.get().forEach(e -> {
System.out.println(e);
});
}
}