sorl實現商品快速搜索

Solr概述

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的配置和運行狀況。mysql

Docker安裝Solr服務

拉取 Solr 鏡像:docker pull solr:7.4.0git

啓動 Solr 容器docker run --name taotao-solr -d -p 8983:8983 -t solr:7.4.0github

訪問 http://114.115.215.xxx:8983/ web

Solr界面功能
clipboard.pngspring

新建core

docker exec -it --user=solr mysolr bin/solr create_core -c shop

安裝中文分詞器、並設置業務系統Field

分詞器安裝參考文章:https://github.com/ik-analyzersql

文件傳輸傳輸參考:Docker容器和本機之間的文件傳輸docker

傳jar包和配置文件

wget方式把jar包下載到根目錄:數據庫

wget https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.0/ik-analyzer-7.7.0.jar

找到容器長ID:docker inspect my-solr | grep Idapache

將jar包放入Solr服務的webapp/WEB-INF/lib/目錄下json

docker cp /root/ik-analyzer-7.6.0.jar 9d7cf2c5315e405e7a8cadc40dcef93fd893f39f0cf70ad42c3b1b70729d2423:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib

將resources目錄下的5個配置文件放入solr服務的webapp/WEB-INF/classes/目錄下;

① IKAnalyzer.cfg.xml
② ext.dic
③ stopword.dic
④ ik.conf
⑤ dynamicdic.txt

配置managed-schema

進入solr容器:docker exec -it -u root my-solr /bin/bash

編輯managed-schema文件:vim /opt/solr/server/solr/shop/conf/managed-schema

把下面一段加到最後

<!-- ik分詞器 -->
<fieldType name="text_ik" class="solr.TextField">
  <analyzer type="index">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
<!-- 設置業務系統Field -->
<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="plong" 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"/>

別忘了重啓容器:docker restart my-solr
代碼解釋:加了type="text_ik"表示這個字段使用分詞器分拆,<copyField source="item_title" dest="item_keywords"/>表示把這個字段加入一個以前建立新的集合item_keywords中,之後使用這個字段檢索可達到全文檢索的目的。

嘗試把一條商品信息導入到Solr庫中

新建springboot項目,加依賴:

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>7.7.1</version>
</dependency>

配置文件添加:

spring.data.solr.host=http://114.115.215.xxx:8983/solr

核心代碼:

@RestController
public class HelloController {
    @Autowired
    private SolrClient client;
    @RequestMapping("/hello")
    public Object hello() throws IOException, SolrServerException {
        SolrInputDocument doc = new SolrInputDocument();
        List<ItemInfo> list= itemInfoMapper.findAll();
        doc.setField("item_title","Apple iPhone X (A1865) 64GB 深空灰色 移動聯通電信4G手機");
        doc.setField("item_sell_point","【搶券立減200元!】5.8英寸視網膜全面屏,無線充電,面容ID,1200萬後置雙攝。");
        doc.setField("item_price",6299.00);
        doc.setField("item_category_name","手機");
        doc.setField("item_desc","單卡單待網絡制式:4G LTE全網通機身內存:64GB4G LTE網絡特性:移動4G");
        client.add("shop",doc);
        client.commit("shop");
        return "ok";
    }
}

測試:

clipboard.png

爲何這麼多數據,不是隻加了一條嘛? 我已經走完了下面一步,這裏只是爲了演示給你看。

把數據庫中全部商品信息導入索引庫

先把mysql、mybatis依賴所有加進來

新建實體類

public class Item {
    private Long id;
    private String title;
    private String sell_point;
    private Long price;
    private String image;
    private String category_name;
}

dao層

public interface ItemInfoMapper {
    @Select("SELECT\n" +
            "\ta.id,\n" +
            "\ta.title,\n" +
            "\ta.sell_point,\n" +
            "\ta.price,\n" +
            "\ta.image,\n" +
            "\tb. NAME category_name\n" +
            "FROM\n" +
            "\ttb_item a\n" +
            "LEFT JOIN tb_item_cat b ON a.cid = b.id")
    List<ItemInfo> findAll();
}

記得讓springboot掃描哦

@SpringBootApplication
@MapperScan("com.yungou.shop.shopsearch.Mapper")
public class ShopSearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopSearchApplication.class, args);
    }
}

下面開發核心代碼了,登登登登:

@RestController
public class HelloController {
    @Autowired
    private SolrClient client;
    @Autowired
    private ItemInfoMapper itemInfoMapper;
    @RequestMapping("/hello")
    public Object hello() throws IOException, SolrServerException {
        SolrInputDocument doc = new SolrInputDocument();
        List<ItemInfo> list= itemInfoMapper.findAll();
        for (ItemInfo itemInfo:list){
            doc.setField("item_title",itemInfo.getTitle());
            doc.setField("item_sell_point",itemInfo.getSell_point());
            doc.setField("item_price",itemInfo.getPrice());
            doc.setField("item_category_name",itemInfo.getCategory_name());
            client.add("shop",doc);
        }
        client.commit("shop");
        return "ok"+list.size();
    }
}

讓數據加載一會,數據多的話可能要等幾分鐘。

回到管理界面
clipboard.png
咱們看到已經有6666條數據加載進來了,大功告成,666!

總結

通過這個案例,應該是把線上部署的大多數狀況都過了一遍。享受docker部署便利的同時,因爲第一次操做docker文件,這裏耗了點時間。最蠢的事情是明明加入的是text_ik,本身一直在搜ik,怎麼搜來搜去搜不到,明明已經啓動成功了呀。而後弄來弄去才發現,也費了點時間。警戒本身之後必定要細心,注意細節呀。除此以外,其餘的都比較順利。

相關文章
相關標籤/搜索