经过前面几节的学习,我们把搜索相关代码写完了,这节我们一起测试下搜索功能。
首先我们要保证zookeeper、redis、image、solr服务都开启。
接着,我们把taotao-common工程重新打包到本地maven仓库,然后把taotao-search工程也打包到本地maven仓库。
下面我们依次启动taotao-manager、taotao-content、taotao-search三个服务,然后启动taotao-manager-web、taotao-portal-web、taotao-search-web三个系统。
启动完之后,我们到淘淘商城首页,如下图所示,我们在搜索框中输入"手机"并按回车进行搜索。
搜索结果如下图,可以看到,搜索结果乱码了。
那么,我们怎么解决乱码问题呢?我们可以直接在Controller当中解决,如下图所示。工程默认的编码是"iso8859-1",现在需要把它修改为"utf-8"。
修改完之后,我们重启taotao-search-web工程,然后我们再在淘淘商城首页的搜索框中输入"手机"然后回车进行查询,便可以看到如下图所示界面,可以看到搜索出结果了,只是由于数据库中存储的图片地址都是测试数据,是无法访问的,因此都没有图片。
我们可以在淘淘商城后台添加一个关于手机的商品,如下图所示,输入完商品信息后点击"提交"。
我们到数据库最后一页,可以看到我们刚才添加的手机信息,如下图所示。
我们到搜索工程,在搜索框中输入"小米"然后回车即可搜索小米的商品,如下图所示,可以看到并没有我们刚才添加的手机,这是什么原因呢?其实很简单,是因为我们刚才添加的商品并没有在索引库中,因此我们需要把数据库中的商品与索引库重新同步一下。
我们到淘淘商城后台进行同步数据库数据到索引库,如下图所示。点击"导入数据到索引库。由于数据量较大,导入需要几十秒的时间。
导入成功后,我们再到搜索工程进行搜索,发现这时成功搜索出该手机了!
但是到这里依然会有个问题,我们在后台添加商品的时候可以指定多张图片,我们试下多张图片的情况下,还能不能正常搜索出带图片的手机。如下图所示,我们添加一款金立手机并上传了三张图片。
添加完金立M2017手机之后,我们还需要重新将数据库中的数据与索引库进行同步,这里就不啰嗦怎么操作了。同步之后,我们在搜索工程输入"金立M2017"然后回车进行搜索,发现搜索到了结果但是图片无法正常显示。如下图所示。
这是什么原因造成的呢?其实也很简单,我们看下数据库中存储的数据格式,我们刚添加的手机image字段存储的信息如下所示,可以看到是三张图片地址中间以","分隔拼成的字符串,这样的字符串在页面是无法正常显示的,我们需要把图片进行拆分,显示其中的一张才行。
http://192.168.156.13:8888/group1/M00/00/00/wKicDVkHzTiAVCl3AADZzN2RODM244.jpg,http://192.168.156.13:8888/group1/M00/00/00/wKicDVkHzTiAVZaFAABmf6hpOQM129.jpg,http://192.168.156.13:8888/group1/M00/00/00/wKicDVkHzTiAMvRzAAADTv6ZwbQ551.jpg
我们到SearchDaoImpl当中进行处理,如下图所示。
修改后的SearchDaoImpl.java类的代码如下
package com.taotao.search.dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
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 com.taotao.common.pojo.SearchItem;
import com.taotao.common.pojo.SearchResult;
import com.taotao.search.dao.SearchDao;
@Repository
public class SearchDaoImpl implements SearchDao{
@Autowired
private SolrServer solrServer;
@Override
public SearchResult search(SolrQuery query) throws Exception {
//根据query对象进行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
//取查询结果总记录数
long numFound = solrDocumentList.getNumFound();
//初始化一个SolrResult对象并把总数属性进行赋值
SearchResult searchResult = new SearchResult();
searchResult.setTotalNumber(numFound);
List<SearchItem> itemList = new ArrayList<>();
//把查询结果封装到SearchItem当中
for (SolrDocument solrDocument : solrDocumentList) {
SearchItem searchItem = new SearchItem();
searchItem.setId((String)solrDocument.get("id"));
String image = (String)solrDocument.get("item_image");
if(!StringUtils.isBlank(image)){
image = image.split(",")[0];
}
searchItem.setImage(image);
searchItem.setItem_category_name((String)solrDocument.get("item_category_name"));
searchItem.setItem_desc((String)solrDocument.get("item_desc"));
searchItem.setPrice((long)solrDocument.get("item_price"));
searchItem.setSell_point((String)solrDocument.get("item_sell_point"));
//取高亮显示
Map<String,Map<String,List<String>>> highlighting = response.getHighlighting();
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");
}
searchItem.setTitle(title);
itemList.add(searchItem);
}
//把结果添加到SearchResult当中
searchResult.setItemList(itemList);
//返回
return searchResult;
}
}
修改了taotao-search-service,我们便要重启taotao-search工程,重启之后,我们重新搜索"金立M2017"便可以看到图片了,如下图所示。
下面还有功能没有完善,那就是下一页、上一页,当我们点击上图的下一页时,会看到如下图所示界面,说明请求就不正确,因为它默认访问的端口是8082,而我们的搜索工程的端口是8085,因此我们需要找到控制下一页、上一页功能的js并做下修改。
我们在search.jsp页面当中可以看到引用了脚本search_main.js,这个js就控制了我们的上一页、下一页的操作。
我们打开search_main.js文件,在文件中搜索8082,只有一处,我们把8082,修改为8085,如下图所示。
下面我们到搜索工程再点击"下一页",会看到如下图所示界面,发现已经正常到第2页了,说明上一页、下一页功能也正常了!我们的搜索完成了!!!