添加依赖
org.springframework.boot
spring-boot-starter-data-solr
1、controller
@PostMapping("/solrSearchDemand")
@ResponseBody
public JsonResponse solrSearchDemand(@RequestBody SolrDemandSerachPageListRequest request) {
PageListResponse responseBody = new PageListResponse<>();
Pageable pageable = null;
if (StringUtils.isNotBlank(request.getSort()) && StringUtils.isNotBlank(request.getDirection())) {
Sort.Order demandSort = new Order(Sort.Direction.valueOf(request.getDirection()), request.getSort());
Sort sort = new Sort(demandSort);
pageable = request.getPageable(sort);
} else {
pageable = request.getPageable("createTime", Sort.Direction.DESC);
}
final Page page = demandSolrService.filterTitleUsernameContent(request.getTerm(), request.getTagId(), request.getAppId(),request.getHasHot(), pageable);
if (!page.hasContent()) {
responseBody.setRecords(Collections.emptyList());
}
responseBody.setRecords(page.getContent());
responseBody.setPage(request.getPage());
responseBody.setPageSize(request.getPageSize());
responseBody.setTotalRecords(page.getTotalElements());
return JsonResponse.success(responseBody);
}
2、SolrDemandSerachPageListRequest 类如下
public class SolrDemandSerachPageListRequest extends PageListRequest {
/**
* 标签名查找
*/
private Integer tagId;
private Integer appId;
private Boolean hasHot;
public Boolean getHasHot() {
return hasHot;
}
public void setHasHot(Boolean hasHot) {
this.hasHot = hasHot;
}
public Integer getTagId() {
return tagId;
}
public void setTagId(Integer tagId) {
this.tagId = tagId;
}
public Integer getAppId() {
return appId;
}
public void setAppId(Integer appId) {
this.appId = appId;
}
}
PageListRequest类如下:
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
public class PageListRequest {
/**
* 搜索的关键字
*/
private String term;
/**
* 排序的字段
*/
private String sort;
/**
* 排序的方向
*/
private String direction;
/**
* 页码从1开始
*/
private int page;
/**
* 条数
*/
private int pageSize;
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getDirection() {
return direction;
}
public void setDirection(String direction) {
this.direction = direction;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public String getTerm() {
return term;
}
public void setTerm(String term) {
this.term = term;
}
public Sort.Direction getDirection(Sort.Direction defaultDirection) {
if (StringUtils.isBlank(direction)) {
return defaultDirection;
}
return Sort.Direction.valueOf(direction);
}
public Sort getSort(String defaultSortField, Sort.Direction defaultDirection) {
if (StringUtils.isNotBlank(sort)) {
Sort sort = new Sort(getDirection(defaultDirection), this.sort);
return sort;
} else {
Sort sort = new Sort(getDirection(defaultDirection), defaultSortField);
return sort;
}
}
public Pageable getPageable(String defaultSortField, Sort.Direction defaultDirection) {
// Pageable 页码是从0开始的,所以要减1操作
PageRequest pageRequest = new PageRequest(this.page - 1, this.pageSize, getSort(defaultSortField, defaultDirection));
return pageRequest;
}
public Pageable getPageable(Sort defaultSort) {
// Pageable 页码是从0开始的,所以要减1操作
PageRequest pageRequest = new PageRequest(this.page - 1, this.pageSize, defaultSort);
return pageRequest;
}
}
3、DemandSolrModel如下:
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.SolrDocument;
/*
solrCoreName = "demand"
对应服务器的名字,这里的一定要看我上一篇文章的solr文章里面的managed-schema配置文件里的第(1)点*/
@SolrDocument(solrCoreName = "demand")
public class DemandSolrModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Field
private int id;
@Field
private int userId;
@Field
private int appId;
@Field
private String content;
@Field
private Boolean hasHot;
@Field
private Date createTime;
@Field
private String title;
@Field
private String hyperlink;
@Field
private String fileUrl;
@Field
private String avatarImg;
@Field
private String username;
@Field
private List tagName;
@Field
private List tagId;
get set 省
3、PageListResponse如下
import java.util.List;
public class PageListResponse {
/**
* 列表数据
*/
private List records;
/**
* 总的数量
*/
private long totalRecords;
private int page;
private int pageSize;
public List getRecords() {
return records;
}
public void setRecords(List records) {
this.records = records;
}
public long getTotalRecords() {
return totalRecords;
}
public void setTotalRecords(long totalRecords) {
this.totalRecords = totalRecords;
}
/*
* (non-Javadoc)
* @see org.springframework.data.domain.Page#getTotalPages()
*/
public int getTotalPages() {
return pageSize == 0 ? 1 : (int) Math.ceil((double) totalRecords / (double) pageSize);
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
4、service如下:
import com.messcat.imgrnt.solr.model.DemandSolrModel;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
public interface DemandSolrService {
Page filterTitleUsernameContent(String term, Integer tagId, Integer appId,Boolean hasHot, Pageable pageable);
void indexDemand(int id);
}
5、service实现类如下:
import com.messcat.common.Constants;
import com.messcat.framework.common.util.CommonsUtils;
import com.messcat.imgrnt.custom.dao.DemandSolrCustomDao;
import com.messcat.imgrnt.service.DemandSolrService;
import com.messcat.imgrnt.solr.model.DemandSolrModel;
import com.messcat.imgrnt.solr.repo.DemandSolrRepository;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.AnyCriteria;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.stereotype.Component;
@Component
public class DemandSolrServiceImpl implements DemandSolrService {
@Resource
private SolrTemplate solrTemplate;
@Autowired
private DemandSolrCustomDao demandSolrCustomDao;
@Autowired
private DemandSolrRepository demandSolrRepository;
@Override
public Page filterTitleUsernameContent(String term, Integer tagId, Integer appId,Boolean hasHot, Pageable pageable) {
SimpleQuery simpleQuery = new SimpleQuery();
/**
* 如果输入框的搜索条件不为空,则把条件加进去
*/
if (StringUtils.isNotBlank(term)) {
/*复制域*/
Criteria termCriteria = new Criteria(Constants.FIELD_TEXT).expression(CommonsUtils.quote(term));
simpleQuery.addCriteria(termCriteria);
}
if (tagId != null) {
Criteria contentCriteria = new Criteria("tagId").in(tagId);
simpleQuery.addCriteria(contentCriteria);
}
if (appId != null) {
Criteria contentCriteria = new Criteria("appId").is(appId);
simpleQuery.addCriteria(contentCriteria);
}
if (hasHot != null) {
Criteria contentCriteria = new Criteria("hasHot").is(hasHot);
simpleQuery.addCriteria(contentCriteria);
}
if (simpleQuery.getCriteria() == null) {
simpleQuery.addCriteria(AnyCriteria.any());
}
return solrTemplate.queryForPage(simpleQuery.setPageRequest(pageable), DemandSolrModel.class);
}
@Override
public void indexDemand(int id) {
/*1:根据新增的demand 的id ,从demang,demand_rel,demand_tag_rel,demand_tag,user表获取数据*/
DemandSolrModel demandSolrModel = demandSolrCustomDao.selectDemandSolrByDemandId(id);
/*2:创建索引*/
if (demandSolrModel == null) {
return;
}
demandSolrRepository.save(demandSolrModel);
}
}
6、SolrTemplate 配置文件如下:
import com.messcat.common.solr.MyHttpSolrClient;
import org.apache.http.client.HttpClient;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.BinaryResponseParser;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.springframework.boot.autoconfigure.solr.SolrProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.repository.config.EnableSolrRepositories;
import org.springframework.util.StringUtils;
@SolrDocument(solrCoreName = "demand")
/*basePackages是指solr的实体类model所在的文件夹,因为要映射服务器 @SolrDocument=(solrCoreName="demand")*/
@Configuration
@EnableSolrRepositories(basePackages = {"com.messcat.imgrnt.solr"})
@EnableConfigurationProperties(SolrProperties.class)
public class SolrConfiguration {
private final SolrProperties properties;
public SolrConfiguration(SolrProperties properties) {
this.properties = properties;
}
@Bean
public SolrClient solrClient(HttpClient httpClient) {
return createSolrClient(httpClient);
}
private SolrClient createSolrClient(HttpClient httpClient) {
if (StringUtils.hasText(this.properties.getZkHost())) {
return new CloudSolrClient(this.properties.getZkHost());
}
return new MyHttpSolrClient(properties.getHost(), httpClient, new BinaryResponseParser());
}
@Bean
public SolrTemplate solrTemplate(SolrClient server) throws Exception {
return new SolrTemplate(server);
}
}
注:有些包我没弄出来,所以有些代码是导包道不了,是可以用其它替代的,自己自行替换,要看自己的学习能力了