根据关键词查询索引库。
业务流程
(1)在ego-search工程中发布搜索接口。
(2)在ego-portal中远程调用接口。
第一部分:在ego-search中发布搜索接口
思路:(1)定义接口规则
(2)业务代码实现
(3)对外发布搜索接口
第一步:定义接口规则
说明:接口规则通常由接口开发者根据需求制定,并提供接口文档。
请求方法GET
URLhttp://search.ego.com/search/doSearch
参数说明keyword:关键词
price:价格区间,格式"20-50"
page:请求的页码
sort:价格排序,0升序,1降序,null不排序
categoryName:商品类别过滤
示例http://search.ego.com/search/doSearch?keyword=手机
&price=1000-1999&page=2&sort=1&categoryName=智能手机
返回值{
"curPage": 2,
"totalPages": 20,
"recordCount": 600,
"itemList": [{
"id":100544,
"price": 5288,
"image":"http://image.ego.com/images/1.jgp",
"cateGoryName":"智能手机",
"sell_point":"功能强大,经济适用",
"title":"华为k20"
},{
"id":1005455,
"price": 3999,
"image":"http://image.ego.com/images/3.jgp",
"cateGoryName":"智能手机",
"sell_point":"功能强大,经济适用",
"title":"华为k18",
}]
}
根据接口规则,创建SearchResult返回值类型,在ego-base工程中创建。
public class SearchResult {
private Long recordCount;
private List
private Integer totalPages;
private Integer curPage;
//补充get、set方法
}
第二步:业务代码实现
(1)修改resource.properties配置文件
#配置solr服务器地址
solr.address=http://192.168.4.253:8888/solr/ego
solr.pageSize=60
(2)修改SearchService接口及其实现类,定义搜索方法
@Value("${solr.pageSize}")
private Integer pageSize;
@Override
public SearchResult doSearch(String keyword, String categoryName, String price, int page, Integer sort) {
SearchResult result = new SearchResult();
//1、创建查询对象
SolrQuery query = getSolrQuery(keyword,categoryName,price,page,sort);
try {
//2、执行搜索
QueryResponse response = solrServer.query(query);
//3、解析查询结果
if(0==response.getStatus()){
SolrDocumentList documentList = response.getResults();
//获取商品总数量
long numFound = documentList.getNumFound();
result.setRecordCount(numFound);
//获取高亮设置之后的的高亮域的值
Map
//获取商品列表
List
SearchItem item = null;
for (SolrDocument doc : documentList) {
item = new SearchItem();
item.setId(Long.valueOf((String) doc.get("id")));
boolean flag = true;
if(null!=highlighting && highlighting.size()>0){
Map
if(null!=map && map.size()>0){
List
if(null!=list && list.size()>0){
item.setTitle(list.get(0));
flag = false;
}
}
}
if(flag){
item.setTitle((String) doc.get("item_title"));
}
item.setImage((String) doc.get("item_image"));
item.setSellPoint((String) doc.get("item_sell_point"));
item.setCategoryName((String) doc.get("item_category_name"));
item.setPrice((long) doc.get("item_price"));
items.add(item);
}
result.setItemList(items);
result.setCurPage(page);
//获取总页数
int pageCount = (int) Math.ceil(result.getRecordCount()*1.0/pageSize);
result.setTotalPages(pageCount);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private SolrQuery getSolrQuery(String keyword, String categoryName, String price, int page, Integer sort) {
SolrQuery query = new SolrQuery();
//设置查询的关键词
if(null!=keyword && !"".equals(keyword)){
query.set("q", "item_title:"+keyword);
//有关键词时,才需要做高亮设置
query.setHighlight(true);
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
query.addHighlightField("item_title");
}else{
query.set("q", "item_title:*");
}
//判断是否有商品类别过滤
if(null!=categoryName && !"".equals(categoryName)){
query.addFilterQuery("item_category_name:"+categoryName);
}
//判断是否有价格过滤 0-9 [min TO MAX]
if(null!=price && !"".equals(price)){
String[] split = price.split("-");
if(split.length>1){
query.addFilterQuery("item_price:["+split[0]+" TO "+split[1]+"]");
}else{
query.addFilterQuery("item_price:["+split[0]+" TO *]");
}
}
//分页设置
query.set("start", (page-1)*pageSize);
query.set("rows", pageSize);
//判断是否按价格排序 0升序 1降序
if(null!=sort){
if(0==sort){
query.set("sort", "item_price asc");
}else{
query.set("sort", "item_price desc");
}
}
return query;
}
第三步:发布接口
修改SearchController类,发布搜索接口
@RequestMapping(value="/doSearch",method=RequestMethod.GET)
@ResponseBody
public SearchResult doSearch(String keyword,String categoryName,String price,
@RequestParam(defaultValue="1")Integer page,Integer sort){
SearchResult result = searchService.doSearch(keyword, categoryName, price, page, sort);
return result;
}
第四步:测试接口
(1)重新编译ego-base、ego-search工程
(2)重启ego-search工程
(3)使用postman工具,访问接口
接口发布成功!!!
第二部分:在ego-portal调用搜索服务接口
思路:(1)确定请求路径和请求参数
(2)业务代码实现
第一步:确定请求路径和参数
(1)确定请求参数
请求参数是在portal系统中定义的。
结论:请求参数名为q,值为搜索文本框输入的关键词。(默认分页)
(2)确定返回值类型
搜索结果是在protal工程中渲染的。
第二步:创建SearchService接口及其实现类
(1)修改resourse.properties配置文件
#搜索服务
SEARCH_BASE_URL=http://localhost:8083/search
SEARCH_ITEM_URL=/doSearch
(2)创建SearchService接口及其实现类,定义搜索方法
@Service
public class SearchServiceImpl implements SearchService{
@Value("${SEARCH_BASE_RUL}")
private String SEARCH_BASE_RUL;
@Value("${SEARCH_ITEM_RUL}")
private String SEARCH_ITEM_RUL;
@Override
public SearchResult query(String q, Integer page) {
SearchResult result = null;
Map
params.put("kewword", q);
params.put("page", page+"");
String jsonData = HttpClientUtils.doGet(SEARCH_BASE_RUL+ SEARCH_ITEM_RUL, params);
if(null!=jsonData){
result = JsonUtils.jsonToPojo(jsonData, SearchResult.class);
}
return result;
}
}
第二步:创建SearchController类
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@RequestMapping("/search")
public String query(String q,@RequestParam(defaultValue="1")Integer page,ModelMap map){
SearchResult result = searchService.query(q, page);
map.put("query", q);
map.put("totalPages", result.getTotalPages());
map.put("itemList", result.getItemList());
map.put("page", page);
return "search";
}
}
第三步:解决多张图片显示问题
说明:商品是可以有多张图片的。搜索结果中默认展示第一张图片。
修改SearchItem类,新增String[] images属性。只需要get方法。
private String[] images;
public String[] getImages() {
if(null!=this.image){
images = image.split(",");
}
return images;
}