最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis全文搜索教程之創(chuàng)建索引并關(guān)聯(lián)源數(shù)據(jù)的教程

 更新時間:2023年12月21日 09:03:20   作者:waynaqua  
RediSearch提供了一種簡單快速的方法對 hash 或者 json 類型數(shù)據(jù)的任何字段建立二級索引,然后就可以對被索引的 hash 或者 json 類型數(shù)據(jù)字段進行搜索和聚合操作,這篇文章主要介紹了Redis全文搜索教程之創(chuàng)建索引并關(guān)聯(lián)源數(shù)據(jù),需要的朋友可以參考下

Redis 全文搜索是依賴于 Redis 官方提供的 RediSearch 來實現(xiàn)的。RediSearch 提供了一種簡單快速的方法對 hash 或者 json 類型數(shù)據(jù)的任何字段建立二級索引,然后就可以對被索引的 hash 或者 json 類型數(shù)據(jù)字段進行搜索和聚合操作。

這里我們把被索引的 hash 或者 json 類型數(shù)據(jù)叫做源數(shù)據(jù)。

本文大綱如下,

使用體驗

簡單場景下,用 RediSearch 來平替 Elasticsearch 的使用場景已經(jīng)足夠。像是 Elasticsearch 中常用的查詢語法 AND 、OR 、IN 、NOT IN 、> 、< 、= 、like 等,在 RediSearch 中都是支持的。

此外 RediSearch 還支持聚合統(tǒng)計、停用詞、文本標記和轉(zhuǎn)義、同義詞、標簽、排序、向量查詢、中文分詞等。

就我個人來說,個人項目使用 RediSearch 作為全文搜索引擎已經(jīng)夠用了,它有占用內(nèi)存低、索引建立快、查詢數(shù)據(jù)性能足夠高等優(yōu)點。

后續(xù)發(fā)展

就目前官方對 RediSearch 的支持更新來看,

最近一次提交記錄在 12 月 17 號。

可以看到 RediSearch 的更新頻率還是比較高的,而且是官方支持做的模塊,不用擔(dān)心后續(xù)無人維護。

雖然 Redis 天生支持分布式集群,但是 RediSearch 對 Redis 集群的支持還不完善,引用官方說明,

官方針對 RediSearch 的集群支持問題,提供了一個 RediSearch 集群版本,但是這個版本只能在 Redis 企業(yè)版或者 Redis Cloud 上能使用,開源版還沒有,這一點需要告訴大家。

遇到 bug

首先在使用 RediSearch 的過程中,遇到了 bug 并發(fā)現(xiàn) bug 來源于 RediSearch,不要慌,也不要抱怨難用, 畢竟是開源項目,

大家可以看到 issue 列表中有很多 bug 沒有解決。

不過本著開源共進的精神,希望大家發(fā)現(xiàn)了 bug 后,第一時間在 RediSearch 官方 github 上提個 issue,方便官方發(fā)現(xiàn)并解決問題。

RediSearch Github 倉庫地址:https://github.com/RediSearch/RediSearch

下面我給大家用 newbee-mall-pro 項目作為樣本,給大家介紹下如何創(chuàng)建一個索引并關(guān)聯(lián)源數(shù)據(jù)。

newbee-mall-pro 項目地址:https://github.com/wayn111/newbee-mall-pro

添加源數(shù)據(jù)

在 newbee-mall-pro 項目中,已經(jīng)將商品數(shù)據(jù)以 hash 類型存入了 Redis 中,

其中,我們對于 key 名稱的定義規(guī)則是按照 newbee_mall:goods: + 商品ID。

這里我們的 key 名稱定義規(guī)則很重要,RediSearch 創(chuàng)建索引會基于 key 名稱前綴來生成。

hash 類型的 value 包含屬性如下,

  • goodsId : 商品 ID,唯一屬性,由數(shù)據(jù)庫商品表主鍵生成
  • goodsName : 商品名稱
  • goodsIntro : 商品簡介
  • goodsCategoryId : 商品分類 ID,唯一屬性,由數(shù)據(jù)庫商品分類表主鍵生成
  • goodsSellStatus : 商品上架狀態(tài),0 代表下架,1 代表上架
  • sellingPrice : 商品售價
  • originalPrice : 商品原價
  • tag : 商品標簽

在 newbee-mall-pro 中,添加源數(shù)據(jù)的方法已經(jīng)寫好了,代碼邏輯在 JedisSearch.addGoodsListIndex() 方法里,

public boolean addGoodsListIndex(String keyPrefix, List<Goods> list) {
    int chunk = 200;
    List<List<Goods>> partition = ListUtil.partition(list, chunk);
    AbstractPipeline pipelined = client.pipelined();
    for (List<Goods> goodsList : partition) {
        for (Goods goods : goodsList) {
            RsGoodsDTO target = new RsGoodsDTO();
            MyBeanUtil.copyProperties(goods, target);
            Map<String, String> hash = MyBeanUtil.toMap(target);
            // 支持中文
            hash.put("_language", Constants.GOODS_IDX_LANGUAGE);
            pipelined.hset(keyPrefix + goods.getGoodsId(), hash);
        }
    }
    pipelined.sync();
    return true;
}

上訴代碼中,其實就是把 list 商品列表以 hash 類型的數(shù)據(jù)結(jié)構(gòu)寫進 Redis 中,并且為了加快寫入速度,使用了 Redis 提供的管道操作。

需要注意的就是 hash 類型中新增了一個 _language 字段,用于指定 RediSearch 對于源數(shù)據(jù)關(guān)聯(lián)的索引,要使用中文分詞查詢。

建立索引

RediSearch 通過提供一種簡單且自動的方式在 Redis hash 類型數(shù)據(jù)結(jié)構(gòu)上創(chuàng)建二級索引,并且內(nèi)部極大地簡化了這一過程。(最終會出現(xiàn)更多數(shù)據(jù)結(jié)構(gòu))

如果我們要使用 RediSearch 查詢商品 hash 結(jié)構(gòu)里的 goodsName 字段,那么必須要對該字段建立索引。

Jedis 新建索引

所以這里,我給大家介紹下在 newbee-mall-pro 項目中,是如何建立索引的,代碼邏輯在 GoodsServiceImpl.syncRs() 方法中,

// 定義索引結(jié)構(gòu)
public boolean syncRs() {
    jedisSearch.dropIndex("idx:goods");
    Schema schema = new Schema()
            .addSortableTextField("goodsName", 1.0)
            .addSortableTextField("goodsIntro", 0.5)
            .addSortableNumericField("goodsId")
            .addSortableNumericField("goodsCategoryId")
            .addSortableNumericField("goodsSellStatus")
            .addSortableNumericField("sellingPrice")
            .addSortableNumericField("originalPrice")
            .addSortableTagField("tag", "|");
    jedisSearch.createIndex(Constants.GOODS_IDX_NAME, Constants.GOODS_IDX_PREFIX, schema);
}

上述代碼中,我們對商品 hash 結(jié)構(gòu)里的下方字段都建立了索引。

  • goodsName:文本類型,可排序,設(shè)置權(quán)重為 1.0
  • goodsIntro:文本類型,可排序,設(shè)置權(quán)重為 0.5
  • goodsId:數(shù)字類型,可排序
  • goodsCategoryId:數(shù)字類型,可排序
  • goodsSellStatus:數(shù)字類型,可排序
  • sellingPrice:數(shù)字類型,可排序
  • originalPrice:數(shù)字類型,可排序
  • tag:標簽類型,可排序,設(shè)置分隔符為字符串 |

在 RediSerach 中可以添加的字段類型有 text、numberic、tag 等,可以設(shè)置是否排序。

并且還可以設(shè)置權(quán)重系數(shù),表示該字段已加權(quán)。這對于在搜索操作期間為特定字段分配不同的重要性級別非常有用,通常就是在條件篩選完成后的打分排序階段用于提升或者降低排名。

Redis 中的新建索引語法

當(dāng)我們把上面的 Jedis 新建索引的代碼轉(zhuǎn)換為 Redis 中的語法后,如下

> FT.CREATE idx:goods ON hash PREFIX 1 "newbeemall:goods:" \
SCHEMA goodsName TEXT SORTABLE WEIGHT 1.0 \
SCHEMA goodsIntro TEXT SORTABLE WEIGHT 0.5 \
goodsId NUMERIC SORTABLE \
goodsCategoryId NUMERIC SORTABLE \
goodsSellStatus NUMERIC SORTABLE \
sellingPrice NUMERIC SORTABLE \
originalPrice NUMERIC SORTABLE \
tag TAG SORTABLE SEPARATOR "|"

現(xiàn)在我給大家詳細介紹下這條命令:

  • FT.CREATE:RediSearch 中索引創(chuàng)建語法。
  • idx:goods:指定索引名稱,索引名稱將在所有鍵名稱中使用,因此請保持簡短。
  • ON hash:指定索引關(guān)聯(lián)的結(jié)構(gòu)類型。需要注意的是,在 RediSearch 2.0 中僅支持哈希結(jié)構(gòu),隨著 RediSearch 更新,后續(xù)有望支持更多數(shù)據(jù)結(jié)構(gòu)。
  • PREFIX 1 "newbeemall:goods:":指定索引的關(guān)聯(lián)源數(shù)據(jù)的 key 前綴,可以指定多個前綴。
  • SCHEMA ...:字段定義,用于定義字段名稱、類型、是否排序、權(quán)重等??梢远x多個字段。

如果你想了解更多關(guān)于 ft.search 的語法以及字段定義相關(guān)的只是,可以打開官方文檔,

https://redis.io/docs/interact/search-and-query/basic-constructs/schema-definition

Redis 中查詢索引定義

在 RediSearch 中要查詢已經(jīng)存在的索引詳情也是很簡單的,官方提供了 ft.info 索引名稱 的語法,用來打印索引詳情。

> FT.INFO idx:goods

最后聊兩句

本文給大家用我的開源項目 newbee-mall-pro 作為樣本,給大家細致的介紹了一番 RediSearch 在項目實戰(zhàn)中關(guān)于索引創(chuàng)建與關(guān)聯(lián)源數(shù)據(jù)的用法,希望大家喜歡。

到此這篇關(guān)于Redis全文搜索教程之創(chuàng)建索引并關(guān)聯(lián)源數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Redis創(chuàng)建索引并關(guān)聯(lián)源數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis事務(wù)處理的使用操作方法

    Redis事務(wù)處理的使用操作方法

    Redis保證一個事務(wù)中的所有命令要么都執(zhí)行,要么都不執(zhí)行(原子性),如果客戶端發(fā)送了EXEC命令,所有的命令就都會被執(zhí)行,即使此后客戶端斷線也沒關(guān)系,因為Redis中已經(jīng)記錄了所有要執(zhí)行的命令,下面通過本文給大家介紹Redis事務(wù)處理的使用操作,感興趣的朋友一起看看吧
    2021-10-10
  • Redis與緩存解讀

    Redis與緩存解讀

    文章介紹了Redis作為緩存層的優(yōu)勢和缺點,并分析了六種緩存更新策略,包括超時剔除、先刪緩存再更新數(shù)據(jù)庫、旁路緩存、先更新數(shù)據(jù)庫再刪緩存、先更新數(shù)據(jù)庫再更新緩存、讀寫穿透和異步緩存寫入模式,還討論了緩存常見問題
    2025-01-01
  • Redis主從復(fù)制與讀寫分離的實現(xiàn)

    Redis主從復(fù)制與讀寫分離的實現(xiàn)

    Redis在作為緩存的時候,隨著項目訪問量的增加,對Redis服務(wù)器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時,本文主要介紹了Redis主從復(fù)制與讀寫分離的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Redis 中的布隆過濾器的實現(xiàn)

    Redis 中的布隆過濾器的實現(xiàn)

    這篇文章主要介紹了Redis 中的布隆過濾器的實現(xiàn),詳細的介紹了什么是布隆過濾器以及如何實現(xiàn),非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • Redis實現(xiàn)用戶關(guān)注的項目實踐

    Redis實現(xiàn)用戶關(guān)注的項目實踐

    本文主要介紹了Redis實現(xiàn)用戶關(guān)注的項目實踐,通過使用Redis的set數(shù)據(jù)結(jié)構(gòu)來存儲關(guān)注對象,方便高效地進行添加和取消關(guān)注操作,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • React?組件的常用生命周期函數(shù)匯總

    React?組件的常用生命周期函數(shù)匯總

    這篇文章主要介紹了React?組件的常用生命周期函數(shù)匯總,組件的生命周期有助于理解組件的運行方式、完成更復(fù)雜的組件功能、分析組件錯誤原因等
    2022-08-08
  • Redis是什么及核心特性

    Redis是什么及核心特性

    Redis是一個基于內(nèi)存的鍵值對存儲系統(tǒng),支持多種數(shù)據(jù)結(jié)構(gòu),適用于緩存、計數(shù)器、排行榜、消息隊列等場景,Redis通過將數(shù)據(jù)存儲在內(nèi)存中,提供多種高效的數(shù)據(jù)結(jié)構(gòu)和優(yōu)化的網(wǎng)絡(luò)模型,實現(xiàn)快速的數(shù)據(jù)訪問和處理,本文介紹Redis是什么及核心特性,感興趣的朋友一起看看吧
    2026-05-05
  • redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法

    redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法

    這篇文章主要介紹了redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Redis實現(xiàn)鎖續(xù)期的項目實踐

    Redis實現(xiàn)鎖續(xù)期的項目實踐

    本文介紹了使用Redis實現(xiàn)分布式鎖的續(xù)期,包括使用Lua腳本、Redlock算法和Redisson客戶端等方法,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Redis中大key處理的問題解決

    Redis中大key處理的問題解決

    本文主要介紹了Redis中大key處理的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03

最新評論

临漳县| 阳新县| 鹤山市| 孝感市| 垦利县| 青铜峡市| 双柏县| 衡南县| 彭阳县| 鱼台县| 屏东县| 闽侯县| 海晏县| 崇明县| 广汉市| 托克逊县| 镇江市| 龙山县| 隆子县| 汉沽区| 铁力市| 钟山县| 栾城县| 维西| 溧水县| 元江| 江安县| 荔浦县| 南澳县| 吉林省| 和平区| 大厂| 江达县| 浦北县| 通辽市| 昌平区| 张北县| 桓仁| 嘉鱼县| 涟水县| 墨江|