代码已上传至GitHub 地址:https://github.com/ylw-github/pingyougou.git 版本:59815018ccbe7ad5ce16749a5b92400bae27573e
打开搜索页面,在搜索框输入要搜索的关键字,点击搜索按钮即可进行搜索,展示搜索结果,效果图如下:
代码主要在service层,根据条件使用solr查询,代码如下:
@Service
public class ItemSearchServiceImpl implements ItemSearchService {
// 注入solr模版对象
@Autowired
private SolrTemplate solrTemplate;
/**
* 需求:根据前台页面传递搜索关键字进行搜索 $scope.searchMap = {"keywords":"华为"};
*
* @param searchMap
* @return
*/
public Map searchList(Map searchMap) {
// 创建返回值对象,封装结果
Map maps = new HashMap();
// 获取主查询条件
String keywords = (String) searchMap.get("keywords");
// 创建高亮查询SimpleHighlightQuery对象,封装所有查询条件
SimpleHighlightQuery query = new SimpleHighlightQuery();
// 创建criteria对象,封装查询参数
// 指定复制域为查询字段
Criteria criteria = null;
// 1,主查询条件
// 判断主查询条件是否为空
if (keywords != null && !"".equals(keywords)) {
// 添加条件
criteria = new Criteria("item_keywords").is(keywords);
} else {
// 查询所有
criteria = new Criteria().expression("*:*");
}
// 把条件添加query对象
query.addCriteria(criteria);
// 2,高亮设置
// 创建高亮设置对象
HighlightOptions highlightOptions = new HighlightOptions();
// 指定设置高亮域字段
highlightOptions.addField("item_title");
// 设置前缀
highlightOptions.setSimplePrefix("");
// 设置后缀
highlightOptions.setSimplePostfix("");
// 设置高亮查询
query.setHighlightOptions(highlightOptions);
// 3,根据分类查询
// 获取分类参数
String category = (String) searchMap.get("category");
// 判断分类值是否存在
if (category != null && !"".equals(category)) {
// 根据分类查询
Criteria criteria2 = new Criteria("item_category").is(category);
// 创建过滤对象
FilterQuery filterQuery = new SimpleFilterQuery(criteria2);
// 把过滤查询添加query对象
query.addFilterQuery(filterQuery);
}
// 4,根据品牌过滤查询
// 获取品牌参数
String brand = (String) searchMap.get("brand");
// 判断分类值是否存在
if (brand != null && !"".equals(brand)) {
// 根据分类查询
Criteria criteria2 = new Criteria("item_brand").is(brand);
// 创建过滤对象
FilterQuery filterQuery = new SimpleFilterQuery(criteria2);
// 把过滤查询添加query对象
query.addFilterQuery(filterQuery);
}
// 5,根据规格查询
// 获取规格对象
Map specMap = (Map) searchMap
.get("spec");
// 获取规格值
for (String key : specMap.keySet()) {
String value = (String) specMap.get(key);
// 根据分类查询
Criteria criteria2 = new Criteria("item_spec_" + key).is(value);
// 创建过滤对象
FilterQuery filterQuery = new SimpleFilterQuery(criteria2);
// 把过滤查询添加query对象
query.addFilterQuery(filterQuery);
}
// 6,价格过滤查询
// 获取价格值
// 数据格式:0-500,500-1000....
String price = (String) searchMap.get("price");
// 判断分类值是否存在
if (price != null && !"".equals(price)) {
// 切割价格
String[] prices = price.split("-");
// 判断最低价格如何不是0
if (prices[0] != "0") {
// 根据分类查询
Criteria criteria2 = new Criteria("item_price")
.greaterThanEqual(prices[0]);
// 创建过滤对象
FilterQuery filterQuery = new SimpleFilterQuery(criteria2);
// 把过滤查询添加query对象
query.addFilterQuery(filterQuery);
}
// 判断最高价格不为*
if (prices[1] != "*") {
// 根据分类查询
Criteria criteria2 = new Criteria("item_price")
.lessThanEqual(prices[1]);
// 创建过滤对象
FilterQuery filterQuery = new SimpleFilterQuery(criteria2);
// 把过滤查询添加query对象
query.addFilterQuery(filterQuery);
}
}
// 执行查询
HighlightPage hpage = solrTemplate.queryForHighlightPage(query,
TbItem.class);
// 获取高亮
List itemList = hpage.getContent();
// 循环搜索商品集合,获取高亮
for (TbItem tbItem : itemList) {
// 获取高亮
List highlights = hpage.getHighlights(tbItem);
// 判断高亮是否存在
if (highlights != null && highlights.size() > 0) {
// 获取高亮
Highlight highlight = highlights.get(0);
// 获取高亮值[{}]
List snipplets = highlight.getSnipplets();
// 设置高亮字段
tbItem.setTitle(snipplets.get(0));
}
}
// 封装结果
maps.put("rows", hpage.getContent());
return maps;
}
}
前端代码
searchService.js:
//服务层
app.service('searchService',function($http){
//读取列表数据绑定到表单中
this.searchList=function(searchMap){
return $http.post('../searchs',searchMap);
};
});
searchController.js:
//控制层
app.controller('searchController', function($scope, $location, searchService) {
// 对searchMap进行初始化工作
// 封装页面向后台传递所有搜索参数
$scope.searchMap = {
"keywords" : "",
"category" : "",
"brand" : "",
"spec" : {},
"price" : "",
"sort" : "",
"sortField" : "",
"pageNo" : 1,
"pageSize" : 30
};
// 主要用来封装主查询条件
// 接受参数,向搜索系统发送搜索请求
$scope.loadkeywords = function() {
// 接受页面参数
$scope.searchMap.keywords = $location.search()["keywords"];
// 调用搜索服务
searchService.searchList($scope.searchMap).success(function(data) {
// 回调函数结果
$scope.searchResult = data;
});
};
// 定义条件搜索方法
$scope.searchList = function() {
// 调用service
searchService.searchList($scope.searchMap).success(function(data) {
// 回调函数结果
$scope.searchResult = data;
});
};
//定义添加过滤条件函数
//点击:addFilterCondition('category','手机')
$scope.addFilterCondition = function(key,value){
//判断过滤条件类型
if(key=="category" || key=="brand" || key=="price" ){
$scope.searchMap[key]=value;
}else{
$scope.searchMap.spec[key]=value;
}
//调用搜索方法
$scope.searchList();
}
//撤销查询选项
$scope.removeSearchItem = function(key){
//判断
if(key=="category" || key=="brand" || key=="price"){
$scope.searchMap[key]="";
}else{
delete $scope.searchMap.spec[key];
}
//调用搜索方法
$scope.searchList();
};
});
search.html(显示数据部分):
-
关注
打赏
立即登录/注册
微信扫码登录