学习

使用 Redis OM 创建索引

要解锁 Redis OM 的一些最棒的功能,例如运行搜索、匹配、聚合、归约、映射等... 你需要告诉 Redis 如何存储数据以及如何索引数据。Redis OM 库提供的一个功能是创建直接映射到你的对象的索引,方法是将索引声明为类上的属性。

让我们从一个示例类开始。

[Document]
public partial class Person
{
    [RedisIdField]
    public string Id { get; set; }

    [Searchable(Sortable = true)]
    public string Name { get; set; }

    [Indexed(Aggregatable = true)]
    public GeoLoc? Home { get; set; }

    [Indexed(Aggregatable = true)]
    public GeoLoc? Work { get; set; }

    [Indexed(Sortable = true)]
    public int? Age { get; set; }

    [Indexed(Sortable = true)]
    public int? DepartmentNumber { get; set; }

    [Indexed(Sortable = true)]
    public double? Sales { get; set; }

    [Indexed(Sortable = true)]
    public double? SalesAdjustment { get; set; }

    [Indexed(Sortable = true)]
    public long? LastTimeOnline { get; set; }

    [Indexed(Aggregatable = true)]
    public string Email { get; set; }
}

如上所示,你可以使用 Document 属性声明一个类为索引。在 Document 属性中,你可以设置一些字段来帮助构建索引:

属性名称

描述

默认值

可选

StorageType

定义用于在 Redis 中存储对象的底层数据结构,选项为 HASH 和 JSON,注意 JSON 仅适用于 Redis Stack

HASH

true

IndexName

索引的名称

$"{SimpleClassName

.ToLower()}-idx}

true

Prefixes

Redis 用于构建索引的键前缀

new string[]{$"{FullyQualifiedClassName}:"}

true

Language

用于全文本搜索索引的语言

null

true

LanguageField

文档存储其语言的字段的名称

null

true

Filter

用于确定是否索引特定项的过滤器,例如 @Age>=18

null

true

IdGenerationStrategy

用于为文档生成 ID 的策略,如果为空,它将使用 ULID 生成策略

UlidGenerationStrategy

true

字段级声明#

ID 字段#

Redis 索引的每个类都必须包含一个用 RedisIdField 标记的 ID 字段。

索引字段#

除了声明 ID 字段外,你还可以声明索引字段,这将使你能够随后搜索这些字段中的值。有两种类型的字段级属性。

  1. 1.索引 - 此类型的索引对类型为 string 的字段有效,对数字类型(double/int/float 等...)有效,或者可以装饰类型为 GeoLoc 的字段,索引字段的解释方式取决于索引类型。
  2. 2.可搜索 - 此类型仅对 string 字段有效,但它允许对装饰字段进行全文本搜索。

IndexedAttribute 属性#

在 IndexedAttribute 中有一些属性可以让你进一步自定义存储和查询的方式。

PropertyName

type

描述

默认值

可选

PropertyName

string

要索引的属性的名称

正在索引的属性的名称

true

Sortable

bool

是否索引该项以便在查询中对其进行排序,允许使用 OrderBy & OrderByDescending -> collection.OrderBy(x=>x.Email)

false

true

Normalize

bool

仅适用于 string 类型的字段,确定是否将字段中的文本规范化(转换为小写)以用于排序

true

true

Separator

char

仅适用于 string 类型的字段,用于分隔标签字段的字符,允许对同一项应用多个标签,例如 article.Category = technology,parenting 由一个 , 分隔,意味着 collection.Where(x=>x.Category == "technology")collection.Where(x=>x.Category == "parenting") 都将匹配该记录

`

`

true

CaseSensitive

bool

仅适用于 string 类型的字段 - 确定在对标签执行匹配时是否区分大小写

false

true

SearchableAttribute 属性#

对于 SearchableAttribute 有一些属性可以让你进一步自定义全文本搜索如何确定匹配项

PropertyName

type

描述

默认值

可选

PropertyName

string

要索引的属性的名称

索引属性的名称

true

Sortable

bool

是否索引该项以便在查询中对其进行排序,允许使用 OrderBy & OrderByDescending -> collection.OrderBy(x=>x.Email)

false

true

NoStem

bool

确定是否使用 词干提取,换句话说,将单词的词干添加到索引中,设置为 true 将阻止 Redis 索引单词的词干

false

true

PhoneticMatcher

string

如果你希望索引使用(音似匹配)[https://oss.redis.com/redisearch/Phonetic_Matching/] ,则要使用的音似匹配器

null

true

Weight

double

确定字段对检查结果准确性的重要性

1.0

true

创建索引#

声明索引后,创建索引非常简单。你只需为装饰的类型调用 CreateIndex 。库将负责将提供的类型序列化为可搜索索引。库不会尝试过于聪明,因此如果索引已经存在,则创建请求将被拒绝,你必须删除并重新添加索引(迁移是将来可能添加的功能)

var connection = provider.Connection;
connection.CreateIndex(typeof(Person));
上次更新时间 2024 年 3 月 18 日