使用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 ...
随机推荐
- 批处理--批量打开程序&批量关闭程序
批量打开程序 start D:\work\RunSvr01\IceFire88.01.exe start D:\work\RunSvr02\IceFire88.02.exe start D:\work ...
- iptables 介绍
规则链 规则链的作用:对数据包进行过滤或处理 链的作用:容纳各种防火墙规则 链的分类依据:处理数据包的不同时机 默认包括5种规则链 INPUT:处理入站数据包 OUTPUT:处理出站数据包 FORWA ...
- 【线程】Thread中的join介绍
因为sleep.wait.join等阻塞,可以使用interrupted exception异常唤醒. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行 ...
- LeetCode 15 3Sum(3个数求和为0的组合)
题目链接 https://leetcode.com/problems/3sum/?tab=Description Problem: 给定整数集合,找到所有满足a+b+c=0的元素组合,要求该组合不 ...
- 从Java代码到字节码(1)
理解Java代码是如何被编译为字节码并在Java虚拟机(JVM)上执行是非常重要的,这将帮助理解你的程序是如何执行的.这样的理解不仅仅能够让你在逻辑上更好的掌握语言特性,而且能够有机会理解在做出重要决 ...
- Android之读取 AndroidManifest.xml 中的数据:版本号、应用名称、自定义K-V数据(meta-data)
AndroidManifest.xml中的定义如下: <manifest xmlns:android="http://schemas.android.com/apk/res/andro ...
- mysql概要(六)连接(内连接,左,右外连接
内连接 [join on / from 表1,表二 ]效果一样 区别是:可以理解为首先取得笛卡儿积后,再匹配/还是根据条件获得笛卡尔积 内连接:取俩表的交叉匹配数据:(mysql 内连接 左连接 右连 ...
- 阿里云安装Oracle
#!/bin/bash #writed by kangjie -- ######################################### #如果没有交换分区swap,则创建 # #检查 ...
- sublime--将vue代码进行高亮显示
vue的.vue文件sublime是不认识,但是为了让 .vue 文件看上去更加简洁:所以要用到一款不错的插件: 下载:vue-syntax-highlight https://gitee.com/m ...
- dataframe转换为多维矩阵,然后可以使用values来实现
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(3,3),columns=list('abc'),ind ...