使用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 ...
随机推荐
- iOS - 白名单应用间相互跳转
1. 应用间相互跳转简介 在iOS开发的过程中,我们经常会遇到需要从一个应用程序A跳转到另一个应用程序B的场景.这就需要我们掌握iOS应用程序之间的相互跳转知识. 下面来看看我们在开发过程中遇到的应用 ...
- Englis - 英文字母和音标
英语学习基础基础是一切的根本 学习是一个长期积累知识的过程,正确掌握各科学习方法显得尤其重要!很多孩子学习成绩不好.记忆力不佳都是因为没有掌握正确的学习方法而造成的. 最基本的是:26个英文字母 48 ...
- PHP中$_SERVER的详细用法
PHP中$_SERVER的详细用法 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关. $_SERVER['argv'] #传递给该脚本的参数. ...
- JWNL的配置使用
JWNL是什么? JWNL is an API for accessing WordNet-style relational dictionaries. It also provides functi ...
- html2canvas - 项目中遇到的那些坑点汇总(更新中...)
截图模糊 原理就是讲canvas画布的width和height放大两倍. 后来学习canvas的时候,才了解到这种写法不同于css的宽高设置, 因为css里的只是展示画布显示的大小,不像这样是c ...
- Webpack 备忘录
Webpack 属于在项目中配置一次就很少改动的那种工具,但这样就导致新项目再配置 Webpack 时会有些生疏,所以将 Webpack 核心概念及常用配置记录如下. 1)核心概念 Webpack 4 ...
- jQuery缓存机制(三)
缓存机制提供的入口有: $.data([key],[value]) // 存取数据 $.hasData(elem) // 是否有数据 $.removeData([key]) // 删除数据 $.acc ...
- Dokcer制作nginx镜像,提交镜像至仓库
生成Dockerfile FROM docker.io/hagaico/centos-base-6.5:latest MAINTAINER yatho yatho@163.com ENV DEBIAN ...
- [Windows] 使用SC 命令管理与配置服务
sc config wuauserv start= demand sc config wuauserv start= disabled
- python pytest测试框架介绍一
一.安装 pytest不是python默认的package,需要自动手工安装. pytest支持python 2.6--3.5之间的版本,同时可以在unix及windows上安装 安装方式: pip ...