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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...