标签
关于标签字段的详细信息
标签字段类似于全文字段,但它们将文本解释为由 分隔符 字符(默认情况下为逗号 ",")分隔的简单标签列表。此限制意味着标签字段可以使用更简单的 分词 和索引编码,这比全文索引更有效。
标签字段中的值无法通过常规的无字段搜索访问,只能使用特殊的语法。
标签字段和全文字段之间的主要区别在于
-
分词 对于标签非常简单。
-
在标签索引上不执行词干提取。
-
无法从常规全文搜索中找到标签。如果文档有一个名为“tags”的字段,其值为“foo”和“bar”,则在没有特殊标签修饰符(见下文)的情况下搜索 foo 或 bar 不会返回此文档。
-
索引更加简单,压缩率更高:不再存储字段标志的频率或偏移向量。索引仅包含作为增量编码的文档 ID。这意味着标签索引中的条目通常只有 1 或 2 个字节长。这使得它们非常节省内存且速度快。
-
每个索引最多可以创建 1024 个标签字段。
创建标签字段
可以使用以下语法将标签字段添加到模式中
FT.CREATE ... SCHEMA ... {field_name} TAG [SEPARATOR {sep}] [CASESENSITIVE]
对于哈希,SEPARATOR 可以是任何可打印的 ASCII 字符;默认值为逗号 (,
)。对于 JSON,没有默认分隔符;如果需要,您必须显式声明一个。
例如
JSON.SET key:1 $ '{"colors": "red, orange, yellow"}'
FT.CREATE idx on JSON PREFIX 1 key: SCHEMA $.colors AS colors TAG SEPARATOR ","
> FT.SEARCH idx '@colors:{orange}'
1) "1"
2) "key:1"
3) 1) "$"
2) "{\"colors\":\"red, orange, yellow\"}"
可以指定 CASESENSITIVE 以保留原始大小写。
查询标签字段
如上所述,仅搜索标签而不使用任何修饰符将不会检索包含该标签的文档。
查询中匹配标签的语法如下(花括号是语法的一部分)
@<field_name>:{ <tag> | <tag> | ...}
例如,此查询查找包含标签 hello world
或 foo bar
的文档
FT.SEARCH idx "@tags:{ hello world | foo bar }"
标签子句可以组合到任何子句中,用作否定表达式、可选表达式等。例如,给定以下索引
FT.CREATE idx ON HASH PREFIX 1 test: SCHEMA title TEXT price NUMERIC tags TAG SEPARATOR ";"
您可以将标题字段上的全文搜索、价格上的数字范围和匹配 foo bar
或 hello world
标签组合在一起,如下所示
FT.SEARCH idx "@title:hello @price:[0 100] @tags:{ foo bar | hello world }
标签支持使用常规的 *
字符进行前缀匹配
FT.SEARCH idx "@tags:{ hell* }"
FT.SEARCH idx "@tags:{ hello\\ w* }"
单个过滤器中的多个标签
请注意,在同一个子句中包含多个标签会创建包含所有包含标签的文档的并集。要创建包含所有给定标签的文档的交集,您应该多次重复标签过滤器。
例如,想象一个旅行者索引,其中包含一个标签字段,用于表示每个旅行者访问过的城市
FT.CREATE myIndex ON HASH PREFIX 1 traveler: SCHEMA name TEXT cities TAG
HSET traveler:1 name "John Doe" cities "New York, Barcelona, San Francisco"
对于此索引,以下查询将返回所有访问过以下城市中至少一个城市的人员
FT.SEARCH myIndex "@cities:{ New York | Los Angeles | Barcelona }"
但下一个查询将返回所有访问过所有三个城市的人员
FT.SEARCH myIndex "@cities:{ New York } @cities:{Los Angeles} @cities:{ Barcelona }"
在标签中包含标点符号和空格
标签字段可以包含除字段分隔符以外的任何标点符号。您可以在定义标签字段时使用标点符号而不进行转义,但在查询字段时通常需要转义某些字符,因为查询语法本身使用相同的字符。(有关需要转义的完整字符集,请参阅 查询语法。)
例如,给定以下索引
FT.CREATE punctuation ON HASH PREFIX 1 test: SCHEMA tags TAG
您可以添加包含标点符号的标签,如下所示
HSET test:1 tags "Andrew's Top 5,Justin's Top 5"
但是,当您查询这些标签时,必须使用反斜杠 (\
) 转义标点符号。因此,在 redis-cli
中查询标签 Andrew's Top 5
看起来像这样
FT.SEARCH punctuation "@tags:{ Andrew\\'s Top 5 }"
(请注意,您在这里需要双反斜杠,因为终端应用程序本身使用反斜杠作为转义字符。编程语言通常也使用此约定。)
您可以在标签过滤器中包含空格而不进行转义,除非您使用的是早于 v2.4 的 RediSearch 版本,或者您正在使用 查询方言 1。有关完整说明,请参阅 查询语法。