SSM+solr 通過商品搜索學習solr的簡單使用

来源:https://www.cnblogs.com/HannahLihui/archive/2018/12/11/10104416.html
-Advertisement-
Play Games

學習了一下https://github.com/TyCoding/ssm-redis-solr這個github上的solr搜索功能,現在來記錄一下。 我的理解就是solr有點類似於資料庫,但它是有索引的資料庫,按很多欄位建立索引,可能是b+樹或者散列索引,然後就能夠實現海量數據的查找。solr通過導 ...


 

學習了一下https://github.com/TyCoding/ssm-redis-solr這個github上的solr搜索功能,現在來記錄一下。

我的理解就是solr有點類似於資料庫,但它是有索引的資料庫,按很多欄位建立索引,可能是b+樹或者散列索引,然後就能夠實現海量數據的查找。solr通過導入jar包就可以對這個庫就行增刪改查了,後端逃不掉的增刪改查。。。

 1.配置tomcat

具體我就不說了,因為我是直接用了github上配置好的,畢竟站在巨人的肩膀上學習嘛

地址:https://github.com/TyCoding/solr-tomcat

2.訪問solr並使用

訪問埠:localhost:8080/solr/index.html

這裡的new_core就是項目中配置的路徑,就將商品的索引放在這裡。

然後用Test測試它的使用,測試的時候要引入配置文件,不然會導致空指針錯誤,我居然現在才知道。怪不得以前只要用Autowired的時候就會空指針錯誤。。,而且還要@Runwith註解,引入包import org.springframework.test.context.junit4.*;eclipse點擊不會有import提示,需要自己加上去。

 

 這裡新建了一個實體對象,然後把這個實體對象加入到索引庫里,在solr索引庫裡面就可以找到這個欄位

在new_core的schema裡面就以Id建好了索引

以及很多的信息

@Test
    public void testFindById() {
        Goods goods = solrTemplate.getById(1, Goods.class);
        System.out.println("--------" + goods.getTitle());
    }

通過id查找,控制台會輸出你剛剛插入的數據,也就是通過solrTemplate找到了你的數據。

@Test
    public void testAddList() {
        List<Goods> list = new ArrayList<Goods>();
        //迴圈插入100條數據
        for (int i = 0; i < 100; i++) {
            BigDecimal price=new BigDecimal (2.3);
            Goods goods = new Goods(i + 1L, "華為Mate" + i,price, "手機", "手機", "華為專賣店");
            list.add(goods);
        }
        solrTemplate.saveBeans(list); //添加集合對象,調用saveBeans();添加普通對象類型數據,使用saveBean();
        solrTemplate.commit(); //提交
    }

還可以批量插入數據,或者分頁查詢

@Test
    public void testPageQuery() {
        Query query = new SimpleQuery("*:*");
        query.setOffset(20); //開始索引(預設0)
        query.setRows(20); //每頁記錄數(預設10)
        ScoredPage<Goods> page = solrTemplate.queryForPage(query, Goods.class);
        System.out.println("總記錄數:" + page.getTotalElements());
        List<Goods> list = page.getContent();
    }

3.學習一下項目中怎麼配置

註意要在web.xml加一個過濾,不然註入不了solrTemplate這個bean

 

spring-solr.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:solr="http://www.springframework.org/schema/data/solr"
       xsi:schemaLocation="http://www.springframework.org/schema/data/solr
          http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- solr伺服器地址 -->
    <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr/new_core"/>

    <!-- solr模板,使用solr模板可對索引庫進行CRUD的操作 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg ref="solrServer"/>
    </bean>

</beans>

就是載入一個solr的模板

 

SolrUtil.java

把資料庫的資料庫批量加入

@Component
public class SolrUtil {

    @Autowired
    private GoodsMapper goodsMapper;

    @Autowired
    private SolrTemplate solrTemplate;

    /**
     * 實現將資料庫中的數據批量導入到Solr索引庫中
     */
    public void importGoodsData() {

        List<Goods> list = goodsMapper.findAll();
        System.out.println("====商品列表====");
        for (Goods goods : list) {
            System.out.println(goods.getTitle());
        }

        solrTemplate.saveBeans(list);
        solrTemplate.commit(); //提交
        System.out.println("====結束====");
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring*.xml");
        SolrUtil solrUtil = (SolrUtil) context.getBean("solrUtil");
        solrUtil.importGoodsData();
    }
}

 

 這樣就把數據加入索引庫中。

實體類有一個Field標識這個實體欄位在索引庫里的名稱

 @Field
    private Long id; //商品ID
    @Field("item_title")
    private String title; //商品標題
    @Field("item_price")
    private BigDecimal price; //商品價格
    @Field("item_image")
    private String image; //商品圖片
    @Field("item_category")
    private String category; //商品類別
    @Field("item_brand")
    private String brand; //商品品牌
    @Field("item_seller")
    private String seller; //商品賣家

最後,搜索功能的實現

按價格查找

 //按價格區間查詢
     if (searchMap.get("price") != null) {
         if (!searchMap.get("price").equals("")) {
             String[] price = ((String) searchMap.get("price")).split("-");
             if (!price[0].equals("0")) {
                 //如果起點區間不等於0
                 Criteria filterCriteria = new Criteria("item_price").greaterThanEqual(price[0]);
                 FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
                 query.addFilterQuery(filterQuery);
             }

             if (!price[1].equals("*")) {
                 //如果區間重點不等於*
                 Criteria filterCriteria = new Criteria("item_price").lessThanEqual(price[1]);
                 FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
                 query.addFilterQuery(filterQuery);
             }
         }
     }

 4.實現效果

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Berlekamp Massey演算法 很久之前就聽說過這個演算法,當時六校聯考的時候Day1T1是一道很有意思的遞推,神仙zzx不會做於是就拿BM演算法艹出了遞推式Orzzzzzzzzzzx "推薦一篇講的詳細的不能再詳細的博客" 我就不詳細說了,只記一下自己感覺比較難理解的地方 設$r(m)$表示序列 ...
  • 前言 最近需要開發一個純API的項目,mlsql-cluster,從無到有,到最後完整的proxy功能開發完畢,只花了四個小時不到,自己不盡小感嘆了一把 ServiceFramework的高效。 關於ServiceFramework的誕生 ServiceFramework算是一個古老的,基於Java ...
  • 未壓縮前 ...
  • 上半節已經下載好了Zookeeper,以及新建了兩個應用provider和consumer,這一節我們就結合dubbo來測試一下分散式可不可以用。 現在就來簡單用一下,註意:這裡只是涉及最簡單的部分,新手入門用的,詳細的內容要學習的可以自己查一查資料;然後再說說用Zookeeper當作註冊中心的一個 ...
  • 第一個程式 print “Hello World!” print“Hello Again” print “I like type” print "This is fun." ...
  • 一、RBAC分析 基於角色的許可權訪問控制(Role-Based Access Control),這裡存在這麼幾個玩意兒:角色、許可權,用戶 表:roles、permissions、role_has_permissions、model_has_roles、model_has_permissions(最後 ...
  • 一、什麼是序列化組件? 本質上為了實現前後端分離,而進行json序列化的一個組件形式,極大方便瞭解析數據的作用 所有序列化是基於APIView解析器實現的,通過內部的多繼承關係方便實現進行數據序列化的實現 二、使用方法 第一步:創建序列化類 創建出返回頁面顯示的欄位,一對多關係同創建普通欄位一樣,無 ...
  • 題目鏈接 思路 觀察這個$(r - l + 1)/2$,很容易證明,如果一個數出現次數大於$(r - l + 1) / 2$,那麼這個區間內第$(r - l + 1) / 2 + 1$ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...