RediSearch的簡單使用與總結

来源:https://www.cnblogs.com/dyhuang/p/18191659
-Advertisement-
Play Games

前言 之前就有考慮過想要研究下RediSearch,號稱高性能全文索引的功能,這幾天閑來無事調研了一番。 RediSearch 介紹 RediSearch 是 Redis Labs 提供的一款強大且高效的搜索和全文索引引擎。它是一個基於 Redis 的模塊,允許用戶在 Redis 資料庫中進行複雜的 ...


前言

之前就有考慮過想要研究下RediSearch,號稱高性能全文索引的功能,這幾天閑來無事調研了一番。

RediSearch 介紹

RediSearch 是 Redis Labs 提供的一款強大且高效的搜索和全文索引引擎。它是一個基於 Redis 的模塊,允許用戶在 Redis 資料庫中進行複雜的搜索和全文檢索操作,而無需將數據導出到其他搜索引擎。

推薦使用場景

RediSearch適合簡單且高效的分詞搜索場景。
針對較為複雜的全文搜索RediSearch肯定是不如ES這種專業的。但假設有一批地址信息,以醫院地址舉例,省市縣地址這些基本欄位,想要快速搜索對應地址一般如下解決方案。

  • 使用Like進行模糊匹配:太過雞肋,(比如數據是 【上海市徐匯區宜山路第六人民醫院】,搜索關鍵詞是【上海第六】肯定是搜索不到數據的)。
  • ES全文索引: 大材小用,殺雞焉用牛刀
  • 自實現分詞和倒排索引,最不推薦!吃力不討好,儘管市面上有很多中文分詞器和全文索引的插件。

這時候就很適合使用RediSearch,既可以實現簡單的(倒排索引)。又不需要使用ES那麼龐大的中間件,集成起來也相對簡單。

RediSearch安裝

RediSearch 官方推薦的 Docker 方式來安裝並啟動。

docker run --name redisearch -p 16379:6379 -v redis-data:/data redis/redis-stack-server:latest
  • --name redisearch 對容器進行命名
  • -p 16379:6379宿主機16379映射了容器6379埠
  • -v redis-data:/data 數據捲映射
  • redis/redis-stack-server:latest 表示採用redis-stack-server的最新版本
    然後進入容器中查看是否存在對應模塊
docker exec -it redisearch redis-cli

如下圖

RediSearch 創建索引和文檔

創建索引


FT.CREATE hospitalIndex ON HASH PREFIX 1 hospital: LANGUAGE  "chinese" SCHEMA id NUMERIC province TEXT SORTABLE city TEXT SORTABLE name TEXT SORTABLE
  • FT.CREATE hospitalIndex 1.0 表示創建一個名為hospitalIndex的全文索引
  • ON HASH表示數據結構為Hash
  • PREFIX 1 hospital: 表示是Key是以hospital:為首碼的數據
  • LANGUAGE "chinese指定數據的語言為中文。這對文本分析和分詞很重要,因為針對不同語言有對應的分詞器。
  • SCHEMA id NUMERIC province TEXT SORTABLE city TEXT SORTABLE name TEXT SORTABLE 表示欄位結構是 id,provice city name 其中id為數字類型,其他欄位為文本參與索引

添加索引文檔

ft.add hospitalIndex hospital:1 1.0 language "chinese" fields id 1 province "上海市" city "上海市" name "上海市第六人民醫院"
ft.add hospitalIndex hospital:2 1.0 language "chinese" fields id 2 province "上海市" city "上海市" name "上海交通大學醫學院附屬瑞金醫院"
ft.add hospitalIndex hospital:3 1.0 language "chinese" fields id 3 province "上海市" city "上海市" name "上海交通大學醫學院附屬新華醫院"
ft.add hospitalIndex hospital:4 1.0 language "chinese" fields id 4 province "上海市" city "上海市" name "上海交通大學醫學院附屬上海兒童醫學中心"
ft.add hospitalIndex hospital:5 1.0 language "chinese" fields id 5 province "上海市" city "上海市" name "復旦大學附屬中山醫院"
  • FT.ADD hospitalIndex hospital:1 1.0: 將一個文檔 hospital:1 添加到 hospitalIndex 索引中,評分為 1.0。
  • LANGUAGE "chinese": 指定文檔的語言為中文。一定要指定對應的語言,這裡會採用中文預設的分詞器
  • FIELDS: 後面跟著一系列欄位和對應的值。

查詢

ft.search [index] [keywords] language [lang]

從索引名Index中查找對應keywords,而lang為對應語言,預設會按照語言對應的分詞器進行分詞。

示例1

ft.search hospitalIndex "上海市醫院" language "chinese" 

示例2

ft.search hospitalIndex "上海市交通大學新華醫院" language "chinese" 

示例3

ft.search hospitalIndex "附屬醫院" language "chinese" 

不足之處

示例1

儘快已經基本實現了全文索引,但由於RediSearch中的中文分詞器還是有些局限性的。

比如下的幾個搜索:

如上圖所示,上海市第六 是可以搜索到數據的,但 上海第六 就無法搜索到數據了,這是因為RediSearch中的中文分詞器對應拆分不好

示例2

如下圖

上面的幾個搜索例子其實不夠恰當
不過我想強調的主要的目的還是 針對如果分詞中的部分詞性出現了【專業詞】(比如:阿莫西林) 或者類似【第六人】這種現象,RediSearch沒辦法正確分詞的。 是需要專業的分詞器和自定義字典的

示例3

還有個問題是RediSearch中分詞對應拆詞顆粒度過於細,針對短語的搜索是不夠的,聚合搜索效果很差,因為我這次的演示數據是地址數據所以不好展示處出來。
具體可以參考地址

關於RediSearch無法正常執行模糊匹配的解決方案

RediSearch 中預設的中文分詞器可能會根據版本的不一致有差異,一般都是 Friso

當然 RediSearch是支持自定義中文分詞器和自定義字典的,不過那就是另外的話題了,這裡就不提了。
具體可以參考官網:https://redis.io/docs/latest/commands/ft.dictadd/

刪除索引

ft.drop hospitalIndex

RediSearch 總結

角度 優勢 缺點
場景 適合簡單的數據類型和文本 不適合複雜的數據類型,比如富文本,長文本
集成難度 簡單指令, 方便集成 Redis知識儲備,(這個不算什麼成本吧)
執行效率 基於記憶體,搜索速度很快 分詞效果不夠理想,數據量大會影響性能
社區生態 - 社區目前過於小眾
部署 簡單搭建,方便集成,支持集群與橫向擴展 有一定的不穩定性,畢竟很少見到用於產線環境下。

參考地址

  1. RediSearch/RediSearch
  2. Redis Real-Time Search, Querying, & Indexing
  3. RediSearch 高性能的全文搜索引擎
  4. 關於RediSearch無法正常執行模糊匹配的解決方案

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • PWM
    PWM PWM 1. 什麼是PWM? 2. 面積等效原理 2.1. 什麼是面積等效原理? 2.2. 面積等效原理的理解 3. 相關概念 3.1. 周期和頻率 3.2. 占空比 4. 總結 參考鏈接 others 1. 什麼是PWM? PWM是Pulse Width Modulation的縮寫,中文是 ...
  • 筆者使用SeaTunnel 2.3.2版本將Doris數據同步到Hive(cdh-6.3.2)首次運行時有如下報錯,並附上報錯的解決方案: java.lang.NoClassDefFoundError: org/apache/hadoop/hive/metastore/api/MetaExcepti ...
  • 2024年5月15日,白鯨開源CEO郭煒在2024 DataOps發展大會上被正式聘任為DataOps專家,並獲得了榮譽證書。本次大會由中國通信標準化協會主辦,中關村科學城管委會提供支持,大數據技術標準推進委員會(CCSATC601)承辦,旨在推動DataOps領域的標準化和實踐發展。 在大會的圓桌 ...
  • 指標設計是企業戰略落地、經營決策支持和績效評估的基礎。在數字化轉型的大背景下,準確有效的指標體系能夠幫助企業快速響應市場變化,優化資源配置,提升運營效率。因此,科學合理的指標設計不僅是技術實現的問題,更是企業戰略方向和業務邏輯的體現。 企業指標體系設計面臨的典型困境 企業在構建指標體系的征途中,常遭 ...
  • 在MySQL的查詢中常常會用到 order by 和 group by 這兩個關鍵字,它們的相同點是都會對欄位進行排序,那查詢語句中的排序是如何實現的呢? ...
  • 轉載自tuoluzhe8521 導讀:通過簡化複雜的任務依賴關係, DolphinScheduler為數據工程師提供了強大的工作流程管理和調度能力。在3.2.0版本中,DolphinScheduler帶來了一系列新功能和改進,使其在生產環境中的穩定性和可用性得到了顯著提升。 為了幫助讀者更好地理解和 ...
  • 架構簡介 PolarDB-X 採用 Shared-nothing 與存儲分離計算架構進行設計,系統由5個核心組件組成。 PolarDB分散式 架構圖 計算節點(CN, Compute Node) 計算節點是系統的入口,採用無狀態設計,包括 SQL 解析器、優化器、執行器等模塊。負責數據分散式路由、計 ...
  • 本文分享自華為雲社區《MySQL 給用戶添加 ALTER VIEW 的許可權》,作者: 皮牙子抓飯。 MySQL 是一個廣泛使用的關係型資料庫管理系統,用於許多 Web 應用程式和企業級解決方案中。在 MySQL 中,用戶許可權的管理是非常重要的,以確保資料庫安全性和數據完整性。在某些情況下,需要為用戶 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...