分词
控制文本分词和转义
全文搜索通过将查询中的词、URL、数字和其他元素与每个文档的可搜索字段中的文本进行比较来工作。然而,一遍又一遍地将整个查询文本与每个字段的整个文本进行比较效率极低,因此搜索系统不会这样做。相反,它在索引过程中将文档文本分割成称为词元的简短、有意义的部分,并将这些词元作为文档索引数据的一部分存储起来。
在搜索过程中,查询系统也会对查询文本进行分词,然后只需将查询中的词元与为每个文档存储的词元进行比较。这种匹配方法比在整个文本上进行模式匹配效率高得多,而且还允许您使用词干提取和停用词来进一步改进搜索。有关这些概念的通用介绍,请参阅这篇关于分词的文章。
Redis 对文档使用非常简单的分词器,而对查询使用稍微复杂一些的分词器。两者都允许在一定程度上控制字符串转义和分词。
以下部分描述了文本字段和查询的分词规则。请注意,标签字段本质上是文本字段,但它们使用一种更简单的分词形式,这在标签字段的分词规则部分中单独描述。
文本字段的分词规则
-
所有标点符号和空白字符(下划线除外)将文档和查询分隔成词元。例如,任何字符
,.<>{}[]"':;!@#$%^&*()-+=~
都会将文本分解成词项,所以文本foo-bar.baz...bag
将被分词为[foo, bar, baz, bag]
-
在查询和文档中转义分隔符的方法是在任何分隔符前加上一个反斜杠。例如,文本
hello\-world hello-world
将被分词为[hello-world, hello, world]
。在大多数语言中,格式化文档或查询时需要额外的反斜杠来表示实际的反斜杠,因此输入到 redis-cli 中的实际文本将是hello\\-world
。 -
下划线(
_
)在文档或查询中均不作为分隔符使用,因此文本hello_world
在分词后将保持原样。 -
重复的空格或标点符号将被剥离。
-
拉丁字符被转换为小写。
-
在第一个数字之前的反斜杠会将其分词为一个词项。这将把
-
符号翻译为 NOT,否则它会使数字变为负数。如果您要搜索浮点数,请在.
之前添加反斜杠。例如,-20 -> {-20} 与 -\20 -> {NOT{20}}
。
标签字段的分词规则
标签字段将文本字段解释为由分隔符字符(默认为逗号 ",")分隔的标签列表。分词器简单地在找到分隔符的地方分割文本,因此大多数标点符号和空白字符在每个标签词元内都是有效字符。分词器对标签所做的唯一更改是
- 修剪标签开头和结尾的空白。标签文本中的其他空白保持不变。
- 将拉丁字母转换为小写。您可以通过在标签字段的索引模式中添加
CASESENSITIVE
选项来覆盖此设置。
这意味着当您定义标签字段时,您无需转义任何字符,除非在您希望前导或尾随空格成为标签文本一部分的特殊情况下。然而,在针对标签字段的查询中,您确实需要转义某些字符。有关转义以及如何使用 DIALECT 2 的更多信息,请参阅查询语法和精确匹配页面,DIALECT 2 是涉及标签的精确匹配查询所必需的。