Redis全文搜索教程之创建索引并关联源数据(2)
Redis全文搜索教程之创建索引并关联源数据

大家可以看到 issue 列表中有很多 bug 没有解决。
不过本着开源共进的精神,希望大家发现了 bug 后,第一时间在 RediSearch 官方 github 上提个 issue,方便官方发现并解决问题。
RediSearch Github 仓库地址:https://github.com/RediSearch/RediSearch
下面我给大家用 newbee-mall-pro 项目作为样本,给大家介绍下如何创建一个索引并关联源数据。
newbee-mall-pro 项目地址:https://github.com/wayn111/newbee-mall-pro
添加源数据
在 newbee-mall-pro 项目中,已经将商品数据以 hash 类型存入了 Redis 中,
其中,我们对于 key 名称的定义规则是按照newbee_mall:goods: + 商品ID。
这里我们的 key 名称定义规则很重要,RediSearch 创建索引会基于 key 名称前缀来生成。
hash 类型的 value 包含属性如下,
goodsId: 商品 ID,唯一属性,由数据库商品表主键生成goodsName: 商品名称goodsIntro: 商品简介goodsCategoryId: 商品分类 ID,唯一属性,由数据库商品分类表主键生成goodsSellStatus: 商品上架状态,0 代表下架,1 代表上架sellingPrice: 商品售价originalPrice: 商品原价tag: 商品标签
在 newbee-mall-pro 中,添加源数据的方法已经写好了,代码逻辑在 JedisSearch.addGoodsListIndex() 方法里,
public boolean addGoodsListIndex(String keyPrefix, List<Goods> list) {
int chunk = 200;
List<List<Goods>> partition = ListUtil.partition(list, chunk);
AbstractPipeline pipelined = client.pipelined();
for (List<Goods> goodsList : partition) {
for (Goods goods : goodsList) {
RsGoodsDTO target = new RsGoodsDTO();
MyBeanUtil.copyProperties(goods, target);
Map<String, String> hash = MyBeanUtil.toMap(target);
// 支持中文
hash.put("_language", Constants.GOODS_IDX_LANGUAGE);
pipelined.hset(keyPrefix + goods.getGoodsId(), hash);
}
}
pipelined.sync();
return true;
}
上诉代码中,其实就是把 list 商品列表以 hash 类型的数据结构写进 Redis 中,并且为了加快写入速度,使用了 Redis 提供的管道操作。
需要注意的就是 hash 类型中新增了一个_language字段,用于指定 RediSearch 对于源数据关联的索引,要使用中文分词查询。
建立索引
RediSearch 通过提供一种简单且自动的方式在 Redis hash 类型数据结构上创建二级索引,并且内部极大地简化了这一过程。(最终会出现更多数据结构)

如果我们要使用 RediSearch 查询商品 hash 结构里的 goodsName 字段,那么必须要对该字段建立索引。
Jedis 新建索引
所以这里,我给大家介绍下在 newbee-mall-pro 项目中,是如何建立索引的,代码逻辑在 GoodsServiceImpl.syncRs() 方法中,
// 定义索引结构
public boolean syncRs() {
jedisSearch.dropIndex("idx:goods");
Schema schema = new Schema()
.addSortableTextField("goodsName", 1.0)
.addSortableTextField("goodsIntro", 0.5)
.addSortableNumericField("goodsId")
.addSortableNumericField("goodsCategoryId")
.addSortableNumericField("goodsSellStatus")
.addSortableNumericField("sellingPrice")
.addSortableNumericField("originalPrice")
.addSortableTagField("tag", "|");
jedisSearch.createIndex(Constants.GOODS_IDX_NAME, Constants.GOODS_IDX_PREFIX, schema);
}
上述代码中,我们对商品 hash 结构里的下方字段都建立了索引。
goodsName:文本类型,可排序,设置权重为 1.0goodsIntro:文本类型,可排序,设置权重为 0.5goodsId:数字类型,可排序goodsCategoryId:数字类型,可排序goodsSellStatus:数字类型,可排序sellingPrice:数字类型,可排序originalPrice:数字类型,可排序tag:标签类型,可排序,设置分隔符为字符串|
在 RediSerach 中可以添加的字段类型有 text、numberic、tag 等,可以设置是否排序。
并且还可以设置权重系数,表示该字段已加权。这对于在搜索操作期间为特定字段分配不同的重要性级别非常有用,通常就是在条件筛选完成后的打分排序阶段用于提升或者降低排名。
Redis 中的新建索引语法
当我们把上面的 Jedis 新建索引的代码转换为 Redis 中的语法后,如下
> FT.CREATE idx:goods ON hash PREFIX 1 "newbeemall:goods:" \
SCHEMA goodsName TEXT SORTABLE WEIGHT 1.0 \
SCHEMA goodsIntro TEXT SORTABLE WEIGHT 0.5 \
goodsId NUMERIC SORTABLE \
goodsCategoryId NUMERIC SORTABLE \
goodsSellStatus NUMERIC SORTABLE \
sellingPrice NUMERIC SORTABLE \
originalPrice NUMERIC SORTABLE \
tag TAG SORTABLE SEPARATOR "|"
现在我给大家详细介绍下这条命令:
FT.CREATE:RediSearch 中索引创建语法。idx:goods:指定索引名称,索引名称将在所有键名称中使用,因此请保持简短。ON hash:指定索引关联的结构类型。需要注意的是,在 RediSearch 2.0 中仅支持哈希结构,随着 RediSearch 更新,后续有望支持更多数据结构。PREFIX 1 "newbeemall:goods:":指定索引的关联源数据的 key 前缀,可以指定多个前缀。SCHEMA ...:字段定义,用于定义字段名称、类型、是否排序、权重等。可以定义多个字段。
如果你想了解更多关于 ft.search 的语法以及字段定义相关的只是,可以打开官方文档,
https://redis.io/docs/interact/search-and-query/basic-constructs/schema-definition
Redis 中查询索引定义
在 RediSearch 中要查询已经存在的索引详情也是很简单的,官方提供了ft.info 索引名称的语法,用来打印索引详情。>FT.INFOidx:goods
最后聊两句
本文给大家用我的开源项目 newbee-mall-pro 作为样本,给大家细致的介绍了一番 RediSearch 在项目实战中关于索引创建与关联源数据的用法,希望大家喜欢。
以上分享的Redis全文搜索教程之创建索引并关联源数据的电脑IT小方法,供您全面了解参考!
相关阅读
-
服务器存储的重要性 服务器存储的类型有哪些
为网友们解答服务器存储的重要性方面的介绍,一定能解决您的问题的,一起来了解吧! 服务器存储是一种重要的计算机技术,它涉及到计算机服务器中用于存储数据和应用程序的设备。服务
-
java面试题:为什么JDK 15要废弃偏向锁?
今天为大家介绍java面试题及为什么JDK的介绍,具体介绍如下: 为什么JDK 15要废弃偏向锁? 要想说清楚这个问题,你得先知道什么是偏向锁,它是在哪里使用的。 这就不得不提到Synchronized的锁
-
ASCII码详解:26个英文字母的编码方式
正文核心介绍:ASCII码详解的IT知识,一定能解决您的问题的,一起来了解吧! 在计算机科学中,ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种广泛使用的字符
-
可以成为ChatGPT平替的开源模型 “Dolly” ChatGPT平替模型
本文为您带来的是可以成为ChatGPT平替的开源模型及“Dolly”的内容,下面小编为您详细解答 你需要一款 ChatGPT 的平替?还得是开源的?看起来我们已经被卷入了与 ChatGPT 的开源大战。 Databric


