Redis Stack 技术栈之搜索引擎 RedisSearch

介绍

RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完成、分面搜索和排序。利用 Redis 的高性能特点,RedisSearch 可以实现高效的搜索和实时分析。对于微服务架构来说,RedisSearch 可以作为搜索服务的一部分,提供快速、高效的搜索能力,对于提高用户体验和性能具有重要的意义。

安装

如何按照请参考这里 Redis Stack技术栈入门实战指南 https://mp.weixin.qq.com/s/jfVdaakjiNRQKSNf79zgtA

检查模块是否成功安装。运行 redis-cli 并输入命令module list。这将返回有关加载到服务器的模块的信息。下面是我机器上的一个截图,可以看到两个模块都被成功加载。

Redis Stack 技术栈之搜索引擎 RedisSearch

特性

  • 多字段联合检索
  • 高性能增量索引
  • 提前指定文档可排序字段(由用户在索引时手动提供)
  • 复杂布尔查询
  • 基于管道的查询子句
  • 基于前缀的搜索
  • 支持字段权重设置
  • 自动完成建议(可用于搜索框联想词提示)
  • 精确的短语搜索
  • 在许多语言中基于词干分析的查询扩展
  • 支持自定义评分函数(类似ES的function_score)
  • 将搜索限制到特定的文档字段
  • 数字过滤器和范围
  • 使用 Redis 自己的地理命令进行地理过滤
  • Unicode 支持(需要 UTF-8 字符集)
  • 检索完整的文档内容或只是 ID 的检索
  • 支持文档删除和更新与索引垃圾收集
  • 支持部分更新和条件文档更新
  • 支持拼写纠错
  • 支持高亮显示
  • 支持聚合分析
  • 支持配置停用词和同义词
  • 支持向量存储与KNN检索(重磅)

核心概念

数据模型与索引

在RedisSearch中,数据模型指的是用于构建索引的数据结构和格式。RedisSearch支持使用JSON数据类型进行索引,因此可以将数据模型定义为JSON文档的结构和格式。

在创建索引之前,需要定义一个数据模型,指定索引中包含的字段和每个字段的类型。例如,以下是一个简单的数据模型示例:

{  
   "title""string",  
   "author""string",  
   "price""float",  
   "stock""float"  
}

在创建索引时,需要指定一个数据模型,RedisSearch会根据数据模型中定义的字段类型自动创建相应的索引。

文档与文档属性

文档是指符合数据模型格式要求的JSON文档,每个文档表示一条数据记录。文档中的每个字段对应一个属性,属性定义了该字段的数据类型和索引方式。

例如,以下是一个符合上述数据模型的文档示例:

{
 "title""开源技术小栈RedisSearch系列教程",
 "author""Tinywan",
 "price"9.99,
 "stock"2024,
 "description""RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。"
}

在文档中,title、author、price、stockdescription分别对应一个属性,属性的类型分别为text、text、float、floattext

索引与搜索

索引是用于加速搜索过程的数据结构,通过创建索引,可以快速找到包含特定关键词的文档。索引是一种倒排表(Inverted Index),它存储了每个字段值与相关文档ID的映射关系。当文档被索引时,RedisSearch会为每个字段创建一个倒排表。

搜索操作是基于索引执行的。当执行搜索查询时,RedisSearch会根据查询语句中的关键词和查询条件生成一个正排表(Forward Index),该表中包含所有符合条件的文档ID。接着,RedisSearch会将正排表和倒排表相结合,计算每个文档的得分并返回搜索结果。通过将数据模型中的字段类型和索引类型定义清楚,可以创建高效的索引,从而加速搜索过程。

命令行操作 RediSearch

创建一个 Index

FT.CREATE TinywanIdx ON HASH PREFIX 1 doc: SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT

通过上面的命令,创建了一个支持hash数据类型的索引,同时需要满足key前缀为 doc: 。支持索引的字段说明如下:

字段 类型 权重(默认权重为1.0)
title TEXT 5
body TEXT 1.0
url TEXT 1.0

新增数据

HSET doc:1 title "Hello Tinywan" body "search and query" url "https://redis.io/docs/interact/search-and-query"

满足索引key前缀定义的数据,在新增后都会自动加入到对应的索引中.

使用索引

FT.SEARCH TinywanIdx "Hello Tinywan" LIMIT 0 10
Redis Stack 技术栈之搜索引擎 RedisSearch
Redis Stack 技术栈之搜索引擎 RedisSearch

添加多条记录进行查询

Redis Stack 技术栈之搜索引擎 RedisSearch

PHP 操作 RediSearch

RediSearch-PHP是RediSearch模块的PHP客户端库,它为Redis添加了全文搜索。

Github地址 https://github.com/ethanhann/redisearch-php

安装依赖包

composer require ethanhann/redisearch-php

创建Redis客户端

以下以PECL Redis扩展为示例

/** 创建Redis客户端 */
$redis = (new EhannRedisRawPhpRedisAdapter())->connect('192.168.13.168',63789);

创建数据模型与索引

/** 创建数据模型与索引 */
$bookIndex = new EhannRediSearchIndex($redis);
$bookIndex->addTextField('title')
    ->addTextField('author')
    ->addNumericField('price')
    ->addNumericField('stock')
    ->addTextField('description')
    ->create();

添加文档

/** 添加文档 */
$bookIndex->add([
    new EhannRediSearchFieldsTextField('title''开源技术小栈RedisSearch系列教程'),
    new EhannRediSearchFieldsTextField('author''Tinywan'),
    new EhannRediSearchFieldsNumericField('price', 9.99),
    new EhannRediSearchFieldsNumericField('stock', 2024),
    new EhannRediSearchFieldsTextField('description''RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。'),
]);

查询redis数据库

127.0.0.1:6379> keys *
1) "16584eadb71aa3"

搜索索引

$result = $bookIndex->search('开源技术小栈RedisSearch系列教程');
var_dump($result);

命令行终端打印结果

Redis Stack 技术栈之搜索引擎 RedisSearch

通过 RedisInsight 可视化工具查看

Redis Stack 技术栈之搜索引擎 RedisSearch


原文始发于微信公众号(开源技术小栈):Redis Stack 技术栈之搜索引擎 RedisSearch

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/247918.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!