RediSearch索引架构设计完全指南
RediSearch 项目地址: https://gitcode.com/gh_mirrors/red/RediSearch
什么是RediSearch索引架构
RediSearch作为Redis的高性能全文搜索模块,其核心功能依赖于精心设计的索引架构。索引架构定义了如何组织和存储数据以实现高效搜索。一个合理的架构设计能显著提升搜索性能,同时优化存储空间使用。
基础架构定义
最基本的索引架构定义包含字段名称、字段类型和可选的配置参数。以下是一个典型示例:
FT.CREATE products_idx
ON HASH
PREFIX 1 product:
SCHEMA
name TEXT WEIGHT 3.0
description TEXT
category TAG
price NUMERIC SORTABLE
stock NUMERIC
这个架构定义了:
name
和description
为文本类型(TEXT),其中name
字段权重设为3.0,表示在搜索结果中匹配该字段的内容将获得更高相关性评分category
为标签类型(TAG),适合用于精确匹配的分类数据price
和stock
为数值类型(NUMERIC),其中price
标记为可排序(SORTABLE)
字段类型详解
RediSearch支持多种字段类型,每种类型针对不同使用场景优化:
1. TEXT类型
- 用于全文搜索的文本内容
- 支持分词、模糊匹配等高级搜索功能
- 可设置权重(WEIGHT)参数控制相关性
- 示例:
title TEXT WEIGHT 5.0
2. TAG类型
- 用于精确值匹配,如分类、状态等
- 支持多值标签(通过SEPARATOR指定分隔符)
- 适合过滤和聚合操作
- 示例:
category TAG SEPARATOR ","
3. NUMERIC类型
- 存储数值数据
- 可标记为SORTABLE以支持排序
- 支持范围查询
- 示例:
price NUMERIC SORTABLE
高级架构设计技巧
多前缀索引
当需要从不同键模式中索引数据时,可以使用多前缀:
FT.CREATE inventory_idx
ON HASH
PREFIX 2 product: item:
SCHEMA
id TAG
name TEXT
quantity NUMERIC
条件索引(FILTER)
只索引满足特定条件的文档:
FT.CREATE active_users_idx
ON HASH
PREFIX 1 user:
FILTER '@status == "active"'
SCHEMA
username TEXT
last_login NUMERIC
多方式索引同一字段
有时需要以不同方式索引同一字段以满足不同查询需求:
FT.CREATE products_multi_idx
ON HASH
PREFIX 1 product:
SCHEMA
code AS code_text TEXT
code AS code_tag TAG
JSON文档索引
RediSearch支持直接索引JSON文档中的特定字段:
FT.CREATE json_products_idx
ON JSON
SCHEMA
$.name AS name TEXT
$.price AS price NUMERIC
$.tags[*] AS tags TAG
架构设计最佳实践
-
合理选择字段类型:根据查询需求选择最合适的类型,TEXT用于全文搜索,TAG用于精确匹配,NUMERIC用于数值比较
-
权重分配:为重要字段分配更高权重,提升搜索结果相关性
-
SORTABLE标记:仅为需要排序的NUMERIC字段添加此标记,避免不必要的存储开销
-
前缀设计:使用明确的前缀区分不同类型的数据
-
条件过滤:利用FILTER减少不必要的索引数据,提升效率
-
JSON路径:对于复杂JSON结构,使用精确的JSONPath表达式提取所需字段
通过合理设计RediSearch索引架构,您可以构建出既高效又灵活的搜索解决方案,满足各种复杂的业务查询需求。记住,良好的架构设计是高性能搜索的基础。
RediSearch 项目地址: https://gitcode.com/gh_mirrors/red/RediSearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考