百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

C#+Redis Search:如何用Redis实现高性能全文搜索

mhr18 2024-11-30 12:28 14 浏览 0 评论

Redis Search是一个Redis模块,它使用压缩的倒排索引来实现快速的索引和低内存占用。Redis Search可以对Redis数据进行精确短语匹配、模糊搜索、数值过滤、理空间筛选等多种搜索功能。Redis Search还支持聚合、高亮、词干提取、拼写纠错等特性。

//Redis Search文档地址https://redis.io/docs/interact/search-and-query/

RediSearch查询语言类似于SQL,但更加简洁和灵活。你可以使用RediSearch命令来创建索引、添加文档、搜索文档、更新文档、删除文档等。

与elasticsearch的比较

elasticsearch是另一个流行的开源搜索引擎,它也支持全文搜索和聚合功能。那么,Redis Search和elasticsearch有什么区别和优势呢?

  • Redis Search是基于内存的,它可以提供更高的性能和更低的延迟。elasticsearch则是基于磁盘的,它需要依赖缓存来提高速度。

  • Redis Search是一个Redis模块,它可以直接在Redis中运行,无需额外的安装和配置。elasticsearch则需要单独部署和管理。

  • Redis Search支持多种扩展模块,如RedisJSON(用于处理JSON文档),RedisGraph(用于处理图数据),RedisTimeSeries(用于处理时间序列数据),RediSearch(用于处理全文搜索)等。elasticsearch则需要依赖插件来扩展其功能。


一、Redis Search的安装

有多种方式可以安装和使用Redis Search,最简单的方式是使用Redis Stack Docker镜像,它已经集成了Redis和多个模块,包括Redis Search。只需运行一条命令,就可以在本地创建一个RediSearch容器:

$ docker run -p 6379:6379 redis/redis-stack-server:latest

要连接到这个实例,运行:

$ redis-cli

二、Redis Search的使用

要使用Redis Search,你首先需要在Redis数据上声明索引,然后使用RediSearch查询语言来查询这些数据。


1、创建索引

要创建一个索引,你需要使用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(标签类型,分隔符为逗号)。


2、添加文档

要添加一个文档到索引中,你需要使用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”。

3、搜索文档

要搜索一个文档,你需要使用FT.SEARCH命令,并指定索引名和查询表达式。你可以使用多种查询语法,如精确匹配、模糊匹配、数值过滤、布尔运算等。例如,要搜索blog索引中包含"redis"或"search"的文档,你可以运行:

127.0.0.1:6379> FT.SEARCH blog "redis|search"1) (integer) 12) "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选项来指定返回哪些字段。


4、更新文档

要更新一个文档,你需要使用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字段的值,并重新索引这些字段。


5、删除文档

要删除一个文档,你需要使用FT.DEL命令,并指定文档ID。例如,要删除blog:1文档,你可以运行:

127.0.0.1:6379> FT.DEL blog blog:1(integer) 1

个命令会从索引和数据库中删除blog:1文档,并返回删除的数量。

三、C#操作Redis Search结构

这里使用了NRediSearch和StackExchange.Redis两个库,实现在C#中使用Redis和RediSearch的功能。也可以把NRediSearch换为NRedisStack库,NRedisStack基于 StackExchange.Redis 构建,旨在为 C# 生态系统提供对 Redis Stack 命令的原生支持。

//项目地址://NRedisStackhttps://github.com/redis/NRedisStack//NRediSearchhttps://github.com/StackExchange/NRediSearch//StackExchange.Redishttps://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进行基于向量的搜索,实现文本相似度查询。相比之下,这种搜索方式可以保留文本中的语义、语法和情感信息。

相关推荐

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

后端开发必看!Redis 哨兵机制如何保障系统高可用?

你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...

Redis合集-大Key处理建议

以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...

深入解析跳跃表:Redis里的&quot;老六&quot;数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...

Redis合集-必备的几款运维工具

Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...

别再纠结线程池大小 + 线程数量了,没有固定公式的!

我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...

网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

尽情阅读,技术进阶,详解mmap的原理

1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...

C++11多线程知识点总结

一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...

微服务高可用的2个关键技巧,你一定用得上

概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...

Java线程间如何共享与传递数据

1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: