利用solr实现商品的搜索功能

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。有效降低频繁访问数据库对数据库造成的压力。

第一步:将solr部署在linux系统下。

第二步:solrJ是solr的客户端,使用它需要依赖solrJ的jar包。

第三步:将数据库的内容添加到solr的索引库,这样查询就在索引库查询,而不是数据库了。

controller层:

@Controller
@RequestMapping("/manager")
public class ItemController {
 @Autowired
 private ItemService itemService;
 @RequestMapping("/importall")
 @ResponseBody
  public   TaotaoResult importAllItem(){
        	TaotaoResult result= itemService.importAllItem();
			return result;
 }
}service层编写:多表查询商品,显示在页面的逻辑编写:mapper.java
package com.taotao.search.mapper;

import java.util.List;

import com.taotao.search.pojo.Item;

public interface ItemMapper {
	List<Item> getItemList();

}

  mapper.xml

<?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,
	a.title,
	a.sell_point,
	a.price,
	a.image,
	b. NAME category_name
	FROM
	tb_item a
	LEFT JOIN tb_item_cat b ON a.cid = b.id
</select>
</mapper>

第四步:从索引库查询的逻辑编写:

//从索引库里面获取商品信息,现在这个dao层是从索引库获取信息,因为之前的写的逻辑是将db里面的数据导入到索引库。后面的查询都是从索引库中进行,而不从数据库了
@Repository
public class SearchDaoImpl implements SearchDao {
	@Autowired
	private SolrServer solrServer;

	@Override
	public SearchResult search(SolrQuery query) throws Exception {
		//这是从索引库里面,直接执行查询
		QueryResponse response = solrServer.query(query);
		//获取查询的结果
		SolrDocumentList documentList= response.getResults();

		SearchResult result=new SearchResult();
		//这是获取总记录数
		result.setRecordCount(documentList.getNumFound());

	 	List<Item> itemList=new ArrayList<>();
	 	//商品的高亮显示,即当鼠标移到字上时,该字体变色,这是从QueryResponse中获取的
	 	Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

		for (SolrDocument solrDocument : documentList) {

			//每个SolrDocument都是一个商品pojo的内容,所以这里要创建一个商品的pojo对象,来获取详细的字段
		    Item item=new Item();
		    item.setId((String) solrDocument.get("id"));
		    //高亮显示是title的高亮显示
		    List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
		    String title="";
		    if (list!=null && list.size()>0) {
		    	title=list.get(0);
			}
		    else{
		    	title=(String) solrDocument.get("item_title");
		    }

		    item.setTitle(title);
		    item.setPrice((Long) solrDocument.get("item_price"));
		    item.setImage((String) solrDocument.get("item_image"));
		    item.setCategory_name((String) solrDocument.get(" item_category_name"));
		    item.setSell_point((String) solrDocument.get("item_sell_point"));
		   itemList.add(item);
		}

		  result.setItemList(itemList);	

		return result;
	}

}

第五步:索引库内容建立好后,开始编写对外的服务接口,即通过条件搜索具体的商品,比如手机,会显示出总共的手机列表信息,第几页,总共多少页,总共多少个搜索结果

请求的url:

/search/query?q={查询条件}&page={page}&rows={rows}

返回的结果:TaotaoResult包装商品列表。

创建一个sql语句对应的pojo,单独建立一个pojo

用来装显示的内容列表:

public class Item {
     private String id;
     private String title;
     private String sell_point;
     private long price;
     private String image;
     private String category_name;
     private String item_des;

}

controller层:

@Controller
public class SearchController {
	@Autowired
	private SearchService searchService;

	@RequestMapping(value="/query", method=RequestMethod.GET)
	@ResponseBody
	public TaotaoResult search(@RequestParam("q")String queryString,
			@RequestParam(defaultValue="1")Integer page,
			@RequestParam(defaultValue="60")Integer rows) {
		//查询条件不能为空
		if (StringUtils.isBlank(queryString)) {
			return TaotaoResult.build(400, "查询条件不能为空");
		}
		SearchResult searchResult = null;
		try {
			queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
			searchResult = searchService.search(queryString, page, rows);
		} catch (Exception e) {
			e.printStackTrace();
			return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
		}
		return TaotaoResult.ok(searchResult);

	}
	}
service层:利用solrJ的solrQurery来查询:

前提是要写好如何从索引库读取数据:  

下面是服务的接口层编写:

controller:

@Controller
public class SearchController {
	@Autowired
	private SearchService searchService;

	@RequestMapping(value="/query", method=RequestMethod.GET)
	@ResponseBody
	public TaotaoResult search(@RequestParam("q")String queryString,
			@RequestParam(defaultValue="1")Integer page,
			@RequestParam(defaultValue="60")Integer rows) {
		//查询条件不能为空
		if (StringUtils.isBlank(queryString)) {
			return TaotaoResult.build(400, "查询条件不能为空");
		}
		SearchResult searchResult = null;
		try {
			queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
			searchResult = searchService.search(queryString, page, rows);
		} catch (Exception e) {
			e.printStackTrace();
			return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
		}
		return TaotaoResult.ok(searchResult);

	}
	}

  

@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_keywords");
	//设置高亮显示
	query.setHighlight(true);

	query.addHighlightField("item_title");
	query.setHighlightSimplePre("<em style=\"color:red\">");
	query.setHighlightSimplePost("</em>");
//执行查询
	SearchResult searchResult = searchDao.search(query);
	//根据结果来计算商品总共多少页
	long recordCount=searchResult.getRecordCount();
	long pageCount=recordCount/rows;
	if (recordCount % rows > 0) {
		pageCount++;
	}
	searchResult.setPageCount(pageCount);
	searchResult.setCurPage((long) page);

		return searchResult;
	}

}

 客户端通过输入商品来实现搜索功能:

controller层:

@Controller

public class SearchController {
	@Autowired
	private SearchService searchService;

	@RequestMapping("/search")
	public String search(@RequestParam("q")String queryString, @RequestParam(defaultValue="1")Integer page, Model model) {
		if (queryString != null) {
			try {
				queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		SearchResult searchResult = searchService.search(queryString, page);
		//向页面传递参数
		model.addAttribute("query", queryString);
		//model.addAttribute("totalPages", searchResult.getPageCount());
		model.addAttribute("itemList", searchResult.getItemList());
		model.addAttribute("page", page);

		return "search";

	}
}

  service层:

@Service
public class SearchServiceImpl implements SearchService {

   @Value("${SEARCH_BASE_URL}")
   private String SEARCH_BASE_URL;

	@Override
	public SearchResult search(String queryString, int page) {
		//这里需要的是连接+参数.这里每页显示的记录条数,可以传递也可以不用传递
		// 调用taotao-search的服务
		//查询参数
		Map<String, String> param = new HashMap<>();
		param.put("q", queryString);
		param.put("page", page + "");
		try {
			//调用服务
			String json = HttpClientUtil.doGet(SEARCH_BASE_URL, param);
			//把字符串转换成java对象
			TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, SearchResult.class);
			SearchResult result = (SearchResult) taotaoResult.getData();
			return result;
		/*	if (taotaoResult.getStatus() == 200) {

			}*/

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

}

  

 

 

时间: 2024-10-10 16:42:25

利用solr实现商品的搜索功能的相关文章

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)

https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第五天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第六天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)[第七天](redis缓存) 第04

阶段一-02.分类,推荐,搜索,评价,购物车开发-第2章 商品推荐+搜索功能实现-2-1 商品推荐 - 需求分析与sql查询

下面关于新商品一些商家的推荐. 下面这些没一个都是一个分类,滚动条向上滚动,下面的一个个分类数据都展示出来.判断页面的滚动,实现懒加载. 滚动条触底后,会把下一个要展示的商品分类懒加载. 前端的代码 scroll的滚动的监听, index就是我们的vue的对象.在页面的最上方定义的 首先获取当前的分类的list catIndex html内容的渲染.rootCat就是一个json对象. 右侧包含最新的6个商品 后端 多表关联查询,一个是分类表,一个是商品表. 商品表的表结构. cat_id:子分

利用Solr服务建立的界面化站内搜索---solr2

继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大…… 简陋的信息显示环境最起码给了我一个信号,这条路没有走错,好吧,让我们来继续探索搜索引擎的奥秘吧. 上期回顾:上次主要是介绍了solrj,通过solrj的api与solr服务器进行通信,获取服务器上的索引数据以及在编写程序中遇到的一些问题和解决方法.本期主要是建立与solr服务器的通信,提供搜索界面输入关键字或搜索规则,根

JAVAEE——宜立方商城07:Linux上搭建Solr服务、数据库导入索引库、搜索功能的实现

1. 学习计划 1.Solr服务搭建 2.Solrj使用测试 3.把数据库中的数据导入索引库 4.搜索功能的实现 2. Solr服务搭建 2.1. Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 2.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压solr. 第三步:安装Tomcat,解压缩即可. 第四步:把solr部署到Tomcat下. 第五步:解压缩war包.启动Tomcat解压. tail -f ../

利用Solr服务建立的站内搜索雏形---solr1

最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下,然后在solr的管理界面中选择query,比如在q选项框中将“*:*”改写为“title:安徽”,则在管理界面中就能看到搜索结果,可是这个与搜索引擎的感觉差远了,总感觉这些结果是被solr给套在他的管理界面中了,于是自己在网上搜索,也想整个站内搜索一样的东西,就算整不到那么炫,只要整到在solr的管

在ssh中利用Solr服务建立的界面化站内搜索

继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大-- 简陋的信息显示环境最起码给了我一个信号,这条路没有走错,好吧,让我们来继续探索搜索引擎的奥秘吧. 上期回顾:上次主要是介绍了solrj,通过solrj的api与solr服务器进行通信,获取服务器上的索引数据以及在编写程序中遇到的一些问题和解决方法.本期主要是建立与solr服务器的通信,提供搜索界面输入关键字或搜索规则,根

C#下利用正则表达式实现字符串搜索功能的方法(转)

关键字:正则表达式.元字符.字符串.匹配: 1.正则表达式简介:正则表达式提供了功能强大.灵活而又高效的方法来处:.NET框架正则表达式并入了其他正则表达式实现的: 2.字符串搜索:正则表达式语言由两种基本字符类型组成:原义(正常:一般表达式语言是一种可以编写搜索表达式的语言: 3..NET框架的正则表达式类:下面通过介绍.NET框架的正则表达式类,熟悉一下: 1.正则表达式简介 正则表达式提供了功能强大.灵活而又高效的方法来处理文本.正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到

利用SOLR搭建企业搜索平台 之——MultiCore

Solr Multicore 是 solr 1.3 的新特性.其目是一个solr实例,可以有多个搜索应用. 下面着手来将solr给出的一个example跑出来.这篇文章是基于<利用SOLR搭建企业搜索平台 之——运行solr>,有不明白的请参见http://lianj-lee.javaeye.com/blog/424383 1. 找到solr下载包中的example文件夹,在它的下面有个multicore文件夹,将这个文件夹下面的所有东西copy到 c:/solr-tomcat/solr下面.

利用SOLR搭建企业搜索平台 之——模式配置Schema.xml

来源:http://blog.csdn.net/awj3584/article/details/16963525 schema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件.打开这个配置文件,你会发现有详细的注释.模式组织主要分为三个重要配置 1. types 部分 是一些常见的可重用定义,定义了 Solr(和 Lucene)如何处理 Field.也就是添加到索引中的xml文件属