分词

控制文本分词和转义

全文搜索通过将查询中的单词、URL、数字和其他元素与每个文档的可搜索字段中的文本进行比较来工作。然而,将查询的整个文本与每个字段的整个文本反复比较会非常低效,因此搜索系统不会这样做。相反,在索引过程中,它将文档文本分割成称为标记的短而有意义的部分,并将这些标记存储为文档索引数据的一部分。

在搜索过程中,查询系统还会对查询文本进行分词,然后简单地将查询中的词与每个文档中存储的词进行比较。这种匹配方式比在整个文本上进行模式匹配要高效得多,并且还允许你使用 词干提取停用词 来进一步改善搜索效果。有关这些概念的详细介绍,请参阅这篇关于 分词 的文章。

Redis Stack 对文档使用非常简单的分词器,对查询使用稍微复杂一些的分词器。两者都允许一定程度上的字符串转义和分词控制。

以下部分描述了文本字段和查询的分词规则。 请注意, 标签字段 本质上是文本字段,但它们使用更简单的分词形式,如 标签字段的分词规则部分所述。

文本字段的分词规则

  1. 所有的标点符号和空白字符(除了下划线)将文档和查询分隔成标记。例如,任何字符如,.<>{}[]"':;!@#$%^&*()-+=~都会将文本分割成术语,因此文本foo-bar.baz...bag将被标记化为[foo, bar, baz, bag]

  2. 在查询和文档中转义分隔符是通过在任何分隔符前加上反斜杠来完成的。例如,文本hello\-world hello-world将被标记化为[hello-world, hello, world]。在大多数语言中,您需要一个额外的反斜杠来表示格式化文档或查询时的实际反斜杠,因此输入到redis-cli的实际文本将是hello\\-world

  3. 下划线(_)在文档或查询中不用作分隔符,因此文本hello_world在分词后将保持不变。

  4. 重复的空格或标点符号会被去除。

  5. 拉丁字符被转换为小写。

  6. 在第一个数字前加反斜杠会将其标记为一个术语。这将把-符号翻译为NOT,否则会使数字变为负数。如果你在搜索浮点数,请在.前加反斜杠。例如,-20 -> {-20} vs -\20 -> {NOT{20}}

标签字段的分词规则

Tag fields 将 一个文本字段解释为由 separator 字符(默认为逗号“,”)分隔的 标签列表。分词器只需在找到分隔符的地方拆分文本,因此大多数 标点符号和空格在每个标签标记内都是有效字符。分词器对标签所做的唯一 更改是:

  • 修剪标签开头和结尾的空白。标签文本中的其他空白保持不变。
  • 将拉丁字母字符转换为小写。您可以通过在标签字段的索引模式中添加CASESENSITIVE选项来覆盖此设置。

这意味着当你定义一个标签字段时,你不需要转义任何字符,除非在特殊情况下,你希望前导或尾随空格成为标签文本的一部分。然而,在对标签字段进行查询时,你确实需要转义某些字符。有关此内容的更多信息,请参见查询语法

RATE THIS PAGE
Back to top ↑