全文搜索

进行全文搜索

全文搜索是在较大文本中查找单词或短语。你可以在特定的文本字段中进行搜索,也可以跨所有文本字段进行搜索。

本文提供了对最相关的全文搜索功能的概述。有关所有全文搜索功能的详细信息,请查阅参考文档

本文中的示例使用了以下字段的模式:

字段名 字段类型
brand TEXT
model TEXT
description TEXT

单个词语

要在所有文本字段中搜索一个单词(或词干),你可以构造以下简单的查询:

  1. FT.SEARCH index "word"

如果你只想在特定的文本字段中进行搜索,而不是在所有文本字段中搜索,可以限制搜索范围:

  1. FT.SEARCH index "@field: word"

在自然语言中非常常见的词,如英语中的 thea,不会被索引,因此不会返回搜索结果。你可以在停用词文章中找到更多详细信息。

以下示例搜索所有在描述中包含“kids”这个词的自行车:

  1. FT.SEARCH idx:bicycle "@description: kids"

短语

短语是一个句子、句子片段或一小组单词。你可以在精确匹配文章中找到关于如何查找精确短语的更多详细信息。

单词前缀

你还可以搜索与给定前缀匹配的单词。

  1. FT.SEARCH index "prefix*"
  1. FT.SEARCH index "@field: prefix*"

前缀必须至少包含两个字符。

以下是一个示例,展示如何搜索品牌以 ‘ka’ 开头的自行车:

  1. FT.SEARCH idx:bicycle "@model: ka*"

单词后缀

与前缀类似,你也可以搜索具有相同后缀的单词。

  1. FT.SEARCH index "*suffix"

你还可以在查询表达式中结合前缀和后缀搜索。

  1. FT.SEARCH index "*infix*"

以下是一个示例,查找所有以 ‘bikes’ 结尾的品牌:

  1. FT.SEARCH idx:bicycle "@brand:*bikes"

模糊搜索

模糊搜索允许你查找与搜索词大致匹配的文档。要执行模糊搜索,你需要将搜索词用一对 % 字符括起来。一对 % 表示一个(Levenshtein)距离,两个 % 表示距离为二,三个 %,即最大距离,表示距离为三。

以下是搜索所有文本字段且距离为一的命令:

  1. FT.SEARCH index "%word%"

以下示例查找所有包含与拼写错误的单词 ‘optamized’ 相差一个字符的单词的文档。你可以看到它匹配了单词 ‘optimized’。

  1. FT.SEARCH idx:bicycle "%optamized%"

如果你想将最大单词距离增加到二,可以使用以下查询:

  1. FT.SEARCH idx:bicycle "%%optamised%%"

Unicode 注意事项

Redis 查询引擎只支持在基本多语言平面#Basic_Multilingual_Plane)中的 Unicode 字符;即 U+0000 到 U+FFFF。U+FFFF 以外的 Unicode 字符,如表情符号,不被支持,并且在以下使用场景中包含这些字符的查询将无法检索到:

  • 使用前缀/后缀/中缀查询 TEXT 字段
  • 使用模糊查询 TEXT 字段

示例:

  1. redis> FT.CREATE idx SCHEMA tag TAG text TEXT
  2. OK
  3. redis> HSET doc:1 tag '😀😁🙂' text '😀😁🙂'
  4. (integer) 2
  5. redis> HSET doc:2 tag '😀😁🙂abc' text '😀😁🙂abc'
  6. (integer) 2
  7. redis> FT.SEARCH idx '@text:(\*😀😁🙂)' NOCONTENT 1)
  8. (integer) 0
  9. redis> FT.SEARCH idx '@text:(\*😀😁🙂\*)' NOCONTENT 1)
  10. (integer) 0
  11. redis> FT.SEARCH idx '@text:(😀😁🙂\*)' NOCONTENT 1)
  12. (integer) 0
  13. redis> FT.SEARCH idx '@text:(%😀😁🙃%)' NOCONTENT 1)
  14. (integer) 0