标签
有关标记字段的详细信息
标记字段类似于全文字段,但它们将文本解释为简单的 由分隔符分隔的标签列表(默认为逗号 “,”)。 此限制意味着标记字段可以在索引中使用更简单的分词和编码,这比全文索引更有效。
标记字段中的值无法通过常规无字段搜索来访问,并且只能与特殊语法一起使用。
标记字段和全文字段之间的主要区别是:
-
标记化对于标记来说非常简单。
-
不对标签索引执行词干提取。
-
无法从常规全文搜索中找到标记。如果文档具有名为 “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 ";"
您可以组合 title 字段上的全文搜索、price 上的数字范围,并匹配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* }"
单个筛选条件中的多个标签
请注意,在同一子句中包含多个标记将创建包含任何包含的标记的所有文档的联合。要创建包含所有给定标签的文档的交集,您应该多次重复标签过滤器。
例如,假设有一个 travelers 索引,其中包含每个 traveler 访问过的城市的 tag 字段:
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 }"
在标签中包含标点符号和空格
标记字段可以包含除字段分隔符之外的任何标点字符。 在定义标记字段时,可以使用标点符号而不转义。 但是在查询字段时,通常需要对某些字符进行转义 因为 Query 语法本身使用相同的字符。 (有关需要转义的完整字符集,请参阅 Query syntax.)
例如,给定以下索引:
FT.CREATE punctuation ON HASH PREFIX 1 test: SCHEMA tags TAG
您可以添加包含标点符号的标签,如下所示:
HSET test:1 tags "Andrew's Top 5,Justin's Top 5"
但是,在查询这些标签时,必须转义标点符号
带有反斜杠 ()。因此,查询标签\
Andrew's Top 5
在redis-cli
如下所示:
FT.SEARCH punctuation "@tags:{ Andrew\\'s Top 5 }"
(请注意,此处需要双反斜杠,因为终端应用程序本身 使用反斜杠作为转义字符。 编程语言通常也使用此约定。
您可以在标记过滤器中包含空格而不转义,除非您是 使用早于 v2.4 的 RediSearch 版本,或者您使用的是查询方言 1。 有关完整说明,请参阅 查询语法 。