分词

控制文本分词和转义

全文搜索通过将查询中的单词、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}}

标签字段的词元化规则

标签字段将文本字段解释为由分隔符字符(默认情况下为逗号 ",")分隔的标签列表。词元化器只需在找到分隔符的地方将文本分割,因此大多数标点符号和空白字符在每个标签词元中都是有效字符。词元化器对标签所做的唯一更改是

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

这意味着,在定义标签字段时,您无需对任何字符进行转义,除非您在特殊情况下希望将开头或结尾的空格作为标签文本的一部分。但是,您需要在对标签字段进行查询时对某些字符进行转义。有关此方面的更多信息,请参阅查询语法

RATE THIS PAGE
Back to top ↑