首页 > 全文索引 > 全文索引服务solr入门三之solrJ的应用

全文索引服务solr入门三之solrJ的应用

三. 使用solrJ和spring集成

上一篇上上一篇文章中我们先搭建了一个solr服务器和学习了solr服务器后台的使用,这一次我们将直接进入实战:和spring集成,在继承之前我们先看看所需要的solr的jar文件都是那些(spring的那些大家就自己玩吧,我相信都知道的)

1. 所需的jar文件

直接上图片,就是图上的这些图片,当然大家可以自己找maven依赖(jar文件这个最简单了,没有的话一定会报classnotfoundException,加上就好了)

solrJ1
solrJ2

2. spring的配置


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.1.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
	<!-- 配置扫描包 -->
	<context:component-scan base-package="cn.bridgeli"/>
	<!-- 配置注解驱动 -->
	<mvc:annotation-driven/>
	<!-- jsp视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
		<!-- 前缀 -->
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<!-- 后缀 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
	<!-- 单机版solr -->
	<bean class="org.apache.solr.client.solrj.impl.HttpSolrServer">
		<constructor-arg name="baseURL" value="http://localhost:8080/solr/"></constructor-arg>
	</bean>
	<!-- 集群版SolrCloud -->
	<!--
	<bean class="org.apache.solr.client.solrj.impl.CloudSolrServer">
		<constructor-arg name="zkHost" value="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"></constructor-arg>
		<property name="defaultCollection" value="collection2"></property>
	</bean>
	-->
</beans>

简单吧,大家只要注意到单机版就行了,因为我们这次只用到了单机版,下面就要看源码实现了

3. 具体代码实现

①. controller


package cn.bridgeli.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.bridgeli.model.ResultModel;
import cn.bridgeli.service.ProductService;
@Controller
public class ProductController {
	
	@Autowired
	private ProductService productService;
	
	@RequestMapping("/list")
	public String queryProduct(String queryString, String catalog_name, String price,
			String sort, Integer page, Model model) throws Exception {
		//查询商品列表
		ResultModel resultModel = productService.queryProduct(queryString, catalog_name, price, sort, page);
		//列表传递给jsp
		model.addAttribute("result", resultModel);
		//参数回显
		model.addAttribute("queryString", queryString);
		model.addAttribute("caltalog_name", catalog_name);
		model.addAttribute("price", price);
		model.addAttribute("sort", sort);
		model.addAttribute("page", page);
		
		return "product_list";
	}
}

②. service


package cn.bridgeli.service;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.bridgeli.common.Commons;
import cn.bridgeli.dao.ProductDao;
import cn.bridgeli.model.ResultModel;
@Service
public class ProductServiceImpl implements ProductService {

	@Autowired
	private ProductDao productDao;
	
	@Override
	public ResultModel queryProduct(String queryString, String caltalog_name,
			String price, String sort, Integer page) throws Exception {
		//拼装查询条件
		SolrQuery query = new SolrQuery();
		//查询条件
		if (null != queryString && !"".equals(queryString)) {
			query.setQuery(queryString);
		} else {
			query.setQuery("*:*");
		}
		//商品分类名称过滤
		if (null != caltalog_name && !"".equals(caltalog_name)) {
			query.addFilterQuery("category:" + caltalog_name);
		}
		//价格区间过滤
		if (null != price && !"".equals(price)) {
			String[] strings = price.split("-");
			query.addFilterQuery("price:["+strings[0]+" TO "+strings[1]+"]");
		}
		//排序条件
		if ("1".equals(sort)) {
			query.setSort("price", ORDER.desc);
		} else {
			query.setSort("price", ORDER.asc);
		}
		//分页处理
		if (null == page) {
			page = 1;
		}
		//start
		int start = (page-1) * Commons.PAGE_SIZE;
		query.setStart(start);
		query.setRows(Commons.PAGE_SIZE);
		
		//高亮设置
		query.setHighlight(true);
		query.addHighlightField("name");
		query.setHighlightSimplePre("<span style="color:red">");
		query.setHighlightSimplePost("</span>");
		
		//查询商品列表
		ResultModel resultModel = productDao.queryProduct(query);
		//计算总页数
		long recordCount = resultModel.getRecordCount();
		int pages = (int) (recordCount/Commons.PAGE_SIZE);
		if (recordCount % Commons.PAGE_SIZE > 0) {
			pages ++;
		}
		resultModel.setPageCount(pages);
		resultModel.setCurPage(page);
		return resultModel;
	}
}

这里只列出了实现,结果过于简单就算了,dao也会一样

③. dao


package cn.bridgeli.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cn.bridgeli.model.ProductModel;
import cn.bridgeli.model.ResultModel;
@Repository
public class ProductDaoImpl implements ProductDao {

	@Autowired
	private SolrServer solrServer;
	
	@Override
	public ResultModel queryProduct(SolrQuery query) throws Exception {
		
		ResultModel resultModel  = new ResultModel();
		//根据query对象查询商品列表
		QueryResponse queryResponse = solrServer.query(query);
		SolrDocumentList solrDocumentList = queryResponse.getResults();
		//取查询结果的总数量
		resultModel.setRecordCount(solrDocumentList.getNumFound());
		List<ProductModel> productList = new ArrayList<>();
		//遍历查询结果
		for (SolrDocument solrDocument : solrDocumentList) {
			//取商品信息
			ProductModel productModel = new ProductModel();
			productModel.setId((String) solrDocument.get("id"));
			//取高亮显示
			String productName = "";
			Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
			List<String> list = highlighting.get(solrDocument.get("id")).get("name");
			if (null != list) {
				productName = list.get(0);
			} else {
				productName = (String) solrDocument.get("name");
			}
			productModel.setName(productName);
			productModel.setPrice((float) solrDocument.get("price"));
			productModel.setCategory((String) solrDocument.get("category"));
			productModel.setUrl((String) solrDocument.get("url"));
			//添加到商品列表
			productList.add(productModel);
		}
		//商品列表添加到resultmodel中
		resultModel.setProductList(productList);
		return resultModel;
	}

}

④. model

有两个分别是:


package cn.bridgeli.model;

public class ProductModel {
	// 商品编号
	private String id;
	// 商品名称
	private String name;
	// 商品分类名称
	private String category;
	// 价格
	private float price;
	// 商品描述
	private String content;
	// 图片名称
	private String url;
	
	//setXX and getXX
}

package cn.bridgeli.model;

import java.util.List;

public class ResultModel {
	// 商品列表
	private List<ProductModel> productList;
	// 商品总数
	private Long recordCount;
	// 总页数
	private int pageCount;
	// 当前页
	private int curPage;

	//setXX and getXX
}

4. 数据库文件


CREATE TABLE `products` (
  `pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品编号',
  `name` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `catalog` int(11) DEFAULT NULL COMMENT '商品分类ID',
  `catalog_name` varchar(50) DEFAULT NULL COMMENT '商品分类名称',
  `price` double DEFAULT NULL COMMENT '价格',
  `number` int(11) DEFAULT NULL COMMENT '数量',
  `description` longtext COMMENT '商品描述',
  `picture` varchar(255) DEFAULT NULL COMMENT '图片名称',
  `release_time` datetime DEFAULT NULL COMMENT '上架时间',
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

好了,只要初始化上数据,我们的一个单机版solr搜索服务器中完成了,开始庆祝吧。

分享到:
作 者: BridgeLi,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/287
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: 全文索引 标签: , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.