环境搭建使用docker-compose部署ES+kibana.
代码如下
1.实体类
/**
* @Author linht
* @Date 2023/3/13 14:28
**/
@Data
@Accessors(chain = true)
@Document(indexName = "book" )
public class Book {
@Id
private Integer id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String author;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String bookDesc;
}
2.mapper
@Mapper
public interface BookMapper {
List<Book> findAll(Book book);
int save(Book book);
int update(Book book);
int deleteById(Integer id);
}
3.service
/**
* ES使用方式2
* @Author linht
* @Date 2023/3/13 14:37
**/
@Service
@Slf4j
public class BookService {
@Autowired
private BookMapper bookMapper;
@Autowired
private ElasticsearchOperations elasticsearchOperations;
/**
* 根据条件查询所有图书
* 先从ES中查询,如果查询不到再从MySQL中查询
* @param book 查询条件
* @return 图书列表
*/
public List<Book> findAll(Book book) {
SearchHits<Book> searchHits = elasticsearchOperations.search(getQuery(book), Book.class);
List<Book> books = searchHits.get().map(SearchHit::getContent).collect(Collectors.toList());
if (CollectionUtils.isEmpty(books)) {
books = bookMapper.findAll(book);
saveAll(books);
log.info("从MySQL中查询");
return books;
}
log.info("从ES中查询");
return books;
}
/**
* 保存一本图书
* 先向MySQL中插入一条数据,再向ES中插入一条数据
* @param book 待保存的图书
*/
public int save(Book book) {
int save = bookMapper.save(book);
saveOne(book);
return save;
}
/**
* 更新一本图书
* 先更新MySQL中的数据,再更新ES中的数据
* @param book 待更新的图书
*/
public int update(Book book) {
int update = bookMapper.update(book);
updateOne(book);
return update;
}
/**
* 根据id删除一本图书
* 先删除MySQL中的数据,再删除ES中的数据
* @param id 待删除的图书id
*/
public int deleteById(Integer id) {
int i = bookMapper.deleteById(id);
deleteOne(id);
return i;
}
/**
* 批量保存图书到ES
* @param books 待保存的图书列表
*/
private void saveAll(List<Book> books) {
elasticsearchOperations.save(books);
}
/**
* 保存一本图书到ES
* @param book 待保存的图书
*/
private void saveOne(Book book) {
elasticsearchOperations.save(book);
log.info("保存一本图书到ES");
}
/**
* 更新一本图书到ES
* @param book 待更新的图书
*/
private void updateOne(Book book) {
elasticsearchOperations.save(book);
log.info("更新一本图书到ES");
}
/**
* 根据id删除一本图书
* @param id 待删除的图书id
*/
private void deleteOne(Integer id) {
elasticsearchOperations.delete(id.toString(), Book.class);
log.info("删除一本图书到ES");
}
/**
* 获取ES查询条件
* @param book 查询条件
* @return ES查询条件
*/
private NativeSearchQuery getQuery(Book book) {
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
if (StringUtils.hasLength(book.getTitle())) {
queryBuilder.must(QueryBuilders.matchQuery("title", book.getTitle()));
}
if (StringUtils.hasLength(book.getAuthor())) {
queryBuilder.must(QueryBuilders.matchQuery("author", book.getAuthor()));
}
if (StringUtils.hasLength(book.getBookDesc())) {
queryBuilder.must(QueryBuilders.matchQuery("desc", book.getBookDesc()));
}
return new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
}
}
4.controller
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@PostMapping("/list")
public List<Book> list(@RequestBody Book book) {
return bookService.findAll(book);
}
@PostMapping("/insert")
public int insert(@RequestBody Book book) {
return bookService.save(book);
}
@PostMapping("/update")
public int update(@RequestBody Book book) {
return bookService.update(book);
}
@PostMapping("/delete")
public int delete(Integer id) {
return bookService.deleteById(id);
}
}
5.测试