首页 > 数据库 >Redis查询之RediSearch和RedisJSON讲解

Redis查询之RediSearch和RedisJSON讲解

时间:2023-05-09 14:45:51浏览次数:155  
标签:1.4 FT name redis RedisJSON Redis JSON json RediSearch

来源于:https://www.cnblogs.com/jingzh/p/17033403.html

目录

 

1 Redis查询

1.1 RedisMod介绍

首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:

  • RediSearch:一个功能齐全的搜索引擎;
  • RedisJSON:对JSON类型的原生支持;
  • RedisTimeSeries:时序数据库支持;
  • RedisGraph:图数据库支持;
  • RedisBloom:概率性数据的原生支持;
  • RedisGears:可编程的数据处理;
  • RedisAI:机器学习的实时模型管理和部署。

1.2 安装Redis

Redis这些模块都是依赖于Redis,因此先要安装Redis
点击了解Redis单机安装
点击了解Redis集群安装

1.3 RediSearch+RedisJSON安装

1.3.1 下载安装

下载RediSearch+RedisJSON地址:https://redis.com/redis-enterprise-software/download-center/software/
在这里插入图片描述
在 redis 安装目录下新建 module 文件夹,把获取到的rejson.somodule-enterprise.so(可以重命名为redissearch.so)文件 放到 module 文件夹中

1.3.2 修改配置

修改 文件 为可执行权限
chmod +x rejson.so
chmod +x module-enterprise.so

修改 redis.conf,搜索 loadmodule
loadmodule /root/software/redis-6.0.6/module/rejson.so
loadmodule /root/software/redis-6.0.6/module/module-enterprise.so
重启 redis
/usr/local/redis-6.2.6/bin/redis-cli -a 123456 shutdown
/usr/local/redis-6.2.6/bin/redis-server conf/redis.conf

1.4 RedisJSON操作

命令行体验 json 的操作

1.4.1 基本操作

1.4.1.1 保存操作JSON.SET

语法:

JSON.SET <key> <path> <json>  [NX | XX]

参数说明:

  • 对于新的Keypath需要使用$或 .
  • 对于已经存在Key,在进行保存操作之后,原来path路径的值将会被替换掉;
  • NX:表示只有Key不存在,才执行保存操作
  • XX:表示只有Key存在,才执行保存操作
  • 通过命令type doc可以查看到存储进去的数据是ReJSON-RL类型

1.4.1.2 读取操作JSON.GET

语法:

JSON.GET <key>
         [INDENT indentation-string]
         [NEWLINE line-break-string]
         [SPACE space-string]
         [path ...]

参数说明:

  • 允许使用多个path进行查询
  • INDENT 查询结果替换掉默认缩进字符(用于返回Pretty-formatted JSON
  • NEWLINE 查询结果替换掉默认换行符(用于返回Pretty-formatted JSON
  • SPACE 查询结果替换掉默认空格(用于返回Pretty-formatted JSON
  • 获取JSON对象中的属性时需要以.开头

1.4.1.3 批量读取操作JSON.MGET

语法:

JSON.MGET <key> [key ...] <path>

参数说明:

  • 最后一个参数作为path进行处理
  • 遍历每一个Keypath,如果不存在,则返回null

例子:

先保存两条记录
JSON.SET doc1 $ '{"a":1, "b": 2, "nested": {"a": 3}, "c": null}'
JSON.SET doc2 $ '{"a":4, "b": 5, "nested": {"a": 6}, "c": null}'

再进行mget操作
JSON.MGET doc1 doc2 $..a

执行结果:
1) "[1,3]"
2) "[4,6]"

1.4.1.4 删除操作JSON.DEL

语法:

JSON.DEL <key> [path]

参数说明:

  • path是可选的,如果没有输入,则默认整个Key删除掉

例子:

JSON.DEL doc $..a

结果:
"2"

1.4.1.5 其他命令

除了上面的几种常见操作,官方还支持如下命令,官方命令地址:https://redis.io/docs/stack/json/commands/

常用命令:
JSON.NUMINCRBY,JSON.NUMMULTBY,JSON.STRAPPEND,JSON.STRLEN
数组命令:
JSON.ARRAPPEND,JSON.ARRINDEX,JSON.ARRINSERT,JSON.ARRLEN,JSON.ARRPOP,JSON.ARRTRIM
对象命令:
JSON.OBJKEYS,JSON.OBJLEN
组件命令
JSON.TYPE,JSON.DEBUG,JSON.FORGET,JSON.RESP

1.4.1.6 综合操作

创建一个 json_1
127.0.0.1:6379> JSON.SET json_1 . '{"name":"zz","age":22,"msg":"hello"}'
OK

设置 json_1 的 key=name 的值为 zhangsan
127.0.0.1:6379> JSON.SET json_1 .name '"zhangsan"'
OK

获得整个 json_1 
127.0.0.1:6379> JSON.GET json_1
"{\"name\":\"zhangsan\",\"age\":22,\"msg\":\"hello\"}"

获得 json_1 键为 name 的值
127.0.0.1:6379> JSON.GET json_1 .name
"\"zhangsan\""

往 json_1 中添加一个数组对象
127.0.0.1:6379> json.set json_1 .list '[2,3,4]'
OK

往 json_1 的 list 对象中添加一个元素 6 
127.0.0.1:6379> json.arrappend json_1 .list 6
(integer) 4

查看所有元素
127.0.0.1:6379> json.get json_1
"{\"name\":\"zhangsan\",\"age\":22,\"msg\":\"hello\",\"list\":[2,3,4,6]}"

体验下来,感觉 Redis 原生支持 json 之后,对于 redis 的操作更加灵活了。

想象空间更大了,一切复杂信息的存储皆可 JSON,并且操作十分简单,省去了序列化、反序列化的操作,

1.4.2 Java 来操作 redis Json

当然我们还是要在一个 Java 工程中去操作一下:

package com.kkarch.rejson;

import com.redislabs.modules.rejson.JReJSON;
import com.redislabs.modules.rejson.Path;
import redis.clients.jedis.Jedis;

import java.util.Arrays;


public class ReJsonMain {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.0.110",6379);
        jedis.auth("123456");
        JReJSON redisClient = new JReJSON(jedis);

        System.out.println("初始化 json");
        redisClient.set("json_2",new Object());
        redisClient.set("json_2","zhangsan",new Path(".name"));
        redisClient.set("json_2",21,new Path(".age"));
        redisClient.set("json_2","hello",new Path(".msg"));
        redisClient.set("json_2",Arrays.asList(9,8,7),new Path(".arr"));
        Object result = null;
        result = redisClient.get("json_2");
        System.out.println(result);

        System.out.println("设置 name=lisi");
        redisClient.set("json_2","lisi",new Path(".name"));
        result = redisClient.get("json_2");
        System.out.println(result);

        System.out.println("在数组追加一个值:21");
        redisClient.arrAppend("json_2", new Path(".arr"), 21);
        result = redisClient.get("json_2");
        System.out.println(result);

    }
}


结果:

初始化 json
{name=zhangsan, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0]}
设置 name=lisi
{name=lisi, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0]}
在数组追加一个值:21
{name=lisi, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0, 21.0]}

1.5 RediSearch操作

通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下

1.5.1 查询语法

RediSearch的搜索语法比较复杂,不过我们可以对比SQL来使用它,具体可以参考如下
在这里插入图片描述

SQL ConditionRediSearch Equivalent注释
where x='foo' and y='bar' @x:foo @y:bar for less ambiguity use (@x:foo) (@y:bar)
where x='foo' and y!='bar' @x:foo -@y:bar  
where x='foo' or y='bar' (@x:foo) | (@y:bar)  
where x in ('foo' ,'bar' ) @x:(foo| bar) quotes means exact phrase
where y='foo' and x not in ('foo' ,'bar' ) @y:foo (-@x:foo)(-@x:bar)  
where num between 10 and 20 @num:[10:20]  
where num >=10 @num:[10 +inf]  
where num > 10 @num:[(10 +inf]  
where num < 10 @num:[-inf (10]  
where num <= 10 @num:[-inf 10]  
where num < 10 or num >20 @num:[-inf (10] | @num:[(20 +inf ]  
where name like 'john%' @name:john*  

1.5.2 建立索引

使用 RediSearch 来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;

FT.CREATE {index}
  [ON {data_type}]
     [PREFIX {count} {prefix} [{prefix} ..]
     [LANGUAGE {default_lang}]
  	SCHEMA {identifier} [AS {attribute}]
      [TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
      [SORTABLE] [NOINDEX]] ...

使用FT.CREATE命令可以建立索引,语法中的参数意义如下;

  • index:索引名称;
  • data_type:建立索引的数据类型,目前支持JSON或者HASH两种;
  • PREFIX:通过它可以选择需要建立索引的数据前缀,比如PREFIX 1 "product:" 表示为键中以product:为前缀的数据建立索引;
  • LANGUAGE:指定TEXT类型属性的默认语言,使用chinese可以设置为中文;
  • SCHEMA:索引的字段
  • identifier:指定属性名称;
  • attribute:指定属性别名;
  • TEXT | NUMERIC | GEO | TAG:这些都是属性可选的类型;
  • SORTABLE:指定属性可以进行排序。

看了语法可能不太好理解,直接对一个商品数据建立索引试试就懂了;

FT.CREATE 
	productIdx 
	ON JSON 
	PREFIX 1 "product:" 
	LANGUAGE chinese 
	SCHEMA $.id AS id NUMERIC 
	$.name AS name TEXT $.subTitle AS subTitle TEXT 
	$.price AS price NUMERIC 
	SORTABLE $.brandName AS brandName TAG

1.5.3 操作

建立完索引后,我们就可以使用FT.SEARCH对数据进行查看了,比如使用*可以查询全部;

FT.SEARCH productIdx *

由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息

FT.SEARCH productIdx * SORTBY price DESC

指定返回的字段;

FT.SEARCH productIdx * RETURN 3 name subTitle price

我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米或苹果的商品;

FT.SEARCH productIdx '@brandName:{小米 | 苹果}'

由于priceNUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;

FT.SEARCH productIdx '@price:[500 1000]'

还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;

FT.SEARCH productIdx '@name:小米*'

FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;

FT.SEARCH productIdx '黑色'

当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;

FT.SEARCH productIdx '@subTitle:红色'

通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;

FT.DROPINDEX productIdx

通过FT.INFO命令可以查看索引状态;

FT.INFO productIdx

标签:1.4,FT,name,redis,RedisJSON,Redis,JSON,json,RediSearch
From: https://www.cnblogs.com/Bkxk/p/17384977.html

相关文章

  • python操作redis集群
    1基础环境分析redis版本:redis-5.0.14 2脚本示例说明:向redis集群里面写入10000000条数据,再查询下这些数据#!/usr/bin/python3importrandomimportstringimporthashlibfromredisclusterimportRedisClusterimportdatetime"""使用redis的方式向redis集群中写入......
  • Centos7安装Redis详细步骤(配置开机自启)
    Redis获取redis安装包使用tar命令解压。$tar-zxzfredis-6.2.6.tar.gz编译和安装redis进入redis目录,执行make编译。$cdredis-6.2.6/$make编译完成后,执行makeinstall命令进行安装。$makeinstall移动redis到/usr/local/redismvredis-6.2.6/usr/local/r......
  • Windows下cygwin编译redis源码
    准备环境安装cygwin64下载地址:https://www.cygwin.com/运行安装程序,一直下一步选择阿里镜像,目前试过163,会比阿里慢需要选择的包有make、pkg-config、pythongcc相关是否需要还不确定安装重新可重复执行,缺少的包下次可以补上点击下一步等待安装完成即可下载redis源码https://......
  • 聊一聊redis十种数据类型及底层原理
    概述Redis是一个开源的高性能键值数据库,它支持多种数据类型,可以满足不同的业务需求。本文将介绍Redis的10种数据类型,分别是string(字符串)hash(哈希)list(列表)set(集合)zset(有序集合)stream(流)geospatial(地理)bitmap(位图)bitfield(位域)hyperloglog(基数统计)String概述string......
  • Ubuntu 安装最新版 redis
    可以通过以下步骤在Ubuntu上安装最新版本的Redis:1. 更新软件包索引列表。打开终端并使用如下命令:sudoaptupdate2. 安装Redis依赖项。使用如下命令:sudoaptinstallbuild-essentialtcl3. 下载最新版本的Redis。可以从Redis的官方网站获取最新版本的Redis:wgethttp://d......
  • Redis循序渐进
    常见操作String字符串setkeyvalue[exseconds][pxmilliseconds][nx|xx]设置key及值,过期时间可以使用秒或毫秒为单位setrangekeyoffsetvalue从偏移量开始复写key的特定位的值[root@redisA6379]#redis-cli-h192.168.4.51-a123456192.168.4.51:6379>setf......
  • [Redis] 解决多个 Redis 服务同步删除有关联的 key
    以下内容基于ChatGPT的回答。我有多个redis服务,比如有A,B,C三个,他们供不同的业务服务使用。有一个需求是,A服务中删除一个key后,希望能同时删除B,C服务中有关联的key,但这个key名称不一样相同,关联关系是可配置的。请问有什么办法实现?解决方案可以使用Redis的发布......
  • redis 分布式锁
    如何利用Redis实现锁机制用一句话概括的说,其实Redis实现锁机制其实就是在Redis中设置一个key-value,当key存在时,即上锁,删除key即解锁。当然要想实现一个很健壮的锁机制,这其中还有很多细节不容忽视,所以下面,我们一步一步的跟着思路去思考如何使用Redis实现一个分布式的锁:加锁保证互......
  • Netty_Redis_Zookeeper高并发实战-读书笔记
    第1章    高并发时代的必备技能1.nettyNetty是JBOSS提供的一个Java开源框架,基于NIO的客户端/服务器编程框架,能够快速开发高并发、高可用、高可靠的网络服务器程序,也能开发高可用、高可靠的客户端程序。NIO是指:非阻塞输入输出(Non-BlockingIO)。优点:API使用简单,开发门槛......
  • 了解Redis过期策略及实现原理
    大约阅读4分钟如果你使用过redis,那你一定知道过期策略这个命令吧,如果让你设计一个过期键接口,你有什么想法?我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。redi......