我们为什么要用solr呢?
1、solr已经将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品)
2、solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载
3、solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制
4、solr支持分布式集群,索引服务的容量和能力可以线性扩展
solr的工作机制是什么呢?
1、solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能
2、业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
为什么要用solr服务,为什么要用luncence?
问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢?
答案就是全文检索工具的实现,luncence采用了词元匹配和切分词。举个例子:北京天安门------luncence切分词:北京 京天 天安 安门 等等这些分词。所以我们搜索的时候都可以检索到。
有一种分词器就是IKAnalyzer中文分词器,它有细粒度切分和智能切分,即根据某种智能算法。
这就使用solr的最大的好处:检索功能的实现。
使用步骤;
(1)solr服务器搭建,因为solr是用java5开发的,所以需要jdk和tomcat。搭建部署
(2)搭建完成后,我们需要将要展示的字段引入solr的库中。配置spring与solr结合,工程启动的时候启动solr
(3)将数据库中的查询内容导入到solr索引库,这里使用的是solrj的客户端实现的。具体使用可以参考api
(4)建立搜索服务,供客户端调用。调用solr,查询内容,这中间有分页功能的实现。solr高亮显示的实现。
(5)客户端接收页面的请求参数,调用搜索服务,进行搜索。
业务字段判断标准:
1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述
(这些相当于将标签给了solr,导入商品数据后,solr对这些字段的对应的商品的具体内容进行分词切分,然后,我们就可以搜索到相关内容了)
2、后续的业务是否需要用到此字段。例如:商品id。
需要用到的字段:
1、商品id
2、商品title
3、卖点
4、价格
5、商品图片
6、商品分类名称
7、商品描述
Solr中的业务字段:
1、id——》商品id
其他的对应字段创建solr的字段。
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
|
重新启动tomcat
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。有效降低频繁访问数据库对数据库造成的压力。
第一步:将solr部署在linux系统下。
第二步:solrJ是solr的客户端,使用它需要依赖solrJ的jar包。
第三步:将数据库的内容添加到solr的索引库,这样查询就在索引库查询,而不是数据库了。
controller层:
1
2
3
4
5
6
7
8
9
10
11
12
|
@Controller
@RequestMapping ( "/manager" )
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping ( "/importall" )
@ResponseBody
public TaotaoResult importAllItem(){
TaotaoResult result= itemService.importAllItem();
return result;
}
}<br>service层编写:<br>多表查询商品,显示在页面的逻辑编写:<br>mapper.java
|
1
2
3
4
5
6
7
8
9
10
11
|
package com.taotao.search.mapper;
import java.util.List;
import com.taotao.search.pojo.Item;
public interface ItemMapper {
List<item> getItemList();
}
</item>
|
mapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?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>
|
第四步:从索引库查询的逻辑编写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
//从索引库里面获取商品信息,现在这个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
用来装显示的内容列表:
1
2
3
4
5
6
7
8
9
10
|
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层:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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);
}
}<br><br><br>
|
1
|
<span style= "font-size: 16px" >service层:利用solrJ的solrQurery来查询:</span>
|
前提是要写好如何从索引库读取数据:
下面是服务的接口层编写:
controller:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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层:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@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 ;
}
}
}
|
为什么要用solr服务,为什么要用luncence?
问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢?
答案就是全文检索工具的实现,luncence采用了词元匹配和切分词。举个例子:北京天安门------luncence切分词:北京 京天 天安 安门 等等这些分词。所以我们搜索的时候都可以检索到。
有一种分词器就是IKAnalyzer中文分词器,它有细粒度切分和智能切分,即根据某种智能算法。
这就使用solr的最大的好处:检索功能的实现。
使用步骤;
(1)solr服务器搭建,因为solr是用java5开发的,所以需要jdk和tomcat。搭建部署
(2)搭建完成后,我们需要将要展示的字段引入solr的库中。配置spring与solr结合,工程启动的时候启动solr
(3)将数据库中的查询内容导入到solr索引库,这里使用的是solrj的客户端实现的。具体使用可以参考api
(4)建立搜索服务,供客户端调用。调用solr,查询内容,这中间有分页功能的实现。solr高亮显示的实现。
(5)客户端接收页面的请求参数,调用搜索服务,进行搜索。
业务字段判断标准:
1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述
(这些相当于将标签给了solr,导入商品数据后,solr对这些字段的对应的商品的具体内容进行分词切分,然后,我们就可以搜索到相关内容了)
2、后续的业务是否需要用到此字段。例如:商品id。
需要用到的字段:
1、商品id
2、商品title
3、卖点
4、价格
5、商品图片
6、商品分类名称
7、商品描述
Solr中的业务字段:
1、id——》商品id
其他的对应字段创建solr的字段。
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
|
重新启动tomcat
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。有效降低频繁访问数据库对数据库造成的压力。
第一步:将solr部署在linux系统下。
第二步:solrJ是solr的客户端,使用它需要依赖solrJ的jar包。
第三步:将数据库的内容添加到solr的索引库,这样查询就在索引库查询,而不是数据库了。
controller层:
1
2
3
4
5
6
7
8
9
10
11
12
|
@Controller
@RequestMapping ( "/manager" )
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping ( "/importall" )
@ResponseBody
public TaotaoResult importAllItem(){
TaotaoResult result= itemService.importAllItem();
return result;
}
}<br>service层编写:<br>多表查询商品,显示在页面的逻辑编写:<br>mapper.java
|
1
2
3
4
5
6
7
8
9
10
11
|
package com.taotao.search.mapper;
import java.util.List;
import com.taotao.search.pojo.Item;
public interface ItemMapper {
List<item> getItemList();
}
</item>
|
mapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?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>
|
第四步:从索引库查询的逻辑编写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
//从索引库里面获取商品信息,现在这个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
用来装显示的内容列表:
1
2
3
4
5
6
7
8
9
10
|
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层:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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);
}
}<br><br><br>
|
1
|
<span style= "font-size: 16px" >service层:利用solrJ的solrQurery来查询:</span>
|
前提是要写好如何从索引库读取数据:
下面是服务的接口层编写:
controller:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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层:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@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 ;
}
}
}
|
- 开源搜素引擎:Lucene、Solr、Elasticsearch、Sphinx优劣势比较
https://blog.csdn.net/belalds/article/details/82667692 开源搜索引擎分类 1.Lucene系搜索引擎,java开发,包括: Lucene Solr ...
- 全文索引-lucene,solr,nutch,hadoop之nutch与hadoop
全文索引-lucene.solr.nutch,hadoop之lucene 全文索引-lucene.solr,nutch,hadoop之solr 我在去年的时候,就想把lucene,solr.nutch ...
- 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析
使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...
- 谈谈Lucene和Solr索引存目录
在Lucene中,有几种索引存放模式呢?用过的人可能记得SimpleFSDirectory.MMapDirectory.NIOFSDirectory.RAMDirectory这四种.新版本的通过FSD ...
- 开源搜索技术—Lucene、Solr
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引 ...
- lucene和solr的区别(六)
Lucene是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene的 ...
- Lucene与Solr基础
SolrSelectTest 查询与删除 package com.snow.solr; import com.snow.bean.Product; import org.apache.solr.cli ...
- 在Lucene或Solr中实现高亮的策略
一:功能背景 近期要做个高亮的搜索需求,曾经也搞过.所以没啥难度.仅仅只是原来用的是Lucene,如今要换成Solr而已,在Lucene4.x的时候,散仙在曾经的文章中也分析过怎样在搜索的时候实现高亮 ...
- lucene、solr、nutch三者的关系
lucene是一个做搜索用的类库. nutch和solr都是基于lucene的,二者都是可直接运行的应用程序: 直接在业务上使用lucene的倒是不太多见. solr主要提供了建立索引(用户可以直接p ...
随机推荐
- nginx 转发 由于php语法错误 导致的 50x
server { listen 8008; root /root/php-test; index index.php index.html index.htm ...
- Struts2常用标签总结
Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...
- 【WCF安全】SOAP消息实现用户名验证:通过OperationContext直接添加/访问MessageHeader信息
服务代码 1.契约 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Se ...
- 【转载】对一致性Hash算法,Java代码实现的深入研究
原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细 ...
- 【java规则引擎】规则引擎RuleBase中利用观察者模式
(1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变.(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想.可以利用观察者模式实现 ...
- UART驱动分析
在linux用户层上要操作底层串口需要对/dev/ttySxxx操作,这里的ttySx指实际的终端串口. 以下以全志A64为实例,分析UART驱动以及浅谈TTY架构. linux-3.10/drive ...
- Notepad++如何取消打开最近的历史文件
1.设置 2.首选项 3.备份 4.取消勾选 "Remember current session for next launch" 5.重新启动即可. 出处:http://www. ...
- ArcGIS破解配置及oracle文件配置
1.破解配置 2.oracle文件配置
- 洛谷 1291 [SHOI2002]百事世界杯之旅
题目:https://www.luogu.org/problemnew/show/P1291 大水题!套路!模板! 稍微注意一下输出就行了. #include<iostream> #inc ...
- android资源目录---assets与res/raw区别
android资源目录---assets与res/raw的不同 Android 2011-05-24 14:40:21 阅读20 评论0 字号:大中小 订阅 assets:用于存放需要打包到应用程 ...