RediSearch加RedisJSON大於Elasticsearch的搜索存儲引擎

RedisMod簡介

Redis是開發中非常常用的內存數據存儲中間件,之前基本上用它來做內存存儲使用。最近發現Redis推出瞭很多增強模塊,例如通過RedisJSON可以支持原生JSON對象的存儲,使用RediSearch可以作為搜索引擎使用,並且支持中文搜索!今天給大傢帶來RediSearch+RedisJSON作為搜索引擎的使用實踐,希望對大傢有所幫助!

SpringBoot實戰電商項目mall(50k+star)地址:https://github.com/macrozheng/mall

首先介紹下RedisMod這個東西,它是一系列Redis的增強模塊。有瞭RedisMod的支持,Redis的功能將變得非常強大。目前RedisMod中包含瞭如下增強模塊:

  • RediSearch:一個功能齊全的搜索引擎;
  • RedisJSON:對JSON類型的原生支持;
  • RedisTimeSeries:時序數據庫支持;
  • RedisGraph:圖數據庫支持;
  • RedisBloom:概率性數據的原生支持;
  • RedisGears:可編程的數據處理;
  • RedisAI:機器學習的實時模型管理和部署。

安裝

首先我們需要安裝帶所有RedisMod的Redis,使用Docker來安裝非常方便的!

使用如下命令下載RedisMod的鏡像;

docker pull redislabs/redismod:preview

在容器中運行RedisMod服務。

docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:preview

RedisJSON

有瞭RedisJSON模塊,Redis就可以存儲原生JSON類型數據瞭,通過它你可以很方便地訪問JSON中的各個屬性,類似在MongoDB中那樣,下面我們就來體驗下,這裡我們將使用RedisInsight 來操作Redis。

首先通過JSON.SET命令向Redis中添加JSON類型鍵值對,幾個商品對象數據,由於JSON是樹形結構的,使用$符號代表往JSON的根節點中添加數據;

JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏遊戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待","brandName":"小米","price":2699,"count":1}'
JSON.SET product:2 $ '{"id":2,"productSn":"7437789","name":"紅米5A","subTitle":"全網通版 3GB+32GB 香檳金 移動聯通電信4G手機 雙卡雙待","brandName":"小米","price":649,"count":5}'
JSON.SET product:3 $ '{"id":3,"productSn":"7437799","name":"Apple iPhone 8 Plus","subTitle":"64GB 紅色特別版 移動聯通電信4G手機","brandName":"蘋果","price":5499,"count":10}'

數據插入成功後,在RedisInsight中將看到如下信息,JSON數據支持格式化高亮顯示;

接下來可以通過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可以變成一個功能強大的全文搜索引擎,並且原生支持中文搜索,下面我們就來體驗下!

使用RediSearch來搜索數據之前,我們得先創建下索引,建立索引的語法有點復雜,我們先來看下;

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命令可以建立索引,語法中的參數意義如下;

  • index:索引名稱;
  • data_type:建立索引的數據類型,目前支持JSON或者HASH兩種;
  • PREFIX:通過它可以選擇需要建立索引的數據前綴,比如PREFIX 1 "product:"表示為鍵中以product:為前綴的數據建立索引;
  • LANGUAGE:指定TEXT類型屬性的默認語言,使用chinese可以設置為中文;
  • identifier:指定屬性名稱;
  • attribute:指定屬性別名;
  • TEXT | NUMERIC | GEO | TAG:這些都是屬性可選的類型;
  • SORTABLE:指定屬性可以進行排序。

看瞭語法可能不太好理解,直接對之前的商品數據建立索引試試就懂瞭;

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對數據進行查看瞭,比如使用*可以查詢全部;

FT.SEARCH productIdx *

由於我們設置瞭price字段為SORTABLE,我們可以以price降序返回商品信息;

FT.SEARCH productIdx * SORTBY price DESC

還可以指定返回的字段;

FT.SEARCH productIdx * RETURN 3 name subTitle price

我們把brandName設置為瞭TAG類型,我們可以使用如下語句查詢品牌為小米蘋果的商品;

FT.SEARCH productIdx '@brandName:{小米 | 蘋果}'

由於priceNUMERIC類型,我們可以使用如下語句查詢價格在500~1000的商品;

FT.SEARCH productIdx '@price:[500 1000]'

還可以通過前綴進行模糊查詢,類似於SQL中的LIKE,使用*表示;

FT.SEARCH productIdx '@name:小米*'

FT.SEARCH中直接指定搜索關鍵詞,可以對所有TEXT類型的屬性進行全局搜索,支持中文搜索,比如我們搜索下包含黑色字段的商品;

FT.SEARCH productIdx '黑色'

當然我們也可以指定搜索的字段,比如搜索副標題中帶有紅色字段的商品;

FT.SEARCH productIdx '@subTitle:紅色'

通過FT.DROPINDEX命令可以刪除索引,如果加入DD選項的話,會連數據一起刪除;

FT.DROPINDEX productIdx

通過FT.INFO命令可以查看索引狀態;

FT.INFO productIdx

RediSearch的搜索語法比較復雜,不過我們可以對比SQL來使用它,具體可以參考下表。

對比Elasticsearch

Redis官方曾公佈瞭RediSearch與Elasticsearch的性能對比測試,大傢可以看下。

索引能力

對Wikipedia的560萬(5.3GB)文檔進行索引,RediSearch耗時221s,Elasticsearch耗時349s,RediSearch快瞭58%

查詢能力

數據建立索引後,使用32個客戶端對兩個單詞進行檢索,RediSearch的吞吐量達到12.5K ops/sec,Elasticsearch的吞吐量為3.1K ops/sec,RediSearch比Elasticsearch要快4倍。同時RediSearch的延遲為8ms,而Elasticsearch為10ms,RediSearch延遲稍微低些!

總結

經過這麼多年的發展,Redis的功能也越來越強大瞭,它已經不僅僅是個緩存工具瞭,更像是一個數據庫瞭。RediSearch給瞭我們實現搜索功能的另一個選擇,性能也非常不錯,大傢如果做搜索相關功能的話可以考慮下它!

參考資料

官方文檔:https://developer.redis.com/howtos/redisjson/

參考手冊:https://redis.io/docs/stack/search/

性能測試:https://redis.com/blog/search-benchmarking-redisearch-vs-elasticsearch/

以上就是RediSearch加RedisJSON大於Elasticsearch的王炸的詳細內容,更多關於RediSearch RedisJSON的資料請關註WalkonNet其它相關文章!

推薦閱讀: