分词化
控制文本分词和转义
全文搜索的工作原理是比较查询的单词、URL、数字和其他元素 针对每个文档的可搜索字段中的文本。然而 将查询的整个文本与 每个字段的整个文本,因此搜索系统不会执行此作。 相反,它将文档文本拆分为简短的重要部分 调用令牌,并将令牌存储为文档的 索引数据。
在搜索过程中,查询系统还会对 query 文本,然后简单地将查询中的标记与存储的标记进行比较 对于每个文档。查找这样的匹配项比 pattern matching 要高效得多 整个文本还允许您使用词干提取和停用词来进一步改进搜索。有关概念的一般介绍,请参阅这篇关于 Tokenization 的文章。
Redis Stack 对文档使用非常简单的分词器,对查询使用稍微复杂的分词器。两者都允许对字符串转义和分词化进行一定程度的控制。
以下部分介绍了对文本字段和查询进行分词的规则。 请注意,标记字段本质上是文本字段,但它们使用更简单的标记化形式,如前所述 在 Tokenization rules for tag fields 部分中。
文本字段的分词规则
-
所有标点符号和空格(下划线除外)将文档和查询分隔为标记。例如,
,.<>{}[]"':;!@#$%^&*()-+=~
将文本分解为多个术语,因此文本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} vs -\20 -> {NOT{20}}
.
标记字段的分词化规则
标记字段解释 一个文本字段,由分隔符(逗号 “,”,由 default) 的 S S分词器只是在找到分隔符的地方分割文本,因此大多数 标点符号和空格是每个标记标记中的有效字符。唯一的 分词器对标签所做的更改包括:
- 修剪标签开头和结尾的空格。标记文本中的其他空格保持不变。
- 将拉丁字母字符转换为小写。您可以通过添加
CASESENSITIVE
标记字段的索引架构中的选项。
这意味着,在定义 tag 字段时,无需转义任何字符,但 在您希望前导或尾随空格成为标签文本的一部分的不常见情况下。 但是,您确实需要对针对 tag 字段的查询中的某些字符进行转义。请参阅 查询语法 和 精确匹配 页面以了解有关转义的更多信息 以及如何使用 DIALECT 2,这是 涉及标记的完全匹配查询。