4.查询数据

数据库包含一些电影和索引,现在可以执行一些查询。

查询#

例子:所有包含字符串的电影战争"

> FT.SEARCH idx:电影《战争》
1) (整数)2
2) “电影:11005”
3) 1)“标题”
2) 《星球大战:第六集-绝地归来》
...
14) “tt0086190”
4)“电影:11002”
5) 1)“标题”
2) “星球大战:第五集-帝国反击”
...
13)“imdb_id”
14) “tt0080684”

FT.SEARCH命令返回一个结果列表,首先是结果数,然后是元素列表(键和字段)。

正如你所看到的电影《星球大战5:帝国反击战》,即使你只使用了单词“war”来匹配标题中的“Wars”。这是因为标题已经被索引为文本,所以字段是标记化的

稍后在更详细地查看查询语法时,您将了解有关搜索功能的更多信息。

还可以使用回来参数,让我们运行相同的查询,并只返回title和release_year:

>FT.SEARCH idx:电影《战争》回归2片名发布年份
1) (整数)2
2) “电影:11005”
3) 1)“标题”
2) 《星球大战:第六集-绝地归来》
3) “发布年份”
4) "1983"
4)“电影:11002”
5) 1)“标题”
2) “星球大战:第五集-帝国反击”
3) “发布年份”
4) "1980"

这个查询没有指定任何“字段”,仍然返回一些电影,这是因为RediSearch将在默认情况下搜索所有TEXT字段。在当前索引中,只有标题作为TEXT字段显示。稍后您将看到如何更新索引,向其添加更多字段。

如果需要对特定字段执行查询,可以使用@field:语法,例如:

> FT.SEARCH idx:电影“@标题:战争”返回2标题发布年

例子:所有包含字符串的电影战争但不是绝地武士一个“

添加字符串-绝地武士(minus)将要求查询引擎不要返回包含绝地武士

> FT.SEARCH idx:电影“战争-绝地武士”返回2标题发布年
1) (整数)1
2)“电影:11002”
3) 1)“标题”
2) “星球大战:第五集-帝国反击”
3) “发布年份”
4) "1980"

例子:所有包含字符串的电影gdfather使用模糊搜索”

正如您所看到的,单词教父包含一个speelling错误,但是可以使用模糊匹配.模糊匹配是基于Levenshtein距离(LD)。

> FT.SEARCH idx:movie " %gdfather% " RETURN 2 title release_year
1) (整数)1
2)“电影:11003”
3) 1)“标题”
2) “教父”
3) “发布年份”
4) "1972"

例子:所有惊悚片电影”

这个体裁字段被索引为TAG,并允许精确匹配查询。

查询标记字段的语法是@field_name:{value}

>FT.SEARCH idx:movie“@genre:{Thriller}”RETURN 2片名发布年份
1) (整数)1
2) “电影:11004”
3) 1)“标题”
2) “热”
3) “发布年份”
4) "1995"

例子:所有惊悚片行动电影”

>FT.SEARCH idx:movie“@genre:{Thriller | Action}”返回2年标题发布
1) (整数)3
2) “电影:11004”
3) 1)“标题”
2) “热”
3) “发布年份”
4) "1995"
4)“电影:11005”
5) 1)“标题”
2) 《星球大战:第六集-绝地归来》
3) “发布年份”
4) "1983"
6) “电影:11002”
7) 1)“标题”
2) “星球大战:第五集-帝国反击”
3) “发布年份”
4) "1980"

您可以在中找到有关标记过滤器的更多信息的文档


例子:所有惊悚片行动没有的电影绝地武士标题中“

> FT.SEARCH idx:movie "@genre:{Thriller|Action} @title:-jedi" RETURN 2 title release e_year
1) (整数)2
2) “电影:11004”
3) 1)“标题”
2) “热”
3) “发布年份”
4) "1995"
4)“电影:11002”
5) 1)“标题”
2) “星球大战:第五集-帝国反击”
3) “发布年份”
4) "1980"

例子:所有在1970年至1980年间上映的电影(包括在内)

FT.SEARCH语法有两种查询数字字段的方法:

  • 使用滤器参数

  • 使用@field在查询字符串中。
>FT.SEARCH idx:movie*FILTER release\u year 1970 1980 RETURN 2 title release\u year
> FT.SEARCH idx:movie "@release_year:[1970 1980]" RETURN 2 title release_year
1) (整数)2
2)“电影:11003”
3) 1)“标题”
2) “教父”
3) “发布年份”
4) "1972"
4)“电影:11002”
5) 1)“标题”
2) “星球大战:第五集-帝国反击”
3) “发布年份”
4) "1980"

要排除某个值,请在其前面加上(在筛选器或查询字符串中,例如要排除:

>FT.SEARCH idx:movie“@release_year:[1970(1980)]返回2个标题发布年

插入、更新、删除和过期文档#

作为本教程的一部分,你有:

  1. 创建了一些电影,如Redis哈希(我们称之为文件)使用以下键模式电影:*
  2. 属性创建索引创建命令
  3. 使用FT.SEARCH

在创建索引时,使用idx:movie ON hash PREFIX 1 "movie:"参数时,您将要求索引引擎查看所有现有键并为它们建立索引。

此外,匹配此模式/类型的新信息也将被索引。

让我们数一下电影的数量,添加一个新的,然后再数一遍:

>FT.SEARCH idx:电影“*”限制0
1) (整数)4
HSET电影:11033个标题“明天永不死”的情节“詹姆斯·邦德开始阻止媒体大亨的计划,以引发中国和英国之间的战争,以获得独家全球媒体报道。”RelaseEY 1997年份“行动”评级6.5票177732 IMBDIDID TT0120
>FT.SEARCH idx:电影“*”限制0
1) (整数)5

这部新电影已编入索引。你也可以搜索任何索引字段:

> FT.SEARCH idx:movie "never" RETURN 2 title release_year
1) (整数)1
2)“电影:11033”
3) 1)“标题”
2) “明天永不消逝”
3) “发布年份”
4) "1997"

现在你使现代化其中一个字段,并搜索007

>HSET电影:11033片名“明天永不消逝-007”
> FT.SEARCH idx:电影“007”返回2标题发布年
1) (整数)1
2)“电影:11033”
3) 1)“标题”
2) “明天永不消逝-007”
3) “发布年份”
4) "1997"

当你删除当键过期(TTL-Time To Live)时,也会更新索引。

例如,设置詹姆斯·邦德电影在20秒内过期:

> EXPIRE "movie:11033" 20

您可以运行以下查询,您将看到文档在20秒后过期,搜索查询不会返回任何结果,显示索引已更新。

> FT.SEARCH idx:电影“007”返回2标题发布年
1)(整数)

注意:当您使用Redis作为主数据库时,不一定使用TTLs来删除记录。但是,如果您存储和索引的数据是暂时的,例如另一个数据存储或Web服务顶部的缓存层,则查询用户会话内容。。。这通常被限定为“一个”短暂的搜索用例:轻量级、快速和过期。


更多的#

您可以在文档中找到许多有关索引和搜索的附加功能:

让我们看看如何检查、修改和删除索引。

Baidu