Redis全文搜尋教程之建立索引並關聯源資料
來源:waynblog
Redis 全文搜尋是依賴於 Redis 官方提供的 RediSearch 來實現的。RediSearch 提供了一種簡單快速的方法對 hash 或者 json 型別資料的任何欄位建立二級索引,然後就可以對被索引的 hash 或者 json 型別資料欄位進行搜尋和聚合操作。
這裡我們把被索引的 hash 或者 json 型別資料叫做源資料。
本文大綱如下,
使用體驗
簡單場景下,用 RediSearch 來平替 Elasticsearch 的使用場景已經足夠。像是 Elasticsearch 中常用的查詢語法 AND 、OR 、IN 、NOT IN 、> 、< 、= 、like 等,在 RediSearch 中都是支援的。
此外 RediSearch 還支援聚合統計、停用詞、文字標記和轉義、同義詞、標籤、排序、向量查詢、中文分詞等。
就我個人來說,個人專案使用 RediSearch 作為全文搜尋引擎已經夠用了,它有佔用記憶體低、索引建立快、查詢資料效能足夠高等優點。
後續發展
就目前官方對 RediSearch 的支援更新來看,
最近一次提交記錄在 12 月 17 號。
可以看到 RediSearch 的更新頻率還是比較高的,而且是官方支援做的模組,不用擔心後續無人維護。
雖然 Redis 天生支援分散式叢集,但是 RediSearch 對 Redis 叢集的支援還不完善,引用官方說明,
官方針對 RediSearch 的叢集支援問題,提供了一個 RediSearch 叢集版本,但是這個版本只能在 Redis 企業版或者 Redis Cloud 上能使用,開源版還沒有,這一點需要告訴大家。
遇到 bug
首先在使用 RediSearch 的過程中,遇到了 bug 並發現 bug 來源於 RediSearch,不要慌,也不要抱怨難用, 畢竟是開源專案,
大家可以看到 issue 列表中有很多 bug 沒有解決。
不過本著開源共進的精神,希望大家發現了 bug 後,第一時間在 RediSearch 官方 github 上提個 issue,方便官方發現並解決問題。
RediSearch Github 倉庫地址:
下面我給大家用 newbee-mall-pro 專案作為樣本,給大家介紹下如何建立一個索引並關聯源資料。
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 的語法以及欄位定義相關的只是,可以開啟官方文件,
Redis 中查詢索引定義
在 RediSearch 中要查詢已經存在的索引詳情也是很簡單的,官方提供了 ft.info 索引名稱
的語法,用來列印索引詳情。
> FT.INFO idx:goods
最後聊兩句
本文給大家用我的開源專案 newbee-mall-pro 作為樣本,給大家細緻的介紹了一番 RediSearch 在專案實戰中關於索引建立與關聯源資料的用法,希望大家喜歡。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027826/viewspace-3001172/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server 全文搜尋功能、全文索引方式介紹SQLServer索引
- Elasticsearch——全文搜尋Elasticsearch
- Redis 也支援全文搜尋?這也太強了Redis
- ElasticSearch全文搜尋引擎Elasticsearch
- Laravel xunsearch 全文搜尋Laravel
- sphinx 全文搜尋引擎
- Nebula 基於 ElasticSearch 的全文搜尋引擎的文字搜尋Elasticsearch
- 海量資料搜尋---搜尋引擎
- Laravel 使用 xunsearch(迅搜)全文檢索引擎Laravel索引
- BookStack v1.6 釋出,實現全文搜尋並優化體驗優化
- 18. 使用MySQL之全文字搜尋MySql
- 使用 Laravel Scout + ElasticSearch 實現全文搜尋LaravelElasticsearch
- 達夢資料庫全文索引簡介資料庫索引
- IKA全文搜尋工具-桌面版(原創)
- Elasticsearch 的配置與使用,為了全文搜尋Elasticsearch
- MySQL建立資料表並建立主外來鍵關係MySql
- GoroBBS, 一個內建了全文搜尋引擎的開源bbs論壇系統Go
- 127盤搜網 網盤資源搜尋引擎
- 1688關鍵字搜尋新品資料API介面(item_search_new-按關鍵字搜尋新品API
- MySQL InnoDB搜尋索引的StopwordsMySql索引
- [開源免費]一個 AI 聯網搜尋,使用全免費資源實現AI
- layui資料表格搜尋UI
- tiktok商品搜尋資料
- Laravel5.5 使用 Elasticsearch 做引擎,scout 全文搜尋LaravelElasticsearch
- Laravel 多 where 並搜尋Laravel
- openGauss核心分析(十):資料庫搜尋引的建立過程資料庫
- 1688按關鍵字搜尋新品資料說明
- 資料庫之建立索引資料庫索引
- 多表關聯查詢中,關聯欄位都應該建立索引嗎?索引
- MySQL索引系列:全文索引MySql索引
- 微信相關資源索引索引
- 使用 Postgres 的全文搜尋構建可擴充套件的事件驅動搜尋架構套件事件架構
- springboot建立與資料庫關聯模組Spring Boot資料庫
- Spring Boot整合Postgres實現輕量級全文搜尋Spring Boot
- VuePress 部落格優化之開啟 Algolia 全文搜尋Vue優化Go
- Laravel 下 TNTSearch+jieba-PHP 實現中文全文搜尋LaravelJiebaPHP
- ES(Elasticsearch)支援PB級全文搜尋引擎入門教程Elasticsearch
- 使用Elasticsearch快速實現社群/部落格文章全文搜尋Elasticsearch