Go語(yǔ)言操作RediSearch進(jìn)行搜索方法示例詳解
引言
RediSearch是一個(gè)支持搜索功能的redis模塊。本文對(duì)此模塊進(jìn)行了介紹,并用go語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)單示例。
RediSearch提供了查詢、二級(jí)索引、全文索引功能。你需要先在相關(guān)Redis條目上建立索引,然后才能使用RediSearch進(jìn)行查詢。
RediSearch使用了壓縮算法和倒序索引算法,使得其在性能和內(nèi)存占用上都有很好的表現(xiàn)。它可以支持精確匹配、模糊匹配、數(shù)字過(guò)濾等功能。
docker-compose方式安裝
新建docker-compose.yml文件,內(nèi)容如下:
# redis-stack version: '3.1' services: redis-stack: image: redis/redis-stack-server:latest ports: - 6380:6379 volumes: - ./data:/data
執(zhí)行命令來(lái)啟動(dòng)容器:
docker-compose up -d
用Go語(yǔ)言操作RediSearch
redissearch-go是一個(gè)支持RediSearch的go語(yǔ)言客戶端,使用起來(lái)很簡(jiǎn)單。下面寫一個(gè)簡(jiǎn)單的示例:
func TestRedisSearch(t *testing.T) { // 連接 conn := redisearch.NewClient("localhost:6380", "tangshi") // 定義索引 sc := redisearch.NewSchema(redisearch.DefaultOptions).AddField(redisearch.NewTextFieldOptions("title", redisearch.TextFieldOptions{Weight: 5.0, Sortable: true})).AddField(redisearch.NewTextField("content")) // 刪除現(xiàn)有索引 conn.Drop() // 創(chuàng)建索引 err := conn.CreateIndex(sc) assert.Equal(t, err, nil) // 添加文檔 doc1 := redisearch.NewDocument("doc1", 1.0) doc1.Set("title", "春曉").Set("content", "春眠不覺(jué)曉,處處聞啼鳥(niǎo)。夜來(lái)風(fēng)雨聲,花落知多少。") doc2 := redisearch.NewDocument("doc2", 1.0) doc2.Set("title", "春夜喜雨").Set("content", "好雨知時(shí)節(jié),當(dāng)春乃發(fā)生。隨風(fēng)潛入夜,潤(rùn)物細(xì)無(wú)聲。") doc3 := redisearch.NewDocument("doc3", 1.0) doc3.Set("title", "春夜洛城聞笛").Set("content", "誰(shuí)家玉笛暗飛聲,散入春風(fēng)滿洛城。此夜曲中聞?wù)哿?,何人不起故園情。") doc4 := redisearch.NewDocument("doc4", 1.0) doc4.Set("title", "江雪").Set("content", "千山鳥(niǎo)飛絕,萬(wàn)徑人蹤滅。孤舟蓑笠翁,獨(dú)釣寒江雪。") doc5 := redisearch.NewDocument("doc5", 1.0) doc5.Set("title", "望廬山瀑布").Set("content", "日照香爐生紫煙,遙看瀑布掛前川。飛流直下三千尺,疑是銀河落九天。") // 為索引添加文檔 err = conn.IndexOptions(redisearch.DefaultIndexingOptions, []redisearch.Document{doc1, doc2, doc3, doc4, doc5}...) assert.Equal(t, err, nil) time.Sleep(time.Millisecond * 100) // 搜索 瀑布 docs, total, err := conn.Search(redisearch.NewQuery("*瀑布*").Limit(0, 5).SetReturnFields("title", "content")) assert.Equal(t, err, nil) assert.Equal(t, total, 1) assert.Equal(t, docs[0].Properties["title"], "望廬山瀑布") // 搜索 春 docs, total, err = conn.Search(redisearch.NewQuery("*春*").Limit(0, 5).SetReturnFields("title", "content").SetSortBy("title", true)) assert.Equal(t, err, nil) assert.Equal(t, total, 3) assert.Equal(t, docs[0].Properties["title"], "春夜喜雨") for _, item := range docs { t.Log(item.Properties["title"], item.Properties["content"]) } }
在上面的代碼中,我們創(chuàng)建了一個(gè)名為tangshi的索引,然后添加了5個(gè)文檔。接下來(lái),我們分別搜索了 瀑布 和 春,并測(cè)試了搜索結(jié)果。
RediSearch使用場(chǎng)景
和Eleasticsearch、Solr等搜索引擎相比,RediSearch的功能還是比較簡(jiǎn)單的,它并不是要替代這些專業(yè)的搜索引擎,并不適用于所有場(chǎng)景。
它主要適用于以下一些場(chǎng)景:
- 數(shù)據(jù)量不大,所有索引內(nèi)容可以被放進(jìn)內(nèi)存中。由于redis的數(shù)據(jù)都存儲(chǔ)在內(nèi)存中,如果索引數(shù)據(jù)內(nèi)容過(guò)大,可能不適合使用RediSearch。
- Ephemeral indexing,即臨時(shí)索引,索引內(nèi)容不需要長(zhǎng)期存儲(chǔ)。
如果有想詳細(xì)了解的,可以查閱一下下面列出的參考資料。
參考資料
以上就是Go語(yǔ)言操作RediSearch進(jìn)行搜索方法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go操作RediSearch搜索的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
redis-cli創(chuàng)建redis集群的實(shí)現(xiàn)
本文主要介紹了redis-cli創(chuàng)建redis集群的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06Redis所實(shí)現(xiàn)的Reactor模型設(shè)計(jì)方案
這篇文章主要介紹了Redis所實(shí)現(xiàn)的Reactor模型,本文將帶領(lǐng)讀者從源碼的角度來(lái)查看redis關(guān)于reactor模型的設(shè)計(jì),需要的朋友可以參考下2024-06-06淺談內(nèi)存耗盡后Redis會(huì)發(fā)生什么
這篇文章主要介紹了淺談內(nèi)存耗盡后Redis會(huì)發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Redis批量生成數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了Redis批量生成數(shù)據(jù)的實(shí)現(xiàn),主要介紹了兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06