标签

关于标签字段的详细信息

标签字段类似于全文搜索字段,但它们将文本解释为由分隔符字符(默认为逗号“,”)分隔的简单标签列表。这种限制意味着标签字段可以使用更简单的分词和索引编码,这比全文索引更有效率。

标签字段中的值无法通过一般的无字段搜索访问,只能使用特殊语法。

标签字段和全文搜索字段之间的主要区别是

  1. 分词对于标签来说非常简单。

  2. 标签索引上不执行词干提取。

  3. 无法通过一般的全文搜索找到标签。如果一个文档有一个名为“tags”的字段,其值为“foo”和“bar”,那么在没有特殊标签修饰符(见下文)的情况下搜索 foo 或 bar 将不会返回此文档。

  4. 索引更简单、更紧凑:不存储频率或字段标志的偏移向量。索引仅包含编码为增量的文档 ID。这意味着标签索引中的条目通常长一到两个字节。这使得它们非常节省内存且速度快。

  5. 每个索引最多可以创建 1024 个标签字段。

创建标签字段

标签字段可以使用以下语法添加到 schema 中

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 worldfoo 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 barhello 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 }"

(请注意,这里需要双反斜杠,因为终端应用程序本身使用反斜杠作为转义字符。编程语言通常也使用此约定。)

您可以在标签过滤器中包含空格而无需转义,除非您使用的 RediSearch 版本早于 v2.4,或者您使用的是查询方言 1。有关完整说明,请参阅查询语法

评价此页面
返回顶部 ↑