利用Solr实现电子商城检索功能

利用Solr实现电子商城检索功能
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

利用Solr实现电子商城检索功能

Solr

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-serviceAPI接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Solr实现全文检索的流程

  • 索引流程solr客户端(浏览器、java程序)可以向solr服务端发送POST请求,请求内容是包含Field等信息的xml
  • 搜索流程solr客户端(浏览器、java程序)可以向solr服务端发送GET请求,solr服务器返回一个xml文档。
  • Solr同样没有视图渲染的功能。

Solr索引搜索过程

  1. 用户输入搜索条件
  2. 对搜索条件进行分词处理(词条化、语言分析)
  3. 根据分词的结果查找索引
  4. 根据索引找到文档ID列表
  5. 根据文档ID列表找到具体的文档,根据出现的频次等计算权重(权重越大,结果越接近),最后将文档列表按照权重排序返回

在这里插入图片描述

Spring+Solr实现电子商城检索功能

Web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>product_list.jsp</welcome-file>
    </welcome-file-list>
    <!-- SpringMVC配置 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>Character Encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>Character Encoding</filter-name>
        <url-pattern>/*</url-pattern> </filter-mapping> </web-app> 

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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

	    http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.3.xsd
 ">
    <!-- 配置扫描包 -->
    <context:component-scan base-package="com.itheima" />
    <!-- 配置注解驱动 -->
    <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>
    <!-- 配置HttpSolrServer -->
    <bean class="org.apache.solr.client.solrj.impl.HttpSolrServer">
        <constructor-arg value="http://localhost:8080/solr/"></constructor-arg>
    </bean>

</beans>

这是JDong项目的Contrller层

@Controller
public class ProductController {
   

	@Autowired
	private ProductService service;

	@RequestMapping("/list")
	public String list(String queryString, String catalog_name, String price,
			String sort, Integer page, Model model) throws Exception {
   

		System.out.println("访问了list");
		ResultModel rm = service.getProducts(queryString, catalog_name, price,
				sort, page);

		// 将查询结果放到request域
		model.addAttribute("result", rm);

		// 简单类型的数据回显
		model.addAttribute("queryString", queryString);
		model.addAttribute("catalog_name", catalog_name);
		model.addAttribute("price", price);
		model.addAttribute("sort", sort);
		model.addAttribute("page", page);

		return "product_list";
	}

}

服务层部分

@Service
public class ProductServiceImpl implements ProductService {
   

	// 依赖注入HttpSolrServer
	@Autowired
	private HttpSolrServer server;

	@Override
	public ResultModel getProducts(String queryString, String catalogName,
			String price, String sort, Integer page) throws Exception {
   
		// 创建SolrQuery对象
		SolrQuery query = new SolrQuery();

		// 输入关键字
		if (StringUtils.isNotEmpty(queryString)) {
   
			query.setQuery(queryString);
		} else {
   
			query.setQuery("*:*");
		}


		// 输入商品分类过滤条件
		if (StringUtils.isNotEmpty(catalogName)) {
   
			query.addFilterQuery("product_catalog_name:" + catalogName);
		}

		// 输入价格区间过滤条件
		// price的值:0-9 10-19
		if (StringUtils.isNotEmpty(price)) {
   
			String[] ss = price.split("-");
			if (ss.length == 2) {
   
				query.addFilterQuery("product_price:[" + ss[0] + " TO " + ss[1]
						+ "]");
			}
		}

		// 设置排序
		if ("1".equals(sort)) {
   
			query.setSort("product_price", ORDER.desc);
		} else {
   
			query.setSort("product_price", ORDER.asc);
		}

		// 设置分页信息
		if (page == null)
			page = 1;

		query.setStart((page - 1) * 20);
		query.setRows(20);

		// 设置默认域
		query.set("df", "product_keywords");

		// 设置高亮信息
		query.setHighlight(true);
		query.addHighlightField("product_name");
		query.setHighlightSimplePre("<font style=\"color:red\" >");
		query.setHighlightSimplePost("</font>");

		QueryResponse response = server.query(query);
		// 查询出的结果
		SolrDocumentList results = response.getResults();
		// 记录总数
		long count = results.getNumFound();

		List<Products> products = new ArrayList<>();
		Products prod;

		// 获取高亮信息
		Map<String, Map<String, List<String>>> highlighting = response
				.getHighlighting();
		for (SolrDocument doc : results) {
   
			prod = new Products();

			// 商品ID
			prod.setPid(doc.get("id").toString());

			List<String> list = highlighting.get(doc.get("id")).get(
					"product_name");
			// 商品名称
			if (list != null)
				prod.setName(list.get(0));
			else {
   
				prod.setName(doc.get("product_name").toString());
			}

			// 商品价格
			prod.setPrice(Float.parseFloat(doc.get("product_price").toString()));
			// 商品图片地址
			prod.setPicture(doc.get("product_picture").toString());

			products.add(prod);
		}

		// 封装ResultModel对象
		ResultModel rm = new ResultModel();
		rm.setProductList(products);
		rm.setCurPage(page);
		rm.setRecordCount(count);

		int pageCount = (int) (count / 20);

		if (count % 20 > 0)
			pageCount++;
		// 设置总页数
		rm.setPageCount(pageCount);

		return rm;
	}
}

POJO类

public class Products {
   
	// 商品编号
	private String pid;
	// 商品名称
	private String name;
	// 商品分类名称
	private String catalog_name;
	// 价格
	private float price;
	// 商品描述
	private String description;
	// 图片名称
	private String picture;

	public String getPid() {
   
		return pid;
	}

	public void setPid(String pid) {
   
		this.pid = pid;
	}

	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this.name = name;
	}

	public String getCatalog_name() {
   
		return catalog_name;
	}

	public void setCatalog_name(String catalog_name) {
   
		this.catalog_name = catalog_name;
	}

	public float getPrice() {
   
		return price;
	}

	public void setPrice(float price) {
   
		this.price = price;
	}

	public String getDescription() {
   
		return description;
	}

	public void setDescription(String description) {
   
		this.description = description;
	}

	public String getPicture() {
   
		return picture;
	}

	public void setPicture(String picture) {
   
		this.picture = picture;
	}

}

响应封装类

public class ResultModel {
   

	// 商品列表
	private List<Products> productList;
	// 商品总数
	private Long recordCount;
	// 总页数
	private int pageCount;
	// 当前页
	private int curPage;

	public List<Products> getProductList() {
   
		return productList;
	}

	public void setProductList(List<Products> productList) {
   
		this.productList = productList;
	}

	public Long getRecordCount() {
   
		return recordCount;
	}

	public void setRecordCount(Long recordCount) {
   
		this.recordCount = recordCount;
	}

	public int getPageCount() {
   
		return pageCount;
	}

	public void setPageCount(int pageCount) {
   
		this.pageCount = pageCount;
	}

	public int getCurPage() {
   
		return curPage;
	}

	public void setCurPage(int curPage) {
   
		this.curPage = curPage;
	}

}

实现效果
这里写图片描述

在这里插入图片描述

本文来源蹊源的奇思妙想,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/14758