Solr
- 把数据库里的键录入
- taotao-search发布服务
- taotao-portal实现关键字搜索
把数据库里的键录入
- 搭建Solr服务器
- 配置中文分析器、自定义业务域,里面的field的name在taotao-search发布里是要对应的。
taotao-search发布服务
Controller
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@RequestMapping("/q")
@ResponseBody
public TaotaoResult search(@RequestParam(defaultValue="")String keyword,
@RequestParam(defaultValue="1")Integer page,
@RequestParam(defaultValue="30")Integer rows) {
try {
//转换字符集,输入的搜索关键字中文,注意如何转换编码
keyword = new String(keyword.getBytes("iso8859-1"), "utf-8");
SearchResult searchResult = searchService.search(keyword, page, rows);
return TaotaoResult.ok(searchResult);
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
}
}
Service
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchDao searchDao;
@Override
public SearchResult search(String QueryString, int page, int rows) throws Exception {
//创建查询条件
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery(QueryString);
//设置分页条件
query.setStart((page-1)*rows);
query.setRows(rows);
//设置默认搜索域
query.set("df", "item_title");
//设置高亮
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<font class=\"skcolor_ljg\">");
query.setHighlightSimplePost("</font>");
//执行查询
SearchResult searchResult = searchDao.search(query);
//计算总页数
Long recordCount = searchResult.getRecordCount();
int pageCount = (int) (recordCount / rows);
if (recordCount % rows > 0) {
pageCount++;
}
searchResult.setPageCount(pageCount);
searchResult.setCurpage(page);
return searchResult;
}
}
Dao
@Repository
public class SearchDaoImpl implements SearchDao {
@Autowired
private SolrServer solrServer;
@Override
public SearchResult search(SolrQuery query) throws Exception {
// 执行查询
QueryResponse response = solrServer.query(query);
//取查询结果列表
SolrDocumentList solrDocumentList = response.getResults();
List<SearchItem> itemList = new ArrayList<>();
for (SolrDocument solrDocument : solrDocumentList) {
//创建一个SearchItem对象
SearchItem item = new SearchItem();
item.setCategory_name((String) solrDocument.get("item_category_name"));
item.setId((String) solrDocument.get("id"));
item.setImage((String) solrDocument.get("item_image"));
item.setPrice((Long) solrDocument.get("item_price"));
item.setSell_point((String) solrDocument.get("item_sell_point"));
//获取高亮显示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String itemTitle = "";
if (list != null && list.size()>0) {
//取高亮后的结果
itemTitle = list.get(0);
}else {
itemTitle = (String) solrDocument.get("item_title");
}
item.setTitle(itemTitle);
//添加到列表
itemList.add(item);
}
SearchResult result = new SearchResult();
result.setItemList(itemList);
//查询结果总数量
result.setRecordCount(solrDocumentList.getNumFound());
return result;
}
}
POJO
public class SearchResult {
private List<SearchItem> itemList;
private Long recordCount;
private int pageCount;
private int curPage;
}
public class SearchItem {
private String id;
private String title;
private String sell_point;
private Long price;
private String image;
private String category_name;
private String item_desc;
}
taotao-portal实现关键字搜索
service
@Service
public class SearchServiceImpl implements SearchService {
@Value("${SEARCH_BASE_URL}")
private String SEARCH_BASE_URL;
@Override
public SearchResult search(String keyword, int page, int rows) {
// 调用服务查询商品列表
Map<String,String> param = new HashMap();
param.put("keyword", keyword);
param.put("page", page+"");
param.put("rows", rows+"");
//调用服务
String json = HttpClientUtils.doGet(SEARCH_BASE_URL, param);
//转换成java对象
TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, SearchResult.class);
//取返回结果
SearchResult searchResult = (SearchResult) taotaoResult.getData();
return searchResult;
}
}
controller
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@RequestMapping("/search")
public String search(@RequestParam("q")String keyword,
@RequestParam(defaultValue="1") Integer page,
@RequestParam(defaultValue="60") Integer rows,Model model) {
//get乱码处理
try {
keyword = new String(keyword.getBytes("iso8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
keyword = "";
e.printStackTrace();
}
SearchResult searchResult = searchService.search(keyword, page, rows);
//参数传递给页面
model.addAttribute("query", keyword);
model.addAttribute("totalPages", searchResult.getPageCount());
model.addAttribute("itemList", searchResult.getItemList());
model.addAttribute("page", searchResult.getCurpage());
//返回逻辑视图
return "search";
}
}