Redis Tag 字段詳解與最佳實踐
一、引言
在 RediSearch 中,Tag 字段(標(biāo)簽字段)是用來存儲離散、可枚舉值的高效索引類型。與全文(TEXT)字段不同,Tag 字段將整段文本視作由分隔符分隔的“標(biāo)簽列表”,并針對每個標(biāo)簽做最小化索引,從而在內(nèi)存占用和查詢速度上都更具優(yōu)勢。本文將深入介紹 Tag 字段的工作原理、創(chuàng)建方式、查詢語法,以及常見場景下的最佳實踐與注意事項。
二、Tag 字段核心特點
簡單分詞
默認(rèn)使用逗號(,
)或自定義分隔符,將整個字段拆分成若干獨立標(biāo)簽,不做復(fù)雜的詞干化或停用詞處理。高壓縮、低開銷
索引中僅存儲文檔 ID 的增量編碼,不保存頻率或偏移信息,通常每項索引僅占 1–2 字節(jié)。只能通過專用語法查詢
普通的無字段全文搜索(FT.SEARCH foo)不會命中 Tag 字段,必須使用@field:{tag}
語法。支持多達(dá) 1024 個字段
每個索引最多可定義 1024 個 Tag 字段,滿足復(fù)雜場景需求。
三、創(chuàng)建 Tag 字段
FT.CREATE idx:products ON HASH PREFIX 1 product: SCHEMA name TEXT price NUMERIC tags TAG [SEPARATOR ";" ] [CASESENSITIVE]
TAG
:指定字段類型為標(biāo)簽。SEPARATOR ";"
:可選,定義不同標(biāo)簽之間的分隔符,默認(rèn)為逗號(,
)。CASESENSITIVE
:可選,開啟后標(biāo)簽大小寫敏感,否則內(nèi)部會統(tǒng)一小寫處理。
對于 JSON 索引,同樣需要顯式指定分隔符:
FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.roles AS roles TAG SEPARATOR "|"
四、查詢 Tag 字段
4.1 基本語法
FT.SEARCH idx "@tags:{admin}"
花括號
{}
中列出要匹配的標(biāo)簽,可用管道符|
表示「或」關(guān)系:FT.SEARCH idx "@tags:{admin|editor|viewer}"
4.2 多標(biāo)簽查詢:并集與交集
并集(至少包含其一):在同一個
{}
內(nèi)用|
分隔:FT.SEARCH idx "@tags:{news|tech|sports}"
交集(同時包含所有):將同一字段的多次過濾串聯(lián):
FT.SEARCH idx "@tags:{news} @tags:{tech} @tags:{sports}"
4.3 前綴匹配
Tag 字段支持星號 *
作為通配:
FT.SEARCH idx "@tags:{adm*}" # 匹配所有以 adm 開頭的標(biāo)簽 FT.SEARCH idx "@tags:{hello\ w*}" # 支持轉(zhuǎn)義空格后的通配
注意:在終端或編程環(huán)境中,反斜杠需雙重轉(zhuǎn)義(例如
\\
)。
五、標(biāo)簽中包含標(biāo)點與空格
標(biāo)簽本身可以包含除分隔符之外的任意可打印字符,包括空格和標(biāo)點。但在查詢時,涉及下列情況需要轉(zhuǎn)義:
單引號
'
、反斜杠\
等特殊字符
使用反斜杠\
轉(zhuǎn)義:FT.SEARCH idx "@tags:{Andrew\\'s Top 5}"
空格
- 在 RediSearch ≥2.4 或 DIALECT ≥2 時,標(biāo)簽內(nèi)空格無需額外轉(zhuǎn)義。
- 在老版本或 DIALECT=1 時,需用反斜杠轉(zhuǎn)義空格。
六、實戰(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"
查詢示例
訪問過任意一座城市
FT.SEARCH travel "@cities:{New York|Paris}"
同時訪問過所有三座城市
FT.SEARCH travel "@cities:{Paris} @cities:{New York} @cities:{Tokyo}"
七、最佳實踐與注意事項
選擇合適的分隔符
根據(jù)標(biāo)簽數(shù)據(jù)特點,避免分隔符與標(biāo)簽內(nèi)容沖突,例如使用;
、|
等。開啟 CASESENSITIVE 或 NOSTEM
若標(biāo)簽是區(qū)分大小寫或包含特殊格式,務(wù)必使用CASESENSITIVE
;否則可默認(rèn)小寫。索引覆蓋
若需返回標(biāo)簽列表本身,請在LOAD
或RETURN
中顯式列出該字段,并在建索引時未遺漏。謹(jǐn)慎使用通配符
前綴通配符雖然靈活,但會帶來額外掃描開銷,影響查詢延遲。避免過度分片
雖可定義多達(dá) 1024 個 Tag 字段,但每個字段都占用索引空間,根據(jù)應(yīng)用場景合理規(guī)劃字段數(shù)。
八、總結(jié)
Redis Tag 字段以其內(nèi)存壓縮、查詢高效的特點,非常適合存儲和檢索離散枚舉值。通過合理設(shè)計分隔符、開啟必要選項、并掌握查詢語法中的并集/交集及通配符用法,您可以在多種業(yè)務(wù)場景(如分類過濾、權(quán)限標(biāo)簽、地域分組等)下,獲得極佳的查詢性能和低內(nèi)存占用。希望本文能幫助您快速上手 Redis Tag 字段并應(yīng)用于生產(chǎn)環(huán)境中。
到此這篇關(guān)于Redis Tag 字段詳解與最佳實踐的文章就介紹到這了,更多相關(guān)Redis Tag 字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
異步redis隊列實現(xiàn) 數(shù)據(jù)入庫的方法
今天小編就為大家分享一篇異步redis隊列實現(xiàn) 數(shù)據(jù)入庫的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10Redis快速實現(xiàn)分布式session的方法詳解
Session是客戶端與服務(wù)器通訊會話跟蹤技術(shù),服務(wù)器與客戶端保持整個通訊的會話基本信息。本文主要介紹了Redis快速實現(xiàn)分布式session的方法,感興趣的可以學(xué)習(xí)一下2022-01-01Redis出現(xiàn)(error)NOAUTH?Authentication?required.報錯的解決辦法(秒懂!)
這篇文章主要給大家介紹了關(guān)于Redis出現(xiàn)(error)NOAUTH?Authentication?required.報錯的解決辦法,對于 這個錯誤這通常是因為Redis服務(wù)器需要密碼進(jìn)行身份驗證,但客戶端沒有提供正確的身份驗證信息導(dǎo)致的,需要的朋友可以參考下2024-03-03ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式)
這篇文章主要介紹了ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式),需要的朋友可以參考下2018-03-03