Redis Tag 字段詳解與最佳實(shí)踐
一、引言
在 RediSearch 中,Tag 字段(標(biāo)簽字段)是用來(lái)存儲(chǔ)離散、可枚舉值的高效索引類(lèi)型。與全文(TEXT)字段不同,Tag 字段將整段文本視作由分隔符分隔的“標(biāo)簽列表”,并針對(duì)每個(gè)標(biāo)簽做最小化索引,從而在內(nèi)存占用和查詢(xún)速度上都更具優(yōu)勢(shì)。本文將深入介紹 Tag 字段的工作原理、創(chuàng)建方式、查詢(xún)語(yǔ)法,以及常見(jiàn)場(chǎng)景下的最佳實(shí)踐與注意事項(xiàng)。
二、Tag 字段核心特點(diǎn)
簡(jiǎn)單分詞
默認(rèn)使用逗號(hào)(,)或自定義分隔符,將整個(gè)字段拆分成若干獨(dú)立標(biāo)簽,不做復(fù)雜的詞干化或停用詞處理。高壓縮、低開(kāi)銷(xiāo)
索引中僅存儲(chǔ)文檔 ID 的增量編碼,不保存頻率或偏移信息,通常每項(xiàng)索引僅占 1–2 字節(jié)。只能通過(guò)專(zhuān)用語(yǔ)法查詢(xún)
普通的無(wú)字段全文搜索(FT.SEARCH foo)不會(huì)命中 Tag 字段,必須使用@field:{tag}語(yǔ)法。支持多達(dá) 1024 個(gè)字段
每個(gè)索引最多可定義 1024 個(gè) Tag 字段,滿足復(fù)雜場(chǎng)景需求。
三、創(chuàng)建 Tag 字段
FT.CREATE idx:products ON HASH PREFIX 1 product:
SCHEMA
name TEXT
price NUMERIC
tags TAG [SEPARATOR ";" ] [CASESENSITIVE]TAG:指定字段類(lèi)型為標(biāo)簽。SEPARATOR ";":可選,定義不同標(biāo)簽之間的分隔符,默認(rèn)為逗號(hào)(,)。CASESENSITIVE:可選,開(kāi)啟后標(biāo)簽大小寫(xiě)敏感,否則內(nèi)部會(huì)統(tǒng)一小寫(xiě)處理。
對(duì)于 JSON 索引,同樣需要顯式指定分隔符:
FT.CREATE idx:users ON JSON PREFIX 1 user:
SCHEMA
$.roles AS roles TAG SEPARATOR "|"四、查詢(xún) Tag 字段
4.1 基本語(yǔ)法
FT.SEARCH idx "@tags:{admin}"花括號(hào)
{}中列出要匹配的標(biāo)簽,可用管道符|表示「或」關(guān)系:FT.SEARCH idx "@tags:{admin|editor|viewer}"
4.2 多標(biāo)簽查詢(xún):并集與交集
并集(至少包含其一):在同一個(gè)
{}內(nèi)用|分隔:FT.SEARCH idx "@tags:{news|tech|sports}"交集(同時(shí)包含所有):將同一字段的多次過(guò)濾串聯(lián):
FT.SEARCH idx "@tags:{news} @tags:{tech} @tags:{sports}"
4.3 前綴匹配
Tag 字段支持星號(hào) * 作為通配:
FT.SEARCH idx "@tags:{adm*}" # 匹配所有以 adm 開(kāi)頭的標(biāo)簽
FT.SEARCH idx "@tags:{hello\ w*}" # 支持轉(zhuǎn)義空格后的通配注意:在終端或編程環(huán)境中,反斜杠需雙重轉(zhuǎn)義(例如
\\)。
五、標(biāo)簽中包含標(biāo)點(diǎn)與空格
標(biāo)簽本身可以包含除分隔符之外的任意可打印字符,包括空格和標(biāo)點(diǎn)。但在查詢(xún)時(shí),涉及下列情況需要轉(zhuǎn)義:
單引號(hào)
'、反斜杠\等特殊字符
使用反斜杠\轉(zhuǎn)義:FT.SEARCH idx "@tags:{Andrew\\'s Top 5}"空格
- 在 RediSearch ≥2.4 或 DIALECT ≥2 時(shí),標(biāo)簽內(nèi)空格無(wú)需額外轉(zhuǎn)義。
- 在老版本或 DIALECT=1 時(shí),需用反斜杠轉(zhuǎn)義空格。
六、實(shí)戰(zhàn)示例
索引創(chuàng)建
FT.CREATE travel ON HASH PREFIX 1 traveler: SCHEMA name TEXT cities TAG SEPARATOR ","數(shù)據(jù)插入
HSET traveler:1 name "Alice" cities "Paris,New York,Tokyo" HSET traveler:2 name "Bob" cities "London,New York"
查詢(xún)示例
訪問(wèn)過(guò)任意一座城市
FT.SEARCH travel "@cities:{New York|Paris}"同時(shí)訪問(wèn)過(guò)所有三座城市
FT.SEARCH travel "@cities:{Paris} @cities:{New York} @cities:{Tokyo}"
七、最佳實(shí)踐與注意事項(xiàng)
選擇合適的分隔符
根據(jù)標(biāo)簽數(shù)據(jù)特點(diǎn),避免分隔符與標(biāo)簽內(nèi)容沖突,例如使用;、|等。開(kāi)啟 CASESENSITIVE 或 NOSTEM
若標(biāo)簽是區(qū)分大小寫(xiě)或包含特殊格式,務(wù)必使用CASESENSITIVE;否則可默認(rèn)小寫(xiě)。索引覆蓋
若需返回標(biāo)簽列表本身,請(qǐng)?jiān)?LOAD或RETURN中顯式列出該字段,并在建索引時(shí)未遺漏。謹(jǐn)慎使用通配符
前綴通配符雖然靈活,但會(huì)帶來(lái)額外掃描開(kāi)銷(xiāo),影響查詢(xún)延遲。避免過(guò)度分片
雖可定義多達(dá) 1024 個(gè) Tag 字段,但每個(gè)字段都占用索引空間,根據(jù)應(yīng)用場(chǎng)景合理規(guī)劃字段數(shù)。
八、總結(jié)
Redis Tag 字段以其內(nèi)存壓縮、查詢(xún)高效的特點(diǎn),非常適合存儲(chǔ)和檢索離散枚舉值。通過(guò)合理設(shè)計(jì)分隔符、開(kāi)啟必要選項(xiàng)、并掌握查詢(xún)語(yǔ)法中的并集/交集及通配符用法,您可以在多種業(yè)務(wù)場(chǎng)景(如分類(lèi)過(guò)濾、權(quán)限標(biāo)簽、地域分組等)下,獲得極佳的查詢(xún)性能和低內(nèi)存占用。希望本文能幫助您快速上手 Redis Tag 字段并應(yīng)用于生產(chǎn)環(huán)境中。
到此這篇關(guān)于Redis Tag 字段詳解與最佳實(shí)踐的文章就介紹到這了,更多相關(guān)Redis Tag 字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入解析Redis中常見(jiàn)的應(yīng)用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于Redis中常見(jiàn)的應(yīng)用場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
Linux中設(shè)置Redis開(kāi)機(jī)啟動(dòng)的方法
這篇文章主要給大家介紹了關(guān)于Linux中設(shè)置Redis開(kāi)機(jī)啟動(dòng)的方法,主要包括在CentOS7.0系統(tǒng)和Debian 8.0系統(tǒng)下實(shí)現(xiàn)方法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-04-04
基于redis實(shí)現(xiàn)分布式鎖的原理與方法
這篇文章主要給大家介紹了基于redis實(shí)現(xiàn)分布式鎖的原理與方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Redis分布式鎖升級(jí)版RedLock及SpringBoot實(shí)現(xiàn)方法
這篇文章主要介紹了Redis分布式鎖升級(jí)版RedLock及SpringBoot實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
redission分布式鎖防止重復(fù)初始化問(wèn)題
這篇文章主要介紹了redission分布式鎖防止重復(fù)初始化問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)
在我們的工作中,很多地方使用延遲隊(duì)列,比如訂單到期沒(méi)有付款取消訂單,制訂一個(gè)提醒的任務(wù)等都需要延遲隊(duì)列,那么我們需要實(shí)現(xiàn)延遲隊(duì)列,本文就來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2021-05-05
spring?boot整合redis中間件與熱部署實(shí)現(xiàn)代碼
spring?boot整合redis最常用的有三個(gè)工具庫(kù)Jedis,Redisson,Lettuce,本文重點(diǎn)介紹spring?boot整合redis中間件與熱部署實(shí)現(xiàn),需要的朋友可以參考下2023-01-01

