@Service
public class SearchServiceImpl implements SearchService { @Autowired
private SolrTemplate solrTemplate; @Autowired
private TbItemMapper itemMapper; @Override
public Map search(Map searchMap) { String keywords = (String) searchMap.get("keywords");
System.out.println("查询关键字是:"+keywords); //通过solrTemplate进行索引库的查询 //直接创建高亮查询
SimpleHighlightQuery query = new SimpleHighlightQuery(); //不需要指定*:* //封装搜索条件
Criteria criteria = new Criteria("item_keywords"); //要查询的域
criteria = criteria.contains(keywords); //要查询的条件
query.addCriteria(criteria); //设置高亮效果选项
HighlightOptions options = new HighlightOptions();
options.addField("item_title"); //设置哪个域加高亮效果
options.setSimplePrefix("<em style='color:red'>"); // 高亮头部
options.setSimplePostfix("</em>"); // 高亮尾部
query.setHighlightOptions(options); //增加过滤查询条件--商品分类
String categoryStr = (String) searchMap.get("category");
if(categoryStr!=null && categoryStr.length() > 0){ FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("item_category"); //设置Criteria
filterCriteria = filterCriteria.contains(categoryStr); //进行查询比较
filterQuery.addCriteria(filterCriteria); //增加过滤查询条件
query.addFilterQuery(filterQuery);
} //增加过滤查询条件--商品品牌
String brandStr = (String) searchMap.get("brand");
if(brandStr!= null && brandStr.length() > 0){ SimpleFilterQuery filterQuery = new SimpleFilterQuery();
Criteria fileterCriteria = new Criteria("item_brand");
fileterCriteria = fileterCriteria.contains(brandStr); //进行品牌搜索条件封装
filterQuery.addCriteria(fileterCriteria); query.addFilterQuery(filterQuery);
} //增加过滤查询条件--规格
Map<String,String> specMap = (Map) searchMap.get("spec");
if(specMap!=null){ for (String key : specMap.keySet()) {
SimpleFilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("item_spec_"+key);
filterCriteria = filterCriteria.contains(specMap.get(key)); //设置搜索的规格内容
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
} //增加过滤查询条件--价格
String priceStr = (String) searchMap.get("price");
if(priceStr != null && priceStr.length() > 0){
String[] prices = priceStr.split("-"); //获取起始值作为价格初始条件
SimpleFilterQuery filterQuery1 = new SimpleFilterQuery();
Criteria filterCriteria1 = new Criteria("item_price");
filterCriteria1 = filterCriteria1.greaterThanEqual(prices[0]); //price>= 价格条件查询
filterQuery1.addCriteria(filterCriteria1);
query.addFilterQuery(filterQuery1); if(!"*".equals(prices[1])){ //当结束价格不定*才会有结束价格范围,否则3000-*,就是起始是3000,没有结束价格
//获取结束值作为价格结束条件
SimpleFilterQuery filterQuery2 = new SimpleFilterQuery();
Criteria filterCriteria2 = new Criteria("item_price");
filterCriteria2 = filterCriteria2.lessThanEqual(prices[1]); //price<= 价格条件查询
filterQuery2.addCriteria(filterCriteria2);
query.addFilterQuery(filterQuery2);
}
} //设置价格升降序查询
String sortStr = (String) searchMap.get("sort"); Sort sort;
if("ASC".equals(sortStr)){
//设置价格升序查询
sort = new Sort(Sort.Direction.ASC, "item_price"); //参数一是设置升降序 参数二设置升降序的域
}else{
//设置价格降序查询
sort = new Sort(Sort.Direction.DESC, "item_price");
}
query.addSort(sort); Integer pageNo = (Integer) searchMap.get("pageNo");
Integer pageSize = (Integer) searchMap.get("pageSize"); //设置分页相关参数
query.setRows(pageSize); //pageSize
query.setOffset((pageNo-1)*pageSize);//offset = (pageNo - 1)*pageSize,起始的索引数 //直接采用solr的高亮查询
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class); List<TbItem> content = page.getContent(); for (TbItem item : content) {
List<HighlightEntry.Highlight> highlights = page.getHighlights(item); if(highlights.size() > 0){ //防止出现的结果item_title中没有高亮关键字
List<String> snipplets = highlights.get(0).getSnipplets();
if(snipplets.size() > 0){
item.setTitle(snipplets.get(0)); //设置高亮后的效果
}
}
} //封装前端分页插件的需要的属性,rows,total(模仿PageResult)
Map returnMap = new HashMap<>();
returnMap.put("rows", content);
returnMap.put("total",page.getTotalElements()); //TotalElements总记录数
//page.getTotalPages()总页数
return returnMap;
} @Override
public void importData(Long[] ids) {
//根据导入的goods的id,查询出本次需要导入的item对象,保存到solr索引库
TbItemExample example = new TbItemExample();
example.createCriteria().andGoodsIdIn(Arrays.asList(ids));
List<TbItem> items = itemMapper.selectByExample(example); for (TbItem item : items) {
System.out.println("导入了:"+item.getTitle());
}
solrTemplate.saveBeans(items);
solrTemplate.commit(); //提交一下
} @Override
public void removeData(Long[] ids) {
TbItemExample example = new TbItemExample();
example.createCriteria().andGoodsIdIn(Arrays.asList(ids));
List<TbItem> items = itemMapper.selectByExample(example); for (TbItem item : items) {
solrTemplate.deleteById(item.getId() + ""); System.out.println("删除了:"+item.getTitle()); } solrTemplate.commit();
}
}

Solr的核心操作案例的更多相关文章

  1. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  2. 关于activiti流程通过、驳回、会签、转办、中止、挂起等核心操作功能的封装

    http://blog.csdn.net/aochuanguying/article/details/7594197 package com.famousPro.process.service.imp ...

  3. Solr多核心及分词器(IK)配置

    Solr多核心及分词器(IK)配置   多核心的概念 多核心说白了就是多索引库.也可以理解为多个"数据库表" 说一下使用multicore的真实场景,比若说,产品搜索和会员信息搜索 ...

  4. Solr 14 - SolrJ操作SolrCloud集群 (Solr的Java API)

    目录 1 pom.xml文件的配置 2 SolrJ操作SolrCloud 1 pom.xml文件的配置 项目的pom.xml依赖信息请参照: Solr 09 - SolrJ操作Solr单机服务 (So ...

  5. Activiti之流程通过、驳回、会签、转办、中止、挂起等核心操作封装(Activiti5.9)

    http://blog.csdn.net/rosten/article/details/38300267 package com.famousPro.process.service.impl; imp ...

  6. AngularJS基于MVC的复杂操作案例

    AngularJS基于MVC的复杂操作案例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  7. [OpenCV-Python] OpenCV 核心操作 部分 III

    部分 III核心操作 OpenCV-Python 中文教程(搬运)目录 9 图像的基础操作 目标 • 获取像素值并修改 • 获取图像的属性(信息) • 图像的 ROI() • 图像通道的拆分及合并几乎 ...

  8. linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例

    转自:truemylife.linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例 基本概念: 磁盘.分区.物理卷[物理部分] 卷组[中间部分] 逻辑卷.文件系统[虚拟化后可控制部分] 磁 ...

  9. solr的客户端操作:使用solrj进行curd操作

    导入相关的jar包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-s ...

随机推荐

  1. 哪个版本的gcc才支持c11

    而知,低版本的gcc不支持c11. (而我此处的eglibc 2.17,和那人的glibc-2.16.0,都是需要支持c11的gcc的) 所以此处想要去搞清楚,什么版本的,哪个版本的,gcc,才支持c ...

  2. day06——小数据池、深浅拷贝、集合

    day06 小数据池 小数据池--缓存机制(驻留机制),只是一种规格,不会实际的开辟一个空间 == 判断两边内容是否相等 ***** # a = 10 # b = 10 # print(a == b) ...

  3. 云原生生态周报 Vol. 16 | CNCF 归档 rkt,容器运行时“上古”之战老兵凋零

    作者列表:木苏,临石,得为,等等 业界要闻 安全漏洞 CVE-2019-9512 CVE-2019-9514 http2 的 DOS 漏洞,一旦攻击成功会耗尽服务器的 cpu/mem,从而导致服务不可 ...

  4. 三、hexo+github搭建个人博客的主题配置

    更换博客主题 主题可参考:https://hexo.io/themes/ hexo默认主题:Landscape 示例主题:Next 下载Next主题 进入Blog所在目录,输入下载命令 #进入Blog ...

  5. Centos7利用rsync实现文件同步

    0x01 测试环境 CentOS 7.4 Rsync服务端:192.168.204.130 CentOS 7.4 Rsync客户端:192.168.204.168 0x02 rsync同步方式 第一种 ...

  6. 配置 SSL、TLS 以及 HTTPS 来确保 Elasticsearch、Kibana、Beats 和 Logstash 的安全

    配置主机hosts文件 192.168.75.20 filebeat.local kibana.local logstash.local 192.168.75.22 node2.elastic.tes ...

  7. 2019-11-29-win10-uwp-颜色转换

    原文:2019-11-29-win10-uwp-颜色转换 title author date CreateTime categories win10 uwp 颜色转换 lindexi 2019-11- ...

  8. asp.net webapi 随笔

    第一次写博客,文笔有限,记录下学习的过程 话不多说,直接开干 首先用vs2017建立一个空网站项目,然后只勾选api 项目建立后,如下结构 其中WebApiConfig类配置了路由相关信息 publi ...

  9. Java常用类object详解

    1.Object概述: 类Object是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括数组)都实现这个类的方法. 2.构造方法详细信息: Object只有一个无参构造方法,因为ob ...

  10. 基于windows 10打造的kali工具集

    基于windows 10打造的kali工具集.iso,适合于习惯使用windows的安全从业者.if you like it,please touch star! 作为安全从业主,Kali都是必备工具 ...