实现搜索功能

根据关键词查询索引库。


业务流程

(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 itemList;

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>> highlighting = response.getHighlighting();

//获取商品列表

List items = new ArrayList<>();

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> map = highlighting.get(doc.get("id"));

if(null!=map && map.size()>0){

List list = map.get("item_title");

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 = new HashMap<>();

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;

}

你可能感兴趣的:(实现搜索功能)