日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

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

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

本文大綱如下,

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

使用體驗(yàn)

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

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

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

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

就目前官方對(duì) RediSearch 的支持更新來(lái)看,

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

RediSearch 官方更新頻率圖

最近一次提交記錄在 12 月 17 號(hào)。

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

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

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

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

遇到 bug

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

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

官方issue列表

大家可以看到 issue 列表中有很多 bug 沒(méi)有解決。

不過(guò)本著開(kāi)源共進(jìn)的精神,希望大家發(fā)現(xiàn)了 bug 后,第一時(shí)間在 RediSearch 官方 Github 上提個(gè) issue,方便官方發(fā)現(xiàn)并解決問(wèn)題。

RediSearch Github 倉(cāng)庫(kù)地址:https://github.com/RediSearch/RediSearch

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

newbee-mall-pro 項(xiàng)目地址:https://github.com/wayn111/newbee-mall-pro

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

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

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

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

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

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

在 newbee-mall-pro 中,添加源數(shù)據(jù)的方法已經(jīng)寫(xiě)好了,代碼邏輯在 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;
}

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

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

建立索引

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

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

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

Jedis 新建索引

所以這里,我給大家介紹下在 newbee-mall-pro 項(xiàng)目中,是如何建立索引的,代碼邏輯在 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);
}

上述代碼中,我們對(duì)商品 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:標(biāo)簽類型,可排序,設(shè)置分隔符為字符串 |

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

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

Redis 中的新建索引語(yǔ)法

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

> 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)在我給大家詳細(xì)介紹下這條命令:

  • FT.CREATE:RediSearch 中索引創(chuàng)建語(yǔ)法。
  • idx:goods:指定索引名稱,索引名稱將在所有鍵名稱中使用,因此請(qǐng)保持簡(jiǎn)短。
  • 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 前綴,可以指定多個(gè)前綴。
  • SCHEMA ...:字段定義,用于定義字段名稱、類型、是否排序、權(quán)重等??梢远x多個(gè)字段。

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

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

Redis 中查詢索引定義

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

> FT.INFO idx:goods

 

分享到:
標(biāo)簽:Redis
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定