淘淘商城第八天笔记.docx

上传人:b****5 文档编号:8025971 上传时间:2023-01-28 格式:DOCX 页数:18 大小:637.69KB
下载 相关 举报
淘淘商城第八天笔记.docx_第1页
第1页 / 共18页
淘淘商城第八天笔记.docx_第2页
第2页 / 共18页
淘淘商城第八天笔记.docx_第3页
第3页 / 共18页
淘淘商城第八天笔记.docx_第4页
第4页 / 共18页
淘淘商城第八天笔记.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

淘淘商城第八天笔记.docx

《淘淘商城第八天笔记.docx》由会员分享,可在线阅读,更多相关《淘淘商城第八天笔记.docx(18页珍藏版)》请在冰豆网上搜索。

淘淘商城第八天笔记.docx

淘淘商城第八天笔记

淘淘商城第八天

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传递给服务,服务进行索引库的内容同步。

作业!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1