赞
踩
目录
Redis Search是一个Redis模块,它使用压缩的倒排索引来实现快速的索引和低内存占用。Redis Search可以对Redis数据进行精确短语匹配、模糊搜索、数值过滤、地理空间筛选等多种搜索功能。Redis Search还支持聚合、高亮、词干提取、拼写纠错等特性。
- //Redis Search文档地址
- https://redis.io/docs/interact/search-and-query/
RediSearch查询语言类似于SQL,但更加简洁和灵活。你可以使用RediSearch命令来创建索引、添加文档、搜索文档、更新文档、删除文档等。
elasticsearch是另一个流行的开源搜索引擎,它也支持全文搜索和聚合功能。那么,Redis Search和elasticsearch有什么区别和优势呢?
Redis Search是基于内存的,它可以提供更高的性能和更低的延迟。elasticsearch则是基于磁盘的,它需要依赖缓存来提高速度。
Redis Search是一个Redis模块,它可以直接在Redis中运行,无需额外的安装和配置。elasticsearch则需要单独部署和管理。
Redis Search支持多种扩展模块,如RedisJSON(用于处理JSON文档),RedisGraph(用于处理图数据),RedisTimeSeries(用于处理时间序列数据),RediSearch(用于处理全文搜索)等。elasticsearch则需要依赖插件来扩展其功能。
有多种方式可以安装和使用Redis Search,最简单的方式是使用Redis Stack Docker镜像,它已经集成了Redis和多个模块,包括Redis Search。只需运行一条命令,就可以在本地创建一个RediSearch容器:
$ docker run -p 6379:6379 redis/redis-stack-server:latest
要连接到这个实例,运行:
$ redis-cli
要使用Redis Search,你首先需要在Redis数据上声明索引,然后使用RediSearch查询语言来查询这些数据。
要创建一个索引,你需要使用FT.CREATE命令,并指定索引名、索引选项和字段名。例如,要创建一个名为blog的索引,用于存储博客文章的标题、内容和标签,你可以运行:
-
- 127.0.0.1:6379> FT.CREATE blog ON HASH PREFIX 1 blog: SCHEMA title TEXT WEIGHT 5.0 content TEXT WEIGHT 1.0 tags TAG SEPARATOR ","
- OK
这个命令会创建一个名为blog的索引,它会自动索引所有以blog:为前缀的散列键。它还会指定三个字段:title(文本类型,权重为5.0),content(文本类型,权重为1.0)和tags(标签类型,分隔符为逗号)。
要添加一个文档到索引中,你需要使用FT.ADD命令,并指定文档ID、字段值和分数。例如,要添加一篇博客文章到blog索引中,你可以运行:
-
- 127.0.0.1:6379> FT.ADD blog blog:1 1.0 FIELDS title "Hello Redis Search" content "This is a blog post about Redis Search, a query and full-text search engine for Redis." tags "redis,search"
- OK
这个命令会添加一个ID为blog:1的文档到blog索引中,并给它一个分数为1.0(默认为1.0)。它还会指定三个字段的值:title为"Hello Redis Search",content为"This is a blog post about Redis Search, a query and full-text search engine for Redis.“,tags为"redis,search”。
要搜索一个文档,你需要使用FT.SEARCH命令,并指定索引名和查询表达式。你可以使用多种查询语法,如精确匹配、模糊匹配、数值过滤、布尔运算等。例如,要搜索blog索引中包含"redis"或"search"的文档,你可以运行:
-
- 127.0.0.1:6379> FT.SEARCH blog "redis|search"
- 1) (integer) 1
- 2) "blog:1"
- 3) 1) "title"
- 2) "Hello Redis Search"
- 3) "content"
- 4) "This is a blog post about Redis Search, a query and full-text search engine for Redis."
- 5) "tags"
- 6) "redis,search"
这个命令会返回一个结果集,包含匹配的文档数量、文档ID和字段值。你可以使用LIMIT选项来分页查询,或者使用RETURN选项来指定返回哪些字段。
要更新一个文档,你需要使用FT.PARTIAL命令,并指定文档ID和要更新的字段值。例如,要更新blog:1文档的标题和标签,你可以运行:
-
- 127.0.0.1:6379> FT.PARTIAL blog blog:1 REPLACE FIELDS title "Hello RediSearch" tags "redis,search,full-text"
- OK
这个命令会更新blog:1文档的title和tags字段的值,并重新索引这些字段。
要删除一个文档,你需要使用FT.DEL命令,并指定文档ID。例如,要删除blog:1文档,你可以运行:
-
- 127.0.0.1:6379> FT.DEL blog blog:1
- (integer) 1
这个命令会从索引和数据库中删除blog:1文档,并返回删除的数量。
这里使用了NRediSearch和StackExchange.Redis两个库,实现在C#中使用Redis和RediSearch的功能。也可以把NRediSearch换为NRedisStack库,NRedisStack库基于 StackExchange.Redis 构建,旨在为 C# 生态系统提供对 Redis Stack 命令的原生支持。
-
- //项目地址:
- //NRedisStack
- https://github.com/redis/NRedisStack
- //NRediSearch
- https://github.com/StackExchange/NRediSearch
- //StackExchange.Redis
- https://github.com/StackExchange/StackExchange.Redis
以下demo中已添加详细注释,是基于本文中有关Redis Search使用样例的C#实现,大家可对比阅读。
-
- // 引入NRediSearch和StackExchange.Redis命名空间
- using NRediSearch;
- using StackExchange.Redis;
-
- public class RediSearchDemoProgram
- {
- private static void Main(string[] args)
- {
- // 创建一个连接到本地Redis实例的连接器
- ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
- // 获取一个数据库对象
- IDatabase db = redis.GetDatabase();
-
- // 创建一个名为blog的索引,用于存储博客文章的标题、内容和标签
- var client = new Client("blog", db); // 创建一个客户端对象
- client.CreateIndex(new Schema() // 创建一个索引对象
- .AddTextField("title", 5.0) // 文本类型,权重为5.0
- .AddTextField("content", 1.0) // 文本类型,权重为1.0
- .AddTagField("tags", ","), new Client.ConfiguredIndexOptions()); // 标签类型,分隔符为逗号
-
- // 添加一篇博客文章到blog索引中
- client.AddDocument(
- // 添加一个文档对象
- new Document("blog:1", new Dictionary<string, RedisValue> {
- { "title", "Hello Redis Search"},//设置标题字段
- { "content", "This is a blog post about Redis Search, a query and full-text search engine for Redis."}, // 设置内容字段
- { "tags", "redis,search"}, // 设置标签字段
- }));
-
- // 搜索blog索引中包含"redis"或"search"的文档
- var result = client.Search(new Query("redis|search")); // 创建一个查询对象
- Console.WriteLine(result.TotalResults); // 打印匹配的文档数量
- foreach (var doc in result.Documents)
- {
- Console.WriteLine(doc.Id); // 打印文档ID
- Console.WriteLine(doc["title"]); // 打印标题字段
- Console.WriteLine(doc["content"]); // 打印内容字段
- Console.WriteLine(doc["tags"]); // 打印标签字段
- }
-
- // 更新blog:1文档的标题和标签
- client.UpdateDocument("blog:1", new Dictionary<string, RedisValue> {
- { "title", "Hello RediSearch"},//更新标题字段
- { "tags", "redis,search,full-text"}, // 更新标签字段
- });
-
- // 删除blog:1文档
- client.DeleteDocument("blog:1");
- }
- }
本文就到这里了,下一篇我们来探索如何通过Redis Search进行基于向量的搜索,实现文本相似度查询。相比之下,这种搜索方式可以保留文本中的语义、语法和情感信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。