RediSearch 簡(jiǎn)介
RediSearch 是一個(gè) Redis 模塊,為 Redis 提供查詢(xún)、二級(jí)索引和全文搜索功能。
要使用 RediSearch 的功能,我們需要要先聲明一個(gè) index(類(lèi)似于 Elasticsearch 的索引)。然后就可以使用 RediSearch 的查詢(xún)語(yǔ)言來(lái)查詢(xún)?cè)撍饕碌臄?shù)據(jù)。
RediSearch 內(nèi)部使用壓縮的倒排索引,所以可以用較低的內(nèi)存占用來(lái)實(shí)現(xiàn)索引的快速構(gòu)建。
目前 RediSearch 最新版支持的查詢(xún)功能也比較豐富了,除了基本的文本分詞還支持聚合統(tǒng)計(jì)、停用詞、同義詞、拼寫(xiě)檢查、結(jié)果排序、標(biāo)簽查詢(xún)、向量相似度查詢(xún)以及中文分詞等。
對(duì)比 Elasticsearch
基本硬件
數(shù)據(jù)源
RediSearch 配置
Elasticsearch 配置
版本
索引構(gòu)建測(cè)試
在官方提供的索引構(gòu)建測(cè)試中,RediSearch 用 221 秒的速度超過(guò)了 Elasticsearch 的 349 秒,領(lǐng)先 58%,
查詢(xún)性能測(cè)試
通過(guò)數(shù)據(jù)集導(dǎo)入索引數(shù)據(jù)后,官方使用運(yùn)行在專(zhuān)用負(fù)載生成器服務(wù)器上的 32 個(gè)客戶(hù)端啟動(dòng)了兩個(gè)詞的搜索查詢(xún)。
如下圖所示,RediSearch 的吞吐量達(dá)到了 12.5K ops/sec,而 Elasticsearch 的吞吐量只有了 3.1K ops/sec,快了 4 倍。此外 RediSearch 的延遲稍好一些,平均為 8 毫秒,而 Elasticsearch 為 10 毫秒。(ops/sec 每秒操作數(shù))
由此可見(jiàn),RediSearch 在性能上對(duì)比 RediSearch 有比較大的優(yōu)勢(shì)。
目前 RediSearch 已經(jīng)更新到 2.0+ 版本,根據(jù)官方對(duì)于 RediSearch 2.0 版本介紹,與 RediSearch 1.6 相比,吞吐量和延遲相關(guān)的指標(biāo)都提高了 2.4 倍。
RediSearch 安裝
對(duì)于目前最新的 RediSearch 2.0 版本來(lái)說(shuō),官方推薦直接使用 redis-stack-server 鏡像進(jìn)行進(jìn)行部署,也比較簡(jiǎn)單,
dockerrun-d--nameredis-stack-server-p6379:6379redis/redis-stack-server:latest
設(shè)置登錄密碼
//設(shè)置登錄密碼 dockerrun-eREDIS_ARGS="--requirepassredis-stack"redis/redis-stack:latest
通過(guò) redis-cli 連接查看 RediSearch 是否安裝了 search 模塊,
redis-cli-hlocalhost >MODULElist ... 3)1)"name" 2)"search" 3)"ver" 4)"20809" 5)"path" 6)"/opt/redis-stack/lib/redisearch.so" 7)"args" 8)1)"MAXSEARCHRESULTS" 2)"10000" 3)"MAXAGGREGATERESULTS" 4)"10000" ...
索引操作
FT.CREATE 創(chuàng)建索引命令
>FT.CREATEidx:goodsonhashprefix1"goods:"languagechineseschemagoodsNametextsortable "OK"
FT.CREATE:創(chuàng)建索引命令
idx:goods:索引名稱(chēng)
on hash:索引關(guān)聯(lián)的數(shù)據(jù)類(lèi)型,這里指定索引基于 hash 類(lèi)型的源數(shù)據(jù)構(gòu)建
prefix 1 "goods:":表示索引關(guān)聯(lián)的 hash 類(lèi)型源數(shù)據(jù)前綴是 goods:
language chinese:表示支持中文語(yǔ)言分詞
schema goodsName text sortable:表示字段定義,goodsName 表示元數(shù)據(jù)屬性名,text 表示字段類(lèi)型 sortable 表示該字段可以用于排序
添加索引時(shí),直接使用 hset 命令添加一個(gè) key 前綴是 "goods:" 的源數(shù)據(jù)。如下,
hsetgoods:1001goodsName小米手機(jī) hsetgoods:1002goodsName華為手機(jī)
FT.SEARCH 查詢(xún)索引
>FT.SEARCHidx:goods1"手機(jī)" 1)"2" 2)"goods:1001" 3)1)"goodsName" 2)"xe5xb0x8fxe7xb1xb3xe6x89x8bxe6x9cxba" 4)"goods:1002" 5)1)"goodsName" 2)"xe5x8dx8exe4xb8xbaxe6x89x8bxe6x9cxba"
FT.INFO 查詢(xún)指定名稱(chēng)索引信息
>FT.INFOidx:goods 1)"index_name" 2)"idx:goods1" 3)"index_options" 4)(emptylistorset) 5)"index_definition" 6)1)"key_type" 2)"HASH" 3)"prefixes" 4)1)"goods:" 5)"default_language" 6)"chinese" 7)"default_score" 8)"1" 7)"attributes" 8)1)1)"identifier" 2)"goodsName" 3)"attribute" 4)"goodsName" 5)"type" 6)"TEXT" 7)"WEIGHT" 8)"1" 9)"SORTABLE" ...
FT.INFO 查詢(xún)指定名稱(chēng)的索引信息
FT.DROPINDEX 刪除索引名稱(chēng)
>FT.DROPINDEXidx:goods1 "OK"
FT.DROPINDEX 刪除指定名稱(chēng)索引,不會(huì)刪除 hash 類(lèi)型的源數(shù)據(jù)
如果需要?jiǎng)h除索引數(shù)據(jù),直接使用 del 命令刪除索引關(guān)聯(lián)的源數(shù)據(jù)即可。
Java 使用 RediSearch
對(duì)于 Java 項(xiàng)目直接選用 Jedis4.0 以上版本就可以使用 RediSearch 提供的搜索功能,Jedis 在 4.0 以上版本自動(dòng)支持 RediSearch,編寫(xiě) Jedis 連接 RedisSearch 測(cè)試用例,用 RedisSearch 命令創(chuàng)建如下,
Jedis 創(chuàng)建 RediSearch 客戶(hù)端
@Bean publicUnifiedJedisunifiedJedis(GenericObjectPoolConfigjedisPoolConfig){ UnifiedJedisclient; if(StringUtils.isNotEmpty(password)){ client=newJedisPooled(jedisPoolConfig,host,port,timeout,password,database); }else{ client=newJedisPooled(jedisPoolConfig,host,port,timeout,null,database); } returnclient; }
Jedis 創(chuàng)建索引
Schemaschema=newSchema() .addSortableTextField("goodsName",1.0) .addSortableTagField("tag","|"); IndexDefinitionrule=newIndexDefinition(IndexDefinition.Type.HASH) .setPrefixes("idx:goods") .setLanguage("chinese");#設(shè)置支持中文分詞 client.ftCreate(idxName, IndexOptions.defaultOptions().setDefinition(rule), schema);
Jedis 添加索引源數(shù)據(jù)
publicbooleanaddGoodsIndex(StringkeyPrefix,Goodsgoods){ Maphash=MyBeanUtil.toMap(goods); hash.put("_language","chinese"); client.hset("idx:goods"+goods.getGoodsId(),MyBeanUtil.toMap(goods)); returntrue; }
Jedis 中文查詢(xún)
publicSearchResultsearch(StringgoodsIdxName,SearchObjVOsearchObjVO,Pagepage){ //查詢(xún)關(guān)鍵字 Stringkeyword=searchObjVO.getKeyword(); StringqueryKey=String.format("@goodsName:(%s)",keyword); Queryq=newQuery(queryKey); Stringsort=searchObjVO.getSidx(); Stringorder=searchObjVO.getOrder(); //查詢(xún)是否排序 if(StringUtils.isNotBlank(sort)){ q.setSortBy(sort,Constants.SORT_ASC.equals(order)); } //設(shè)置中文分詞查詢(xún) q.setLanguage("chinese"); //設(shè)置分頁(yè) q.limit((int)page.offset(),(int)page.getSize()); //返回查詢(xún)結(jié)果 returnclient.ftSearch(goodsIdxName,q); }
最后聊兩句
RediSearch 是這幾年新出的一個(gè)全文搜索引擎,借助于 Redis 的成功,RediSearch 一出場(chǎng)就獲得了較高的關(guān)注度。
目前來(lái)看,我個(gè)人使用 RediSearch 作為項(xiàng)目的全文搜索引擎已經(jīng)夠用了,它有易于安裝、索引占用內(nèi)存低、查詢(xún)速度快等許多優(yōu)點(diǎn)。不過(guò)在對(duì) Redis 集群的支持上,RediSearch 目前只針對(duì) Redis 企業(yè)版有解決方案,開(kāi)源版還沒(méi)有,這一點(diǎn)需要告訴大家。
如果想要在生產(chǎn)環(huán)境大規(guī)模使用,我還是不太建議的。
審核編輯:劉清
-
生成器
+關(guān)注
關(guān)注
7文章
315瀏覽量
21011 -
Hash
+關(guān)注
關(guān)注
0文章
32瀏覽量
13200 -
Redis
+關(guān)注
關(guān)注
0文章
375瀏覽量
10878
原文標(biāo)題:換掉ES!Redis官方搜索引擎來(lái)了,性能炸裂!
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論