国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 利用solr實現商品的搜索功能(實例講解)

利用solr實現商品的搜索功能(實例講解)

2021-02-22 11:42小蝦米的java夢 Java教程

下面小編就為大家分享一篇利用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的字段。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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
package com.taotao.search.mapper;
 
import java.util.list;
 
import com.taotao.search.pojo.item;
 
public interface itemmapper {
 list<item> getitemlist();
 
}

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>

利用solr實現商品的搜索功能(實例講解)

第四步:從索引庫查詢的邏輯編寫:

?
  • <noscript id="cis60"></noscript>
  • <menu id="cis60"><object id="cis60"></object></menu><sup id="cis60"><tr id="cis60"></tr></sup>
      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 height="345" src="/uploads/allimg/210222/1143313629-1.jpg" width="764" />

      請求的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
      27
      28
      @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實現商品的搜索功能(實例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

      原文鏈接:https://www.cnblogs.com/fengli9998/p/6475970.html

      延伸 · 閱讀

      精彩推薦
      主站蜘蛛池模板: 欧美黄色www | 亚洲一区二区免费看 | 日韩精品在线观看免费 | 日韩在线永久免费播放 | 激情久久久 | 黄频免费在线观看 | 黄色影片免费在线观看 | 亚洲精品一 | 久久精品国产久精国产 | 自拍在线| 欧美日韩一区二区三区 | 亚洲a网 | 日韩在线观看中文字幕 | 欧美日韩中文在线 | 色先锋影院 | 亚洲成av人影片在线观看 | 久久久久久免费看 | 日韩和的一区二在线 | 欧美日韩一区二区视频在线观看 | 久久99久久99精品免观看粉嫩 | 欧美成人一区二区三区 | 91精品国产乱码久 | 精品久久久久一区二区国产 | 亚洲午夜激情 | 午夜精品一区二区三区在线观看 | 久久噜噜噜精品国产亚洲综合 | 亚洲天堂影院 | 人人干视频 | 一级特黄bbbbb免费观看 | 国产目拍亚洲精品99久久精品 | 久久免费精品 | 亚洲精品乱码久久久久久久 | 国产亚洲一区二区三区 | 一级片av | 日韩a电影 | 美女一区二区三区 | 国产黄色成人 | 国产成人精品一区二区三区视频 | 国产中文字幕一区 | 日韩在线永久免费播放 | 黄色网毛片 |