1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置文件
elasticsearch:
rest:
uris: http://localhost:9200
3.新建es实体类
package com.woniu.es.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Getter
@Setter
@ToString
@Document(indexName = "t_book", shards = 1, replicas = 0)
public class EsBook implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Field(name = "id", type = FieldType.Long)
private Long id;
@Field(name = "name", type = FieldType.Text, analyzer = "ik_max_word")
private String name;
@Field(name = "typeId", type = FieldType.Integer)
private Integer typeId;
@Field(name = "provider", type = FieldType.Text, analyzer = "ik_max_word")
private String provider;
@Field(name = "author", type = FieldType.Keyword)
private String author;
@Field(name = "price", type = FieldType.Double)
private BigDecimal price;
@Field(name = "imgsrc", type = FieldType.Keyword)
private String imgsrc;
@Field(name = "createtime", type = FieldType.Date, format = DateFormat.date_hour_minute_second_millis)
private LocalDateTime createtime;
}
4.新建实体类接口
package com.woniu.es.dao;
import com.woniu.es.entity.EsBook;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EsBookRepository extends ElasticsearchRepository<EsBook, Long> {
}
5.xml文件中编写sql语句
<select id="selectBookForElasticSearch" resultType="com.woniu.es.entity.EsBook">
SELECT * FROM t_book
</select>
6.测试类将数据存入es
@Autowired
private BookMapper bookMapper;
@Autowired
private EsBookRepository esBookRepository;
@Test
public void exportBooKToElasticSearch() {
List<EsBook> esBookList = bookMapper.selectBookForElasticSearch();
esBookRepository.saveAll(esBookList);
}
7.自己编写es分页工具类
package com.woniu.util;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@NoArgsConstructor
public class EsPageInfo<T> {
//当前页码
private Integer pageNum;
//每页显示几条
private Integer pageSize;
//数据表一共有多少行
private Integer totalSize;
//总页数
private Integer totalPage;
private Integer prePage;
private Integer nextPage;
private Boolean hasPreviousPage;
private Boolean hasNextPage;
private List<Integer> navigatepageNums = new ArrayList<>();
//每页显示数据列表
private List<T> list;
public void initData(Integer pageNum, Integer pageSize, Integer totalSize) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.totalSize = totalSize;
this.totalPage = (int)Math.ceil(totalSize*1.0/pageSize) - 1;
if(pageNum > 0) {
this.prePage = pageNum - 1;
this.hasPreviousPage = true;
} else {
this.prePage = 0;
this.hasPreviousPage = false;
}
if(pageNum < this.totalPage) {
this.nextPage = pageNum + 1;
this.hasNextPage = true;
} else {
this.nextPage = this.totalPage;
this.hasNextPage = false;
}
for(int i=-2; i<=2; i++) {
int jsPageNum = this.pageNum + i;
if(jsPageNum >=0 && jsPageNum <= this.totalPage) {
this.navigatepageNums.add(jsPageNum);
}
}
}
}
8. 控制器代码
package com.woniu.controller;
import com.github.pagehelper.PageInfo;
import com.woniu.dto.BookDto;
import com.woniu.entity.Book;
import com.woniu.entity.Booktype;
import com.woniu.es.entity.EsBook;
import com.woniu.service.IBookService;
import com.woniu.service.IBooktypeService;
import com.woniu.util.CookieUtil;
import com.woniu.util.EsPageInfo;
import com.woniu.util.JwtTokenUtil;
import com.woniu.util.ResponseResult;
import lombok.RequiredArgsConstructor;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author wdn
* @since 2022-12-20
*/
@Controller
@RequestMapping("/book")
@RequiredArgsConstructor
public class BookController {
private final IBookService bookService;
private final IBooktypeService booktypeService;
private final RedisTemplate redisTemplate;
private final ElasticsearchOperations elasticsearchOperations;
private final RabbitTemplate rabbitTemplate;
@GetMapping("/searchName")
@ResponseBody
public ResponseResult<EsPageInfo<EsBook>> searchName(@RequestParam(defaultValue = "0", required = false) Integer pageNum,
@RequestParam(defaultValue = "5", required = false) Integer pageSize,
String name) {
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", name); //math 查询
//FieldSortBuilder sortBuilder = SortBuilders.fieldSort("createtime").order(SortOrder.DESC); // createtime 倒序
PageRequest pageRequest = PageRequest.of(pageNum, pageSize); // 分页,注意这里跟 from,size 意义不一样,page是第几页,0表示第一页
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(matchQueryBuilder);
//nativeSearchQueryBuilder.withSort(sortBuilder);
nativeSearchQueryBuilder.withPageable(pageRequest);
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
SearchHits<EsBook> search = elasticsearchOperations.search(nativeSearchQuery, EsBook.class, IndexCoordinates.of("t_book"/*索引名*/));
Iterator<SearchHit<EsBook>> iterator = search.iterator();
List<EsBook> esBookList = new ArrayList<>();
while (iterator.hasNext()) {
SearchHit<EsBook> next = iterator.next();
esBookList.add(next.getContent());
}
EsPageInfo<EsBook> pageInfo = new EsPageInfo<>();
pageInfo.initData(pageNum, pageSize, (int)search.getTotalHits());
pageInfo.setList(esBookList);
return new ResponseResult<>(200, "ok", pageInfo);
}
}