我们为什么要用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 ...
		 
		
	
随机推荐
	
									- PS基础教程[2]渐变工具的使用
			
PS中的渐变是一个很实用的工具,很多时候都会用到,我们在网页上看到的各种各样的颜色几乎都是一种渐变色,很少有一种颜色一层不变的.那么渐变如何使用呢?本次我们来介绍一下渐变的基本使用方法. 使用方法 1 ...
			 
						- zTree返回的菜单列表中根据权限打勾
			
需求:管理员登录后台后可以为角色添加菜单,同时要能看到该角色已经拥有的菜单. 想法一:刚开始写的时候很迷茫,因为我们有可能会为该角色增加别的菜单,所以不能只加载该角色已经拥有的菜单,只加载该角色的菜单 ...
			 
						- 1.1对java web开发的一点理解
			
前言 Q:通常行内人士见面会问你,你做哪方面开发的? A:java web开发的 那么,什么是java web开发? java web开发通常是指java web应用程序的开发.一个B/S架构的 we ...
			 
						- unity drawcall测试
			
unity引擎影响drawcall的元素(使用Quad和Cube对比测试) 1.相机的background(没有渲染元素区域的颜色),4Verts.2Tris.1SetPass calls:      ...
			 
						- Oracle事务的隔离
			
事务是指一些列操作的集合,它有4个属性:原子性(Automacity).一致性(Consistency).隔离性(Isolation)和持久性(Durability),这4个属性简称为ACID.原子性 ...
			 
						- nagios(centreon)监控lvs
			
客户端配置:让nagios账户有权限查看ipvsadminvim /etc/sudoers[root@SSAVL2318 etc]# visodu /etc/sudoers加入 nagios  ALL ...
			 
						- 有关implicit Intent的使用
			
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("geo:20.000,50.000&quo ...
			 
						- 解决VS2008 调试启动特别慢
			
Resolving Very Slow Symbol Loading with VS 2008 during debugging Recently, I was encountering insane ...
			 
						- HDFS之五:Hadoop 拒绝远程 9000 端口访问
			
    最近学习Hadoop 时发现在本机访问 hadoop 9000 端口没有问题,但是远程机器访问 9000端口时不能访问,通过telnet 命令诊断发现发现无法访问端口,经过网上搜索解决方案结合 ...
			 
						- Java-Maven-Runoob:Maven 构建 & 项目测试
			
ylbtech-Java-Maven-Runoob:Maven 构建 & 项目测试 1.返回顶部 1. Maven 构建 & 项目测试 在上一章节中我们学会了如何使用 Maven 创建 ...