使用SolrJ代码导入,发布搜索服务
搭建solr服务器:http://www.cnblogs.com/liyafei/p/8005571.html
一导入要搜索的字段
1:确定发布搜索的字段,sql语句
SELECT
a.id,
b. title
FROM
tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
2:创建pojo接收相应的字段
public class Item {
private Long id;
private String title;
setter and getter
}
3:创建Mapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.taotao.search.mapper.ItemMapper" >
<select id="getItemList" resultType="com.taotao.search.pojo.Item">
SELECT
a.id,
b.title
FROM
tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
</select>
</mapper>
4:创建mapper接口
public interface ItemMapper{
public List<Item> getItemList();
}
5:配置SolrServer
<bean id="solrserver" class="org.apache.solr.client.solrj.SolrServer">
<constract-arg name="url" value="http://192.168.100.91:8080/solr"/>
</bean>
7:创建service
@Service
public class ItemServiceImpl implements ItemService { @Autowired
private ItemMapper itemMapper;
@Autowired
private SolrServer solrServer; @Override
public TaotaoResult importItemToIndex() throws Exception {
//查询商品列表
List<Item> itemList = itemMapper.getItemList();
//将商品列表导入solr
for (Item item : itemList) {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", item.getId());
document.addField("title", item.getTitle());
//将文档写入索引库
solrServer.add(document);
}
//提交修改
solrServer.commit();
return TaotaoResult.ok();
} }
8:创建controller
@Controller
@RequestMapping("/manager")
public class ItemController { @Autowired
private ItemService itemService; @RequestMapping("/importall")
@ResponseBody
public TaotaoResult importAll() {
TaotaoResult result = null;
try {
result = itemService.importItemToIndex();
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
return result;
}
}
二:发布搜索服务,可以供其它客户端调用
1:返回值pojo
public class SearchResult { private Long recordCount;
private List<Item> itemList;
private Integer pageCount;
private Integer curPage; }
2:dao,从solr服务器中去查询,不用去数据库
@Service
public class ItemSearchDaoImpl implements ItemSearchDao { @Autowired
private SolrServer solrServer; @Override
public SearchResult searchItem(SolrQuery solrQuery) throws Exception {
//根据查询条件搜索索引库
QueryResponse response = solrServer.query(solrQuery);
//取商品列表
SolrDocumentList documentList = response.getResults();
//商品列表
List<Item> itemList = new ArrayList<>();
for (SolrDocument solrDocument : documentList) {
Item item = new Item();
item.setId((Long) solrDocument.get("id"));
//取高亮显示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String title = "";
if (null != list && !list.isEmpty()) {
title = list.get(0);
} else {
title = (String) solrDocument.get("title");
}
item.setTitle(title);
itemList.add(item);
}
SearchResult result = new SearchResult();
//商品列表
result.setItemList(itemList);
//总记录数据
result.setRecordCount(documentList.getNumFound()); return result;
} }
3:service层
@Service
public class ItemSearchServiceImpl implements ItemSearchService { @Value("${SEARCH_RESULT_PAGE_SIZE}")
private Integer PAGE_SIZE;
@Autowired
private ItemSearchDao itemSearchDao; @Override
public SearchResult searchItem(String queryString, Integer page) throws Exception {
//创建一个查询对象
SolrQuery solrQuery = new SolrQuery();
//查询条件
if (StringUtils.isBlank(queryString)) {
solrQuery.setQuery("*:*");
} else {
solrQuery.setQuery(queryString);
}
//分页条件
if (page == null) {
page = 1;
}
solrQuery.setStart((page -1) * PAGE_SIZE);
solrQuery.setRows(PAGE_SIZE);
//高亮显示
solrQuery.setHighlight(true);
//设置高亮显示的域
solrQuery.addHighlightField("title");
//高亮显示前缀
solrQuery.setHighlightSimplePre("<em style=\"color:red\">");
//后缀
solrQuery.setHighlightSimplePost("</em>");
//设置默认搜索域
solrQuery.set("df", "item_keywords"); //执行查询
SearchResult result = itemSearchDao.searchItem(solrQuery);
//计算分页
Long recordCount = result.getRecordCount();
int pageCount = (int) (recordCount / PAGE_SIZE);
if (recordCount % PAGE_SIZE > 0) {
pageCount++;
}
result.setPageCount(pageCount);
result.setCurPage(page); return result;
} }
4:controller
@Controller
public class ItemSearchController { @Autowired
private ItemSearchService itemSearchService; @RequestMapping("/q")
@ResponseBody
public TaotaoResult search(@RequestParam(value = "kw") String queryString,
@RequestParam(value = "page", defaultValue = "1") Integer page) { if (StringUtils.isBlank(queryString)) {
return TaotaoResult.build(400, "查询条件是必须的参数");
}
SearchResult result = null;
try {
result = itemSearchService.searchItem(queryString, page); } catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
} return TaotaoResult.ok(result);
}
}
使用SolrJ代码导入,发布搜索服务的更多相关文章
- geoserver 通过代码实现发布地图服务
GeoServer:代码实现批量发布地图服务 利用GeoServer发布WCS服务,那么如果我有很多数据需要进行发布,这样利用GeoServer提供的UI界面进行操作显然很不显示.那能不能利用GeoS ...
- 通过纯代码方式发布WCF服务
网络上搜索WCF服务,一般是寄宿在IIS,通过WebConfig方式配服务地址,接口类型等信息,但是对于我这样的懒人,目前项目在开发阶段,实在不愿意每次添加新服务就更新配置文件,于是使用了反射来加载服 ...
- arcgis 10.1 导入数据到oracle 发布地图服务
机器配置说明 数据库服务器 系统:linux 软件:oracle 11G 64位 Arcgis server服务器 系统:win7 专业版 软件:arcgis server 10.1.win64_11 ...
- solr服务(搜索服务)
1 Solr实现全文搜索 1.1 Solr是什么? Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的 ...
- 【高德地图API】从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索
原文:[高德地图API]从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 摘要:地图服务,大家能想到哪些?POI搜素,输入提示,地址解析,公 ...
- JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务
1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...
- 从零搭建 ES 搜索服务(二)基础搜索
一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...
- 【高德地图API】从零開始学高德JS API(四)搜索服务——POI搜索|自己主动完毕|输入提示|行政区域|交叉路口|自有数据检索
地图服务.大家能想到哪些?POI搜素,输入提示,地址解析,公交导航,驾车导航,步行导航,道路查询(交叉口),行政区划等等.假设说覆盖物Marker是地图的骨骼,那么服务,就是地图的气血. 有个各种各样 ...
- Web Service——CXF发布REST服务
1. 什么是REST REST,英文representational state transfer(表象性状态转变)或者表述性状态转移,REST是web服务的一种架构风格,使用HTTP.URI.XML ...
随机推荐
- 微信小程序学习指南
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 【架构师之路】APP架构师必看:面对爆发流量如何进行架构调整
一.APP架构与WEB架构的最大不同 移动APP的架构和传统PC的WEB架构有三点不同: 1.连接的稳定性.在传统的web端连接成功后就可以认为它是稳定的,但在移动端.无线端,APP连接非常敏感,可能 ...
- jsp连接数据库的乱码问题 servlet请求参数编码处理get post
1.在所有需要读取数据的地方用下面的方式.同时jsp必须统一编码,如我都是UTF-8 String userName= new String(request.getParameter("us ...
- CSS技巧:逐帧动画抖动解决方案
笔者所在的前端团队主要从事移动端的H5页面开发,而团队使用的适配方案是: viewport units + rem.具体可以参见凹凸实验室的文章 – 利用视口单位实现适配布局 . 笔者目前(2017. ...
- CopyTo 方法详解
如果你就想复制一个字符串到另一个字符串,可以使用string的静态方法Copy 例如: string a = "hello"; string b = "world&quo ...
- OpenStack cloud 第一天
这是刚接触openstack时候,看到的第一篇文章,感触很深,自己很喜欢的一个词Horizon就是出自本文 ============================================ ...
- sysbench 压力测试工具
一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL. ...
- 什么是webpack?
https://www.webpackjs.com/concepts/ https://webpack.github.io/ 本质上,webpack 是一个现代 JavaScript 应用程序的静态模 ...
- vue--使用定时器的问题
https://blog.csdn.net/ywl570717586/article/details/79963162
- Kibana在Linux上安装部署及使用说明
Kibana安装及使用说明 Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据. 官方地址:https://www. ...