为什么80%的码农都做不了架构师?>>>
索引创建
创建一个索引至少需要5个参数:
FT.CREATE myIdx SCHEMA title TEXT
如上所示,大写字母表示关键字,小写字母代表索引的属性。该命令创建了一个名为"myIdx"的索引,并且声明了一个域"title",其中关键字TEXT表示该域内容为文本类型,除文本类型,也可以定义为数值类型"NUMERIC",等等。
索引数据结构
索引数据结构定义在speck.h/IndexSpec, 如下所示
typedef struct {
char *name; // 索引的名字
FieldSpec *fields; // 索引域列表,该列表默认空间为1024个
int numFields; // 当前索引中有效的域
......
} IndexSpec;
域信息数据结构定义在spec.h/FieldSpec,如下所示
typedef struct fieldSpec { //文档域结构
char *name; //域名
FieldType type; //域的类型,比如文本、数字等
......
添加文档到索引
添加一个文档至少需要7个参数:
FT.ADD myIdx doc1 1.0 FIELDS title "hello world"
添加文档数据结构
文档数据结构定义在document.h/Document, 如下所示
typedef struct {
const char *name; //添加文档时指定的field名称
RedisModuleString *text; //添加文档时指定的field内容
} DocumentField;
typedef struct {
RedisModuleString *docKey; //即将文档添加到索引时使用的docId,也是检索结果
DocumentField *fields; //即文档中实际包含的域数组,与索引结构不同,该数组为实际值,并不是所支持的最大值
int numFields; //即文档中实际包含的域个数
float score; //即将文档添加到索引时使用的score
......
} Document;
可见,每个新加入的文档,都会构建一个Document结构体。
查询文档
一个最简单的查询命令,如下所示,查询"hello world":
FT.SEARCH myIdx "hello world"
查询文档数据结构
每个查询指令都会构造一个结构体来完成该次查询,search_ctx.h/RedisSearchCtx结构体定义如下:
typedef struct {
RedisModuleCtx *redisCtx; //模块信息,也里RediSearch本身就是Redis的一个模块,也就是RediSearch模块的相关信息
RedisModuleKey *key; //OpenKey 返回的东东
RedisModuleString *keyName; //"idx:" + 索引名字
IndexSpec *spec; //索引数据结构
} RedisSearchCtx;