Redisearch简单使用

Redisearch 是一个基于 Redis 的高性能搜索引擎,可以在 Redis 数据结构上实现全文搜索功能。下面是一个简单的教程,介绍如何使用 Redisearch 进行中文搜索,并使用 PHP 语言进行一些简单的DEMO示例

安装 Redisearch

首先,你需要在 Redis 服务器上安装 Redisearch 模块。请参考 Redisearch 的 GitHub 页面 获取安装说明。

使用 Docker 安装 RedisSearch 非常简单。以下是步骤:

1. 获取 RedisSearch Docker 镜像

首先,确保系统已安装 Docker,然后运行以下命令来拉取 RedisSearch 镜像:

docker pull redislabs/redisearch

2. 启动 RedisSearch 容器

使用以下命令运行 RedisSearch 容器,并将 Redis 服务映射到本地的 6379 端口:

docker run -it -d -p 6379:6379 --name redis-search redislabs/redisearch:latest 

3. 验证安装

通过以下命令检查 Redis 模块是否安装成功。出现 search 模块表示成功:

127.0.0.1:6379> MODULE LIST
1) 1) "name"
   2) "ReJSON"
   3) "ver"
   4) (integer) 999999
2) 1) "name"
   2) "search"
   3) "ver"
   4) (integer) 20613

创建索引

使用 Redisearch 进行搜索之前,需要先为数据创建索引。下面是一个使用 Redis 命令行工具创建索引的示例:

FT.CREATE myIndex SCHEMA title TEXT WEIGHT 1.0 content TEXT WEIGHT 0.5

这个命令会创建一个名为 myIndex 的索引,包含两个字段:titlecontent,并为这些字段分配不同的权重。

添加文档

接下来,你可以向索引中添加文档。下面是一个使用 Redis 命令行工具添加文档的示例:

FT.ADD myIndex doc1 1.0 FIELDS title "中文搜索" content "这是一个关于中文搜索的文档"

当然如果出现中文无法查询内容的情况,可以试下

FT.ADD myIndex doc1 1.0 language "chinese" FIELDS title "中文搜索" content "这是一个关于中文搜索的文档"

注意:这里必须要设置语言编码为中文,也就是 language "chinese",默认是英文编码,如果不设置则无法支持中文查询

这个命令会向 myIndex 索引中添加一个 ID 为 doc1 的文档,包含 titlecontent 两个字段。

执行搜索

现在,你可以使用 Redisearch 进行搜索了。下面是一个使用 Redis 命令行工具执行搜索的示例:

FT.SEARCH myIndex "中文搜索"

这个命令会返回包含 "中文搜索" 关键词的所有文档。

删除索引的数据

FT.DEL myIndex doc1

我们使用索引加文档 ID 就可以实现删除数据的功能

删除索引

我们可以使用ft.drop关键字删除整个索引,执行命令如下:

FT.DROP myIndex

查询索引详细信息

我们可以使用ft.info关键查询索引相关信息

使用 PHP 进行操作

在 PHP 中,你可以使用 phpredis 扩展来操作 Redis 和 Redisearch。下面是一个使用 PHP 进行上述操作的示例:

<?php
// 连接到 Redis 服务器
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 创建索引
$redis->rawCommand('FT.CREATE', 'myIndex', 'SCHEMA', 'title', 'TEXT', 'WEIGHT', 1.0, 'content', 'TEXT', 'WEIGHT', 0.5);

// 添加文档
$redis->rawCommand('FT.ADD', 'myIndex', 'doc1', 1.0, 'FIELDS', 'title', '中文搜索', 'content', '这是一个关于中文搜索的文档');

// 执行搜索
$result = $redis->rawCommand('FT.SEARCH', 'myIndex', '中文搜索');
print_r($result);

这个 PHP 脚本会连接到 Redis 服务器,创建索引,添加文档,并执行搜索。请注意,你需要先安装并启用 phpredis 扩展才能运行此脚本。


与 ElasticSearch 对比

性能对比

为了提供一个清晰的性能对比,下面是一个RedisSearch与Elasticsearch在几个关键性能指标上的比较表格。请注意,这些数据基于特定测试条件下的结果,实际应用中的表现可能会根据具体配置和使用场景有所不同。

指标RedisearchElasticsearch备注
索引速度221秒(5.6百万文档)349秒(5.6百万文档)Redisearch快58%
查询速度12.5K ops/sec3.1K ops/secRedisearch快4倍
查询延迟8毫秒10毫秒Redisearch表现更佳
内存使用通常更高,因为数据存储在内存中主要存储在磁盘,内存用于缓存和索引
写入性能高效,适用于实时写入和更新适合高并发写入场景
查询性能单机环境下查询速度快通过分片分布查询负载,支持近实时搜索
扩展性受限于内存大小水平可扩展,轻松增加节点处理更多数据
易用性简单,与Redis一致的API功能强大但学习曲线陡峭

产品对比

特性/工具RedisSearchElasticsearch
数据存储内存中,支持持久化到磁盘磁盘上,基于Lucene索引技术
索引类型全文搜索,数值、地理空间等全文搜索,结构化、非结构化数据
性能极低延迟,适用于实时查询优秀的分布式搜索性能,适合大规模数据集
扩展性支持通过Redis Cluster进行水平扩展强大的集群管理功能,易于水平扩展至PB级数据
易用性配置简单,对于熟悉Redis的用户友好功能丰富但设置较为复杂,学习曲线较陡
API与语言支持REST API, 提供多种客户端库RESTful API, 多种编程语言的官方及第三方客户端库
查询能力基本的全文检索和过滤复杂的聚合、脚本、过滤器等高级查询
社区支持开源社区活跃,作为Redis的一部分得到维护非常活跃的开源社区,有商业版本提供企业级支持
典型应用场景实时应用、缓存层、小到中等规模的数据集日志分析、大数据处理、电子商务搜索引擎
成本考虑主要是硬件成本(内存),因为它是内存数据库包括硬件(主要是存储)、软件许可费(如果使用X-Pack)
运维复杂度相对较低,依赖于Redis本身的稳定性和监控工具较高,需要专门的运维团队来管理和优化集群

注意

  • 数据存储一栏中,RedisSearch主要依赖于Redis的内存存储机制,虽然它也提供了持久化选项,但是默认情况下数据是保存在内存中的。而Elasticsearch则是基于磁盘存储,并利用了Lucene来创建高效的索引。
  • 性能方面,RedisSearch由于其内存操作的特点,在响应时间上有优势;Elasticsearch则是在大规模分布式环境下表现出色。
  • 易用性方面,RedisSearch对于已经熟悉Redis的人来说更加直观容易上手;而Elasticsearch虽然强大,但是它的配置和使用相对更复杂一些。
  • 社区支持反映了两种工具背后的开发者社区活动程度以及是否有商业支持可供选择。
  • 成本考虑不仅包含了软件本身的成本,还包括了运行这些系统所需的硬件资源的成本。
  • 运维复杂度则指出了日常维护和管理这两种系统的难易程度。

标签: PHP, Redis

相关文章

Redis高可用服务架构分析与搭建的几种方案

高可用Redis架构设计与实现Redis作为一款基于内存的高性能key-value数据库,已经在许多Web应用中得到了广泛使用,通常用于存储用户会话状态、加速数据查询以及实现消息队列和发布/订阅...

PHP中利用 popen 和 pclose 实现多进程的简单方案

在 PHP 中,popen 和 pclose 函数用于打开一个指向进程的管道,并允许你通过该管道与进程进行通信。popen 函数会启动一个新的进程,并返回一个文件指针,你可以通过该指针读取或写入...

Typecho插件开发手册

插件的基本结构在 Typecho 中,插件通常是一个独立的 PHP 文件,默认放置在usr/plugins/目录下。插件文件名即为插件名,插件类名也应与文件名相同。插件必须实现 Typecho_...

Typecho博客系统的xmlrpc的使用附PHP示例代码

XML-RPC 是一种远程过程调用(RPC)协议,它使用 XML 编码请求和响应,并通过 HTTP 进行传输。XML-RPC 允许客户端调用远程服务器上的方法,并获取返回结果。这种协议简单、轻量...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件