RedisJSON實(shí)戰(zhàn)進(jìn)階

主要實(shí)現(xiàn)json文檔的條件查詢,文檔高亮顯示,分頁 功能

maven依賴

<!--jedis版本要是4.0或更高-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.0.0</version>
</dependency>       

java代碼

import cn.hutool.core.lang.Console;
import cn.hutool.json.JSONUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.providers.PooledConnectionProvider;
import redis.clients.jedis.search.*;

import java.util.List;
import java.util.stream.IntStream;

/**
 * <p>
 *      RedisJson測(cè)試類
 * </p>
 *
 * @author: liuchangjun
 * @since: 2021/12/22 15:50
 */
public class RedisJsonTest {

    /**
     * <p>
     *     使用jedis操作
     * </p>
     */
    @Test
    public void testWithJedis(){
        // 獲取連接
        HostAndPort config = new HostAndPort("127.0.0.1", 6379);
        PooledConnectionProvider provider = new PooledConnectionProvider(config);
        UnifiedJedis client = new UnifiedJedis(provider);

        // 創(chuàng)建學(xué)生對(duì)象
        Student student1 = new Student("John","Smith",30,"杭州蕭山");
        Student student2 = new Student("John","White",37,"北京海定");
        Student student3 = new Student("Tom","White",24,"美國紐約");
        // 添加json
        client.jsonSet("student:1", redis.clients.jedis.json.Path.ROOT_PATH,student1);
        client.jsonSet("student:2",redis.clients.jedis.json.Path.ROOT_PATH,student2);
        client.jsonSet("student:3",redis.clients.jedis.json.Path.ROOT_PATH,student3);
        // 查詢
        Student student = client.jsonGet("student:1", Student.class,redis.clients.jedis.json.Path.ROOT_PATH);
        System.out.println(JSONUtil.toJsonStr(student));

        // 刪除索引
        client.ftDropIndex("student-index");

        // 創(chuàng)建索引
        // 創(chuàng)建要索引的字段
        Schema schema = new Schema().
                addField(new Schema.Field(new FieldName("$.firstName", "first"), Schema.FieldType.TEXT)).
                addField(new Schema.Field(new FieldName("$.lastName", "last"), Schema.FieldType.TEXT)).
                addField(new Schema.Field(new FieldName("$.address", "address"), Schema.FieldType.TEXT));
        // 只索引key以student:開頭的
        IndexDefinition rule = new IndexDefinition(IndexDefinition.Type.JSON).setPrefixes("student:");
        // 創(chuàng)建索引
        client.ftCreate("student-index",IndexOptions.defaultOptions().setDefinition(rule),schema);

        // 查詢名字以John開頭的學(xué)生,并高亮顯示
        Query q = new Query("@first:John*").
                highlightFields(new Query.HighlightTags("<b>","</b>"),"first").
                returnFields("first","address","last");
        SearchResult searchResult = client.ftSearch("student-index", q);
        List<Document> documents = searchResult.getDocuments();
        for(Document document : documents){
            Console.log(JSONUtil.toJsonStr(document));
        }

    }

    @Test
    public void testWithJedis2(){
        // 獲取連接
        HostAndPort config = new HostAndPort("127.0.0.1", 6379);
        PooledConnectionProvider provider = new PooledConnectionProvider(config);
        UnifiedJedis client = new UnifiedJedis(provider);


        // 創(chuàng)建學(xué)生對(duì)象
        IntStream.range(1,20).boxed().forEach(i -> {
            Student student = new Student("John" + i,"Smith" + i,30,"杭州蕭山" + i);
            // 添加json
            client.jsonSet("student:" + i, redis.clients.jedis.json.Path.ROOT_PATH,student);
        });

        // 刪除索引
        client.ftDropIndex("student-index");

        // 創(chuàng)建索引
        // 創(chuàng)建要索引的字段
        Schema schema = new Schema().
                addTextField("$.firstName",1.0).
                addTextField("$.lastName", 1.0).
                addTextField("$.address",1.0);
        // 只索引key以student:開頭的
        IndexDefinition rule = new IndexDefinition(IndexDefinition.Type.JSON).setPrefixes("student:");
        // 創(chuàng)建索引
        client.ftCreate("student-index",IndexOptions.defaultOptions().setDefinition(rule),schema);

        // 查詢名字以John開頭的學(xué)生,并高亮顯示,帶分頁
        // 查詢字符串需要轉(zhuǎn)義
        Query q = new Query("@\\$\\.firstName:John*").
                highlightFields(new Query.HighlightTags("<b>","</b>"),"$.firstName").
                returnFields("$.firstName","$.lastName","$.address").limit(1,10);
        SearchResult searchResult = client.ftSearch("student-index", q);
        List<Document> documents = searchResult.getDocuments();
        for(Document document : documents){
            Console.log(JSONUtil.toJsonStr(document));
        }

    }


    @Data
    @AllArgsConstructor
    private static class Student {
        private String firstName;
        private String lastName;
        private int age;
        private String address;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崔挖,一起剝皮案震驚了整個(gè)濱河市佑惠,隨后出現(xiàn)的幾起案子沸呐,更是在濱河造成了極大的恐慌弓熏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺厨,死亡現(xiàn)場(chǎng)離奇詭異攻人,居然都是意外死亡庭惜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涝开,熙熙樓的掌柜王于貴愁眉苦臉地迎上來循帐,“玉大人,你說我怎么就攤上這事忠寻【逶。” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵奕剃,是天一觀的道長。 經(jīng)常有香客問我捐腿,道長纵朋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任茄袖,我火速辦了婚禮操软,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪祥。我一直安慰自己聂薪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布蝗羊。 她就那樣靜靜地躺著藏澳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耀找。 梳的紋絲不亂的頭發(fā)上翔悠,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音野芒,去河邊找鬼蓄愁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狞悲,可吹牛的內(nèi)容都是我干的撮抓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼摇锋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丹拯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乱投,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤咽笼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后戚炫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剑刑,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了施掏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钮惠。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖七芭,靈堂內(nèi)的尸體忽然破棺而出素挽,到底是詐尸還是另有隱情,我是刑警寧澤狸驳,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布预明,位于F島的核電站,受9級(jí)特大地震影響耙箍,放射性物質(zhì)發(fā)生泄漏撰糠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一辩昆、第九天 我趴在偏房一處隱蔽的房頂上張望阅酪。 院中可真熱鬧,春花似錦汁针、人聲如沸术辐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉词。三九已至,卻和暖如春帆精,著一層夾襖步出監(jiān)牢的瞬間较屿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工卓练, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隘蝎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓襟企,卻偏偏與公主長得像嘱么,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顽悼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你曼振,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,732評(píng)論 2 59
  • 用到的組件 1蔚龙、通過CocoaPods安裝 2冰评、第三方類庫安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,619評(píng)論 1 180
  • Solr概述 Solr是一個(gè)獨(dú)立的企業(yè)級(jí)搜索應(yīng)用服務(wù)器木羹,它對(duì)外提供類似于的API接口甲雅。用戶可以通過http請(qǐng)求解孙,向...
    Forest7閱讀 404評(píng)論 0 1
  • 分布式框架中間件總綱 http://www.reibang.com/p/00aa796bb5b8[https:/...
    鄙人_阿K閱讀 824評(píng)論 0 2
  • 這里關(guān)于es的下載和啟動(dòng)就不多說了,不會(huì)的可以去看我一篇專門講下載啟動(dòng)的文章:https://www.jiansh...
    唯有努力不欺人丶閱讀 12,303評(píng)論 0 3