创立索引并关联源数据-Redis全文搜查教程 (创立索引并关联的方法)
全文搜查是依赖于Redis官网提供的RediSearch来成功的。RediSearch提供了一种繁难极速的方法对hash或许json类型数据的任何字段建设二级索引,而后就可以对被索引的hash或许json类型数据字段启动搜查和聚合操作。
这里咱们把被索引的hash或许json类型数据叫做源数据。
本文纲要如下,
图片
经常使用体验
繁难场景下,用RediSearch来平替Elasticsearch的经常使用场景曾经足够。像是Elasticsearch中罕用的查问语法AND、OR、IN、NOTIN、>、<、=、like等,在RediSearch中都是支持的。
此外RediSearch还支持聚合统计、停用词、文本标志和转义、同义词、标签、排序、向量查问、中文分词等。
就我团体来说,团体名目经常使用RediSearch作为全文搜查引擎曾经够用了,它有占用内存低、索引建设快、查问数据性能足够初等好处。
后续开展
就目前官网对RediSearch的支持降级来看,
图片
RediSearch官网降级频率图
最近一次性提交记载在12月17号。
可以看到RediSearch的降级频率还是比拟高的,而且是官网支持做的模块,不用担忧后续无人保养。
只管Redis天生支持散布式集群,然而RediSearch对Redis集群的支持还不完善,援用官网说明,
图片
官网针对RediSearch的集群支持疑问,提供了一个RediSearch集群版本,然而这个版本只能在Redis企业版或许RedisCloud上能经常使用,开源版还没有,这一点要求通知大家。
遇到bug
图片
官网issue列表
大家可以看到issue列表中有很多bug没有处置。
不过本着开源共进的精气,宿愿大家发现了bug后,第一时期在RediSearch官网上提个issue,繁难官网发现并处置疑问。
上方我给大家用newbee-mall-pro名目作为样本,给大家引见下如何创立一个索引并关联源数据。
newbee-mall-pro名目地址:
减少源数据
在newbee-mall-pro名目中,曾经将商品数据以hash类型存入了Redis中,
其中,咱们关于key称号的定义规定是依照newbee_mall:goods:+商品ID。
这里咱们的key称号定义规定很关键,RediSearch创立索引会基于key称号前缀来生成。
hash类型的value蕴含属性如下,
![创立索引并关联源数据](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
在newbee-mall-pro中,减少源数据的方法曾经写好了,代码逻辑在JedisSearch.addGoodsListIndex()方法里,
publicbooleanaddGoodsListIndex(StringkeyPrefix,List<Goods>list){intchunk=200;List<List<Goods>>partition=ListUtil.partition(list,chunk);AbstractPipelinepipelined=client.pipelined();for(List<Goods>goodsList:partition){for(Goodsgoods:goodsList){RsGoodsDTOtarget=newRsGoodsDTO();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();returntrue;}
上诉代码中,其实就是把list商品列表以hash类型的数据结构写进Redis中,并且为了放慢写入速度,经常使用了Redis提供的管道操作。
要求留意的就是hash类型中新增了一个_language字段,用于指定RediSearch关于源数据关联的索引,要经常使用中文分词查问。
建设索引
RediSearch经过提供一种繁难且智能的形式在Redishash类型数据结构上创立二级索引,并且外部极大地简化了这一环节。(最终会产生更少数据结构)
二级索引示用意
假设咱们要经常使用RediSearch查问商品hash结构里的goodsName字段,那么必定要对该字段建设索引。
Jedis新建索引
所以这里,我给大家引见下在newbee-mall-pro名目中,是如何建设索引的,代码逻辑在GoodsServiceImpl.syncRs()方法中,
//定义索引结构publicbooleansyncRs(){jedisSearch.dropIndex("idx:goods");Schemaschema=newSchema().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结构里的下方字段都建设了索引。
在RediSerach中可以减少的字段类型有text、numberic、tag等,可以设置能否排序。
并且还可以设置权重系数,表示该字段已加权。这关于在搜查操作时期为特定字段调配不同的关键性级别十分有用,通常就是在条件挑选成功后的打分排序阶段用于优化或许降落排名。
Redis中的新建索引语法
当咱们把上方的Jedis新建索引的代码转换为Redis中的语法后,如下
>FT.CREATEidx:goodsONhashPREFIX1"newbeemall:goods:"SCHEMAgoodsNameTEXTSORTABLEWEIGHT1.0SCHEMAgoodsIntroTEXTSORTABLEWEIGHT0.5goodsIdNUMERICSORTABLEgoodsCategoryIdNUMERICSORTABLEgoodsSellStatusNUMERICSORTABLEsellingPriceNUMERICSORTABLEoriginalPriceNUMERICSORTABLEtagTAGSORTABLESEPARATOR"|"
如今我给大家详细引见下这条命令:
假设你想了解更多关于ft.search的语法以及字段定义相关的只是,可以关上官网文档,
Redis中查问索引定义
在RediSearch中要查问曾经存在的索引概略也是很繁难的,官网提供了ft.info索引称号的语法,用来打印索引概略。
>FT.INFOidx:goods
Redis有哪几种数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 (推荐学习:Redis视频教程)String(字符串)string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。 string 类型是二进制安全的。 意思是 redis 的 string 可以包含任何数据。 比如jpg图片或者序列化的对象。 string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。 常用命令:set、get、decr、incr、mget等。 注意:一个键最大能存储512MB。 Hash(哈希)Redis hash 是一个键值(key=>value)对集合;是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。 每个 hash 可以存储 232 -1 键值对(40多亿)。 常用命令:hget、hset、hgetall等。 应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。 List(列表)Redis 列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 list类型经常会被用于消息队列的服务,以完成多程序之间的消息交换。 常用命令:lpush、rpush、lpop、rpop、lrange等。 列表最多可存储 232 - 1 元素 (, 每个列表可存储40多亿)。 Set(集合)Redis的Set是string类型的无序集合。 和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。 集合最大的优势在于可以进行交集并集差集操作。 Set可包含的最大元素数量是。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 应用场景:1、利用交集求共同好友。 2、利用唯一性,可以统计访问网站的所有独立IP。 3、好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。 常用命令:sadd、spop、smembers、sunion等。 集合中最大的成员数为 232 - 1(, 每个集合可存储40多亿个成员)。 zset(sorted set:有序集合)Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。 redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。 sorted set是插入有序的,即自动排序。 常用命令:zadd、zrange、zrem、zcard等。 当你需要一个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构。 应用举例:(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。 (2)排行榜应用,根据得分列出topN的用户等。 更多redis相关技术知识,请访问Redis使用入门教程栏目学习!
redis field 是什么意思 跟key是什么关系,比如lpush(key,field,value)应该怎么设置
先说redisredis是一个类似memcached的key/value存储系统,它支持存储的value类型相对较多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。 在此基础上,redis支持各种不同方式的排序。 与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件(这点儿个人觉得redis比memcache在数据保存上要安全一些),并且在此基础上实现了master-slave(主从)同步。 redis的存取性能很高,SET操作每秒钟次,GET操作每秒钟次(速度很爽!)。 Redis针对不同的存储类型对象提供了不同的命令。 redis目前提供四种数据类型:string,list,set及zset(sortedset)。 string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。 但它的功能更丰富。 list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。 操作中key理解为链表的名字。 set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。 操作中key理解为集合的名字。 zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。 可以理解了有两列的mysql表,一列存value,一列存顺序。 操作中key理解为zset的名字。 下面提供redis命令:适合全体类型的命令EXISTSkey判断一个键是否存在;存在返回1;否则返回0;DELkey删除某个key,或是一系列key;DELkey1key2key3key4TYPEkey返回某个key元素的数据类型(none:不存在,string:字符,list,set,zset,hash)KEYSpattern返回匹配的key列表(KEYSfoo*:查找foo开头的keys)RANDOMKEY随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串RENAMEoldnamenewname更改key的名字,新键如果存在将被覆盖RENAMENXoldnamenewname更改key的名字,如果名字存在则更改失败DBSIZE返回当前数据库的key的总数EXPIRE设置某个key的过期时间(秒),(EXPIREbruce1000:设置bruce这个key1000秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。 TTL查找某个key还有多长时间过期,返回时间秒SELECTindex选择数据库MOVEkeydbindex将指定键从当前数据库移到目标数据库dbindex。 成功返回1;否则返回0(源数据库不存在key或目标数据库已存在同名key);FLUSHDB清空当前数据库中的所有键FLUSHALL清空所有数据库中的所有键处理字符串的命令SETkeyvalue给一个键设置字符串值。 SETkeynamedatalengthdata(SETbruce10paitoubing:保存key为burce,字符串长度为10的一个字符串paitoubing到数据库),data最大不可超过1G。 GETkey获取某个key的value值。 如key不存在,则返回字符串“nil”;如key的值不为字符串类型,则返回一个错误。 GETSETkeyvalue可以理解成获得的key的值然后SET这个值,更加方便的操作(SETbruce10paitoubing,这个时候需要修改bruce变成并获取这个以前的数据paitoubing,GETSETbruce0)MGETkey1key2…keyN一次性返回多个键的值SETNXkeyvalueSETNX与SET的区别是SET可以创建与更新key的value,而SETNX是如果key不存在,则创建key与value数据MSETkey1value1key2value2…keyNvalueN在一次原子操作下一次性设置多个键和值MSETNXkey1value1key2value2…keyNvalueN在一次原子操作下一次性设置多个键和值(目标键不存在情况下,如果有一个以上的key已存在,则失败)INCRkey自增键值INCRBYkeyinteger令键值自增指定数值DECRkey自减键值DECRBYkeyinteger令键值自减指定数值处理lists的命令RPUSHkeyvalue从List尾部添加一个元素(如序列不存在,则先创建,如已存在同名Key而非序列,则返回错误)LPUSHkeyvalue从List头部添加一个元素LLENkey返回一个List的长度LRANGEkeystartend从自定的范围内返回序列的元素(LRANGEtestlist02;返回序列testlist前012元素)LTRIMkeystartend修剪某个范围之外的数据(LTRIMtestlist02;保留012元素,其余的删除)LINDEXkeyindex返回某个位置的序列值(LINDEXtestlist0;返回序列testlist位置为0的元素)LSETkeyindexvalue更新某个位置元素的值LREMkeycountvalue从List的头部(count正数)或尾部(count负数)删除一定数量(count)匹配value的元素,返回删除的元素数量。 LPOPkey弹出List的第一个元素RPOPkey弹出List的最后一个元素RPOPLPUSHsrckeydstkey弹出_srckey_中最后一个元素并将其压入_dstkey_头部,key不存在或序列为空则返回“nil”处理集合(sets)的命令(有索引无序序列)SADDkeymember增加元素到SETS序列,如果元素(membe)不存在则添加成功1,否则失败0;(SADDtestlist3/none)SREMkeymember删除SETS序列的某个元素,如果元素不存在则失败0,否则成功1(SREMtestlist3/None)SPOPkey从集合中随机弹出一个成员SMOVEsrckeydstkeymember把一个SETS序列的某个元素移动到另外一个SETS序列(SMOVEtestlisttest3/ntwo;从序列testlist移动元素two到test中,testlist中将不存在two元素)SCARDkey统计某个SETS的序列的元素数量SISMEMBERkeymember获知指定成员是否存在于集合中SINTERkey1key2…keyN返回key1,key2,…,keyN中的交集SINTERSTOREdstkeykey1key2…keyN将key1,key2,…,keyN中的交集存入dstkeySUNIONkey1key2…keyN返回key1,key2,…,keyN的并集SUNIONSTOREdstkeykey1key2…keyN将key1,key2,…,keyN的并集存入dstkeySDIFFkey1key2…keyN依据key2,…,keyN求key1的差集。 官方例子:key1=x,a,b,ckey2=ckey3=a,dSDIFFkey1,key2,key3=>x,bSDIFFSTOREdstkeykey1key2…keyN依据key2,…,keyN求key1的差集并存入dstkeySMEMBERSkey返回某个序列的所有元素SRANDMEMBERkey随机返回某个序列的元素处理有序集合(sortedsets)的命令(zsets)ZADDkeyscoremember添加指定成员到有序集合中,如果目标存在则更新score(分值,排序用)ZREMkeymember从有序集合删除指定成员ZINCRBYkeyincrementmember如果成员存在则将其增加_increment_,否则将设置一个score为_increment_的成员ZRANGEkeystartend返回升序排序后的指定范围的成员ZREVRANGEkeystartend返回降序排序后的指定范围的成员ZRANGEBYSCOREkeyminmax返回所有符合score>=min和score=min和score形式的数据,通过key进行任何操作。 ttserver可以将数据持久化保存,memcached全部是保存在内存中,memcached会自动删除过期数据,最长不超过30天。 memcached在和一些api配合时,能自动进行数据的出入序列化,读取反序列化。 ttserver有主从复制的功能,操作日志等,这完全是数据库才有的东西。 据说memcached正在对整体架构做调整,到时候支持plugin机制.会把网络,事件处理,内存存储剥离开来.以后要做基于磁盘的key-value存储就可以写一个存储引擎就成了。 memcached的二次开发又步入一个小高潮。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。