淘淘商城第八天笔记.docx
《淘淘商城第八天笔记.docx》由会员分享,可在线阅读,更多相关《淘淘商城第八天笔记.docx(18页珍藏版)》请在冰豆网上搜索。
![淘淘商城第八天笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/27/a5027c0f-28b0-474c-a443-990331986b44/a5027c0f-28b0-474c-a443-990331986b441.gif)
淘淘商城第八天笔记
淘淘商城第八天
1第七天内容回顾
1、向业务逻辑中添加缓存
a)Redis做缓存工具
b)添加缓存不能影响正常的业务逻辑
c)查询流程:
i.从缓存中取内容,如果有直接返回
ii.如果没有查询数据库
iii.把查询结果添加到缓存。
d)缓存同步的问题:
i.发布服务
ii.后台系统中修改内容信息后,调用服务,清空缓存。
2、搜索系统的搭建。
3、使用solr实现搜索。
a)Linux系统下安装solr
b)安装中文分析器及添加业务域。
c)把数据库数据导入到索引库中。
2课程计划
1、搜索系统的实现
a)发布搜索的服务
b)Portal系统中调用搜索服务实现搜索功能。
2、Solr集群搭建
3搜索系统的实现
3.1搜索服务发布
调用服务传递过来一个查询条件,根据查询条件进行查询。
返回查询结果。
参数中包括分页条件。
参数:
StringqueryString
Intpage
Introws
返回结果:
返回json数据。
包含查询结果的列表。
使用商品的pojo来描述。
SearchItem
包含查询结果总记录数。
包含查询结果的总页数。
包含当前页码。
包含查询的状态。
包含错误信息。
创建一个SearchResult
包含四个属性:
1、商品列表
2、查询结果总记录数
3、查询结果的总页数
4、当前页码
publicclassSearchResult{
privateListitemList;
privateLongrecordCount;
privateintpageCount;
privateintcurPage;
}
使用TaotaoResult包装一个SearchResult返回结果。
3.1.1Dao层
根据查询条件进行查询,返回查询结果。
参数:
SolrQuery对象
返回结果:
1、查询结果的商品列表
2、查询结果的总记录数
返回SearchResult
@Repository
publicclassSearchDaoImplimplementsSearchDao{
@Autowired
privateSolrServersolrServer;
@Override
publicSearchResultsearch(SolrQueryquery)throwsException{
//执行查询
QueryResponseresponse=solrServer.query(query);
//取查询结果列表
SolrDocumentListsolrDocumentList=response.getResults();
ListitemList=newArrayList<>();
for(SolrDocumentsolrDocument:
solrDocumentList){
//创建一个SearchItem对象
SearchItemitem=newSearchItem();
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>>highlighting=response.getHighlighting();
Listlist=highlighting.get(solrDocument.get("id")).get("item_title");
StringitemTitle="";
if(list!
=null&&list.size()>0){
//取高亮后的结果
itemTitle=list.get(0);
}else{
itemTitle=(String)solrDocument.get("item_title");
}
item.setTitle(itemTitle);
//添加到列表
itemList.add(item);
}
SearchResultresult=newSearchResult();
result.setItemList(itemList);
//查询结果总数量
result.setRecordCount(solrDocumentList.getNumFound());
returnresult;
}
}
3.1.2Service层
1、接收查询条件、分页条件。
2、创建SolrQuery对象,设置查询条件、分页条件。
3、调用dao进行搜索
4、计算总页数,把总页数设置到SearchResult对象中,设置当前页属性。
5、返回SearchResult
参数:
1、查询条件
2、Page
3、Rows
返回结果:
SearchResult
@Service
publicclassSearchServiceImplimplementsSearchService{
@Autowired
privateSearchDaosearchDao;
@Override
publicSearchResultsearch(StringqueryString,intpage,introws)throwsException{
//创建查询条件
SolrQueryquery=newSolrQuery();
//设置查询条件
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("");
query.setHighlightSimplePost("");
//执行查询
SearchResultsearchResult=searchDao.search(query);
//计算总页数
LongrecordCount=searchResult.getRecordCount();
intpageCount=(int)(recordCount/rows);
if(recordCount%rows>0){
pageCount++;
}
searchResult.setPageCount(pageCount);
searchResult.setCurPage(page);
returnsearchResult;
}
}
3.1.3Controller层
发布服务。
搜索服务的url:
/search/q?
keyword=xxx&page=1&rows=30
参数keyword、page、rows
返回结果:
json数据,使用TaotaoResult包装SearchResult。
@Controller
publicclassSearchController{
@Autowired
privateSearchServicesearchService;
@RequestMapping("/q")
@ResponseBody
publicTaotaoResultsearch(@RequestParam(defaultValue="")Stringkeyword,
@RequestParam(defaultValue="1")Integerpage,
@RequestParam(defaultValue="30")Integerrows){
try{
//转换字符集
keyword=newString(keyword.getBytes("iso8859-1"),"utf-8");
SearchResultsearchResult=searchService.search(keyword,page,rows);
returnTaotaoResult.ok(searchResult);
}catch(Exceptione){
e.printStackTrace();
returnTaotaoResult.build(500,ExceptionUtil.getStackTrace(e));
}
}
}
3.2在portal中实现搜索
3.2.1分析
调用taotao-search发布的服务,实现搜索。
使用HttpClient调用服务。
返回json数据。
需要把json转换成java对象。
把java对象传递给页面。
请求的url:
http:
//localhost:
8082/search.html
参数:
q:
查询条件
返回结果:
jsp页面(search.jsp)
Search.jsp分析:
数据:
Query:
查询条件
totalPages:
总页数
itemList:
商品列表(每个元素可以是SearchItem)
Page:
当前页
3.2.2Service层
参数:
查询条件、page、rows。
根据查询调用taotao-search发布的服务,查询商品列表。
得到json数据,需要把json转换成java对象,返回SearchResult。
@Service
publicclassSearchServiceImplimplementsSearchService{
@Value("${SEARCH_BASE_URL}")
privateStringSEARCH_BASE_URL;
@Override
publicSearchResultsearch(Stringkeyword,intpage,introws){
//调用服务查询商品列表
Mapparam=newHashMap<>();
param.put("keyword",keyword);
param.put("page",page+"");
param.put("rows",rows+"");
//调用服务
Stringjson=HttpClientUtil.doGet("SEARCH_BASE_URL",param);
//转换成java对象
TaotaoResulttaotaoResult=TaotaoResult.formatToPojo(json,SearchResult.class);
//取返回的结果
SearchResultsearchResult=(SearchResult)taotaoResult.getData();
returnsearchResult;
}
}
3.2.3Controller
接收三个参数:
查询条件、page、rows
调用服务查询商品列表。
把商品列表传递给jsp、参数回显。
返回逻辑视图(search.jsp)
请求的url:
/search
@Controller
publicclassSearchController{
@Autowired
privateSearchServicesearchService;
@RequestMapping("/search")
publicStringsearch(@RequestParam("q")Stringkeyword,
@RequestParam(defaultValue="1")Integerpage,
@RequestParam(defaultValue="60")Integerrows,Modelmodel){
//get乱码处理
try{
keyword=newString(keyword.getBytes("iso8859-1"),"utf-8");
}catch(UnsupportedEncodingExceptione){
keyword="";
e.printStackTrace();
}
SearchResultsearchResult=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";
}
}
解决图片显示不出来的问题:
修改ItemSearch:
4Solr集群
4.1Solr集群的架构
SolrCloud
需要用到solr+zookeeper
要完成的集群结构
4.2Zookeeper
1、集群管理
主从的管理、负载均衡、高可用的管理。
集群的入口。
Zookeeper必须是集群才能保证高可用。
Zookeeper有选举和投票的机制。
集群中至少应该有三个节点。
2、配置文件的集中管理
搭建solr集群时,需要把Solr的配置文件上传zookeeper,让zookeeper统一管理。
每个节点都到zookeeper上取配置文件。
3、分布式锁
4、忘了
4.3集群需要的服务器
Zookeeper:
3台
Solr:
4台
伪分布式,zookeeper三个实例、tomcat(solr)需要四个实例。
Zookeeper需要安装jdk。
4.4集群搭建步骤
第一部分:
Zookeeper集群搭建
第一步:
需要把zookeeper的安装包上传到服务器。
第二步:
把zookeeper解压。
第三步:
把zookeeper向/usr/local/solr-cloud目录下复制三份。
第三步:
配置zookeeper。
1、在zookeeper01目录下创建一个data文件夹。
2、在data目录下创建一个myid的文件
3、Myid的内容为1(02对应“2”,03对应“3”)
4、Zookeeper02、03以此类推。
5、进入conf文件,把zoo_sample.cfg文件改名为zoo.cfg
6、修改zoo.cfg,把dataDir=属性指定为刚创建的data文件夹。
7、修改zoo.cfg,把clientPort指定为不冲突的端口号(01:
2181、02:
2182、03:
2183)
8、在zoo.cfg中添加如下内容:
server.1=192.168.25.154:
2881:
3881
server.2=192.168.25.154:
2882:
3882
server.3=192.168.25.154:
2883:
3883
第四步:
启动zookeeper。
Zookeeper的目录下有一个bin目录。
使用zkServer.sh启动zookeeper服务。
启动:
./zkServer.shstart
关闭:
./zkServer.shstop
查看服务状态:
./zkServer.shstatus
第二部分:
搭建solr集群
第一步:
安装四个tomcat,修改其端口号不能冲突。
8080~8083
第二步:
向tomcat下部署solr。
把单机版的solr工程复制到tomcat下即可。
第三步:
为每个solr实例创建一solrhome。
第四步:
为每个solr实例关联对应的solrhome。
修改web.xml
第五步:
修改每个solrhome下的solr.xml文件。
修改host、hostPort两个属性。
分别是对应的ip及端口号。
第六步:
把配置文件上传到zookeeper。
需要使用
/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh命令上传配置文件。
把/usr/local/solr-cloud/solrhome01/collection1/conf目录上传到zookeeper。
需要zookeeper集群已经启动。
./zkcli.sh-zkhost192.168.25.154:
2181,192.168.25.154:
2182,192.168.25.154:
2183-cmdupconfig-confdir/usr/local/solr-cloud/solrhome01/collection1/conf-confnamemyconf
第七步:
查看是否上传成功。
使用zookeeper的zkCli.sh命令。
第八步:
告诉solr实例zookeeper的位置。
需要修改tomcat的catalina.sh添加
JAVA_OPTS="-DzkHost=192.168.25.154:
2181,192.168.25.154:
2182,192.168.25.154:
2183"
每个节点都需要添加。
第九步:
启动每个solr实例。
第十步:
集群分片。
将集群分为两片,每片两个副本。
http:
//192.168.25.154:
8080/solr/admin/collections?
action=CREATE&name=collection2&numShards=2&replicationFactor=2
第十一步:
删除不用collection1
http:
//192.168.25.154:
8080/solr/admin/collections?
action=DELETE&name=collection1
4.5使用solrJ连接集群
@Test
publicvoidtestSolrClout()throwsException{
//创建一个SolrServer对象
CloudSolrServersolrServer=newCloudSolrServer("192.168.25.154:
2181,192.168.25.154:
2182,192.168.25.154:
2183");
//设置默认的collection
solrServer.setDefaultCollection("collection2");
//创建一个文档对象
SolrInputDocumentdocument=newSolrInputDocument();
document.addField("id","test01");
document.addField("item_title","title1");
//添加文档
solrServer.add(document);
//提交
solrSmit();
}
4.6项目切换到集群
只需要在spring容器中配置一个集群版的SolrServer对象即可。
5商品同步
修改商品信息后,需要把商品信息同步到索引库。
需要search工程发布服务,在后台系统如果商品信息发生修改后,可以在后台系统的Controller中调用发布的服务。
把商品id传递给服务,服务进行索引库的内容同步。
作业!
!