Commit d43ecaad by 段启岩

基本搜索完成

parent 153b9d8b
......@@ -2,6 +2,7 @@ package cn.meteor.beyondclouds.common.vo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import org.springframework.data.domain.Page;
import java.util.List;
......@@ -29,4 +30,9 @@ public class PageVO<T> {
setDataList(page.getRecords());
setTotalPage(page.getPages());
}
public PageVO(Page<T> page) {
setDataList(page.getContent());
setTotalPage((long) page.getTotalPages());
}
}
\ No newline at end of file
package cn.meteor.beyondclouds.modules.search.api;
import cn.meteor.beyondclouds.common.form.PageForm;
import cn.meteor.beyondclouds.common.vo.PageVO;
import cn.meteor.beyondclouds.core.annotation.Anonymous;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.modules.search.entity.SearchItem;
import cn.meteor.beyondclouds.modules.search.service.ISearchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* @author meteor
*/
@RestController
@RequestMapping("/api/search")
@Api(tags = "搜索API")
public class SearchApi {
private ISearchService searchService;
@Autowired
public SearchApi(ISearchService searchService) {
this.searchService = searchService;
}
@Anonymous
@GetMapping("")
@ApiOperation("搜索")
public Response<?> search(@Valid PageForm pageForm, String keywords, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError());
}
// spring的分页是从0开始的,对输入的页码减1后可以统一分页规则
pageForm.setPage(pageForm.getPage() - 1);
Page<SearchItem> searchItemPage = searchService.searchPage(pageForm.getPage(), pageForm.getSize(), keywords);
PageVO<SearchItem> searchItemPageVO = new PageVO<>(searchItemPage);
return Response.success(searchItemPageVO);
}
}
......@@ -2,6 +2,8 @@ package cn.meteor.beyondclouds.modules.search.service;
import cn.meteor.beyondclouds.modules.search.entity.SearchItem;
import cn.meteor.beyondclouds.modules.search.enums.SearchItemType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import java.util.Optional;
......@@ -40,4 +42,13 @@ public interface ISearchService {
*/
Optional<SearchItem> getSearchItem(SearchItemType searchItemType, String itemId);
/**
* 根据关键词分页搜索
* @param pageNumber
* @param pageSize
* @param keywords
* @return
*/
Page<SearchItem> searchPage(Integer pageNumber, Integer pageSize, String keywords);
}
......@@ -22,7 +22,12 @@ import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.DisMaxQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.util.Optional;
......@@ -79,6 +84,18 @@ public class SearchServiceImpl implements ISearchService {
return searchRepository.findById(SearchItemId.of(itemType, itemId));
}
@Override
public Page<SearchItem> searchPage(Integer pageNumber, Integer pageSize, String keywords) {
DisMaxQueryBuilder disMaxQueryBuilder = new DisMaxQueryBuilder();
QueryBuilder titleQueryBuilder = QueryBuilders.matchQuery("title", keywords).boost(2f);
QueryBuilder descriptionQueryBuilder = QueryBuilders.matchQuery("description", keywords);
QueryBuilder contentQueryBuilder = QueryBuilders.matchQuery("content", keywords);
disMaxQueryBuilder.add(titleQueryBuilder);
disMaxQueryBuilder.add(descriptionQueryBuilder);
disMaxQueryBuilder.add(contentQueryBuilder);
return searchRepository.search(disMaxQueryBuilder, PageRequest.of(pageNumber, pageSize));
}
private SearchItem getSearchItemInDb(SearchItemType itemType, String itemId) {
SearchItem searchItem = null;
try {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment