RediSearch加RedisJSON大于Elasticsearch的搜索存儲引擎
RedisMod簡介
Redis是開發(fā)中非常常用的內(nèi)存數(shù)據(jù)存儲中間件,之前基本上用它來做內(nèi)存存儲使用。最近發(fā)現(xiàn)Redis推出了很多增強(qiáng)模塊,例如通過RedisJSON可以支持原生JSON對象的存儲,使用RediSearch可以作為搜索引擎使用,并且支持中文搜索!今天給大家?guī)鞷ediSearch+RedisJSON作為搜索引擎的使用實(shí)踐,希望對大家有所幫助!
SpringBoot實(shí)戰(zhàn)電商項(xiàng)目mall(50k+star)地址:https://github.com/macrozheng/mall
首先介紹下RedisMod這個東西,它是一系列Redis的增強(qiáng)模塊。有了RedisMod的支持,Redis的功能將變得非常強(qiáng)大。目前RedisMod中包含了如下增強(qiáng)模塊:
- RediSearch:一個功能齊全的搜索引擎;
- RedisJSON:對JSON類型的原生支持;
- RedisTimeSeries:時序數(shù)據(jù)庫支持;
- RedisGraph:圖數(shù)據(jù)庫支持;
- RedisBloom:概率性數(shù)據(jù)的原生支持;
- RedisGears:可編程的數(shù)據(jù)處理;
- RedisAI:機(jī)器學(xué)習(xí)的實(shí)時模型管理和部署。
安裝
首先我們需要安裝帶所有RedisMod的Redis,使用Docker來安裝非常方便的!
使用如下命令下載RedisMod的鏡像;
docker pull redislabs/redismod:preview
在容器中運(yùn)行RedisMod服務(wù)。
docker run -p 6379:6379 --name redismod \ -v /mydata/redismod/data:/data \ -d redislabs/redismod:preview
RedisJSON
有了RedisJSON模塊,Redis就可以存儲原生JSON類型數(shù)據(jù)了,通過它你可以很方便地訪問JSON中的各個屬性,類似在MongoDB中那樣,下面我們就來體驗(yàn)下,這里我們將使用RedisInsight 來操作Redis。
首先通過JSON.SET
命令向Redis中添加JSON類型鍵值對,幾個商品對象數(shù)據(jù),由于JSON是樹形結(jié)構(gòu)的,使用$
符號代表往JSON的根節(jié)點(diǎn)中添加數(shù)據(jù);
JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏游戲智能手機(jī) 6GB+64GB 黑色 全網(wǎng)通4G 雙卡雙待","brandName":"小米","price":2699,"cou
數(shù)據(jù)插入成功后,在RedisInsight中將看到如下信息,JSON數(shù)據(jù)支持格式化高亮顯示;
接下來可以通過JSON.GET
命令獲取JSON類型鍵值對的值;
JSON.GET product:1
也可以只獲取值的指定屬性,在RedisJSON中,獲取JSON對象中的屬性時需要以.
開頭;
JSON.GET product:1 .name .subTitle
還可以通過JSON.TYPE
命令來獲取JSON對象類型。
JSON.TYPE product:1 .
RediSearch
通過RediSearch模塊,Redis可以變成一個功能強(qiáng)大的全文搜索引擎,并且原生支持中文搜索,下面我們就來體驗(yàn)下!
使用RediSearch來搜索數(shù)據(jù)之前,我們得先創(chuàng)建下索引,建立索引的語法有點(diǎn)復(fù)雜,我們先來看下;
FT.CREATE {index} [ON {data_type}] [PREFIX {count} {prefix} [{prefix} ..] [LANGUAGE {default_lang}] SCHEMA {identifier} [AS {attribute}] [TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE] [SORTABLE] [NOINDEX]] ...
使用FT.CREATE
命令可以建立索引,語法中的參數(shù)意義如下;
- index:索引名稱;
- data_type:建立索引的數(shù)據(jù)類型,目前支持JSON或者HASH兩種;
- PREFIX:通過它可以選擇需要建立索引的數(shù)據(jù)前綴,比如
PREFIX 1 "product:"
表示為鍵中以product:
為前綴的數(shù)據(jù)建立索引; - LANGUAGE:指定TEXT類型屬性的默認(rèn)語言,使用chinese可以設(shè)置為中文;
- identifier:指定屬性名稱;
- attribute:指定屬性別名;
- TEXT | NUMERIC | GEO | TAG:這些都是屬性可選的類型;
- SORTABLE:指定屬性可以進(jìn)行排序。
看了語法可能不太好理解,直接對之前的商品數(shù)據(jù)建立索引試試就懂了;
FT.CREATE productIdx ON JSON PREFIX 1 "product:" LANGUAGE chinese SCHEMA $.id AS id NUMERIC $.name AS name TEXT $.subTitle AS subTitle TEXT $.price AS price NUMERIC SORTABLE $.brandName AS brandName TAG
建立完索引后,我們就可以使用FT.SEARCH
對數(shù)據(jù)進(jìn)行查看了,比如使用*
可以查詢?nèi)浚?/p>
FT.SEARCH productIdx *
由于我們設(shè)置了price
字段為SORTABLE
,我們可以以price
降序返回商品信息;
FT.SEARCH productIdx * SORTBY price DESC
還可以指定返回的字段;
FT.SEARCH productIdx * RETURN 3 name subTitle price
我們把brandName
設(shè)置為了TAG
類型,我們可以使用如下語句查詢品牌為小米
或蘋果
的商品;
FT.SEARCH productIdx '@brandName:{小米 | 蘋果}'
由于price
是NUMERIC
類型,我們可以使用如下語句查詢價格在500~1000
的商品;
FT.SEARCH productIdx '@price:[500 1000]'
還可以通過前綴進(jìn)行模糊查詢,類似于SQL中的LIKE
,使用*
表示;
FT.SEARCH productIdx '@name:小米*'
在FT.SEARCH
中直接指定搜索關(guān)鍵詞,可以對所有TEXT
類型的屬性進(jìn)行全局搜索,支持中文搜索,比如我們搜索下包含黑色
字段的商品;
FT.SEARCH productIdx '黑色'
當(dāng)然我們也可以指定搜索的字段,比如搜索副標(biāo)題中帶有紅色
字段的商品;
FT.SEARCH productIdx '@subTitle:紅色'
通過FT.DROPINDEX
命令可以刪除索引,如果加入DD
選項(xiàng)的話,會連數(shù)據(jù)一起刪除;
FT.DROPINDEX productIdx
通過FT.INFO
命令可以查看索引狀態(tài);
FT.INFO productIdx
RediSearch的搜索語法比較復(fù)雜,不過我們可以對比SQL來使用它,具體可以參考下表。
對比Elasticsearch
Redis官方曾公布了RediSearch與Elasticsearch的性能對比測試,大家可以看下。
索引能力
對Wikipedia的560萬(5.3GB)文檔進(jìn)行索引,RediSearch耗時221s
,Elasticsearch耗時349s
,RediSearch快了58%
!
查詢能力
數(shù)據(jù)建立索引后,使用32個客戶端對兩個單詞進(jìn)行檢索,RediSearch的吞吐量達(dá)到12.5K ops/sec
,Elasticsearch的吞吐量為3.1K ops/sec
,RediSearch比Elasticsearch要快4倍
。同時RediSearch的延遲為8ms
,而Elasticsearch為10ms
,RediSearch延遲稍微低些!
總結(jié)
經(jīng)過這么多年的發(fā)展,Redis的功能也越來越強(qiáng)大了,它已經(jīng)不僅僅是個緩存工具了,更像是一個數(shù)據(jù)庫了。RediSearch給了我們實(shí)現(xiàn)搜索功能的另一個選擇,性能也非常不錯,大家如果做搜索相關(guān)功能的話可以考慮下它!
參考資料
官方文檔:https://developer.redis.com/howtos/redisjson/
參考手冊:https://redis.io/docs/stack/search/
性能測試:https://redis.com/blog/search-benchmarking-redisearch-vs-elasticsearch/
以上就是RediSearch加RedisJSON大于Elasticsearch的王炸的詳細(xì)內(nèi)容,更多關(guān)于RediSearch RedisJSON的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。