Doris中文檢索效果調優

一、問題描述

原來的日志系統使用的是ES作為底層存儲,后來因為數據量大了之后,出現了寫入存在阻塞和查詢效率變低的問題。后來決定切換到Doris數據庫。

Doris的優勢根據公開資料來看,它在寫入性能、查詢效率和存儲成本上,都優于ES。比如下面這個對比圖:

但是真正上了生產環境之后才發現,各有各的坑。

首先我們遇到的問題就是默認情況下對中文日志的檢索效果遠遠不如ES。具體比如說,搜索“預訂下單接口”,搜索結果出來還出現了同時包含“預訂”“下單”“接口”的日志信息,也就是說這一句話被分詞后進行了分別匹配。比如說:

這個結果也被搜索了出來,這顯然不是我們期望看到的結果。但是在ES上進行同樣搜索的時候就不存在這個問題。

二、解決探索

從理論上分析導致這個搜索結果有兩個原因:

  1. 是入庫階段對文本進行分詞操作的時候,按照較細粒度的中文詞拆分后入的庫;
  2. 是在檢索的時候是簡單的按照是否包含詞來判斷匹配情況,而沒有按照短語進行匹配。

針對第一個原因的探究,我們首先來看看Doris是如何分詞入庫的。

1.查看Doris官方文檔我們得知,在表創建時,可以通過指定索引的倒排索引屬性值,來對索引的分詞和短語支持進行設置的,官方文檔:倒排索引 - Apache Doris

其中最關鍵的就是parser、support_phrase、parser_mode三個參數。

2.查看我們現有的表結構可以獲知目前我們的表是這么設置這些參數的:

CREATE TABLE `logs` (`alllogs` text NULL COMMENT '日志',INDEX idx_alllogs (`alllogs`) USING INVERTED PROPERTIES("support_phrase" = "false", "char_filter_pattern" = ".,", "parser" = "unicode", "lower_case" = "true", "char_filter_replacement" = " ", "char_filter_type" = "char_replace") COMMENT 'idx_alllogs'
) ENGINE=OLAP ......

parser:在這里的用處就是指定索引的分詞器,這里我們原來設置的是unicode。

support_phrase:使用了false,也就是關閉了短語支持。同時parser_mode就沒有必要設置了。

3.我們來看看parser的三個分詞器english、chinese、unicode效果上有什么差異:

SELECT TOKENIZE('預訂下單接口報錯 at com.test.com.CheckOneTwo.doCheck', '"parser"="english"');
--運行結果:["at", "com", "test", "com", "checkonetwo", "docheck"]SELECT TOKENIZE('預訂下單接口報錯 at com.test.com.CheckOneTwo.doCheck', '"parser"="chinese"');
--運行結果:["預訂", "下單", "接口", "報錯", "com", "test", "com", "CheckOneTwo", "doCheck"]SELECT TOKENIZE('預訂下單接口報錯 at com.test.com.CheckOneTwo.doCheck', '"parser"="unicode"');
--運行結果:["預", "訂", "下", "單", "接", "口", "報", "錯", "com.test.com.checkonetwo.docheck"]

可以看到三種結果都各有各的問題:english直接忽略了中文,chinese雖然按中文詞的粒度進行拆分但是又把包名進行了單次拆分,而unicode雖然把包名當成了整體但是卻把中文拆成了單個字。

而如果我們在ES中使用IK分詞器它的分詞結果會是:

"預訂","訂下","訂","下單","接口","報錯","com.test.com.checkonetwo.docheck","com","test","com","checkonetwo","docheck"

顯然從分詞效果來看IK分詞是最好的,但是遺憾的是Doris目前的版本并不支持IK分詞(Doris官方計劃2025年年內支持)。

僅僅基于目前的條件,parser設置為chinese或者unicode都可以。而對效果影響最大的應該是短語搜索的支持。

4.support_phrase設置為true之后,就支持短語搜索了,具體的修改過程如下:

SHOW INDEX FROM logs;
--查看表大小
SHOW DATA FROM logs;
--查看索引任務
show BUILD INDEX WHERE TableName="logs";--刪除索引
ALTER TABLE logs DROP INDEX idx_alllogs;--嘗試1:改為support_phrase=true, parser=chinese。
ALTER TABLE logs ADD INDEX idx_alllogs(`alllogs`) USING INVERTED PROPERTIES("support_phrase" = "true", "parser" = "chinese", "lower_case" = "true") COMMENT 'idx_alllogs';--嘗試2:改為support_phrase=true, parser=unicode。
ALTER TABLE logs ADD INDEX idx_alllogs(`alllogs`) USING INVERTED PROPERTIES("support_phrase" = "true", "parser" = "unicode", "lower_case" = "true") COMMENT 'idx_alllogs';--重建索引
BUILD INDEX idx_alltext ON logs_message_crs;

這里我測試了support_phrase設置為true之后,分別設置chinese和unicode兩個分詞器的索引,觀察了下存儲代價。

logs表在support_phrase設置為false時,表大小3.9G。

改為support_phrase=true、 parser=chinese,表大小變為了8.9G。

改為support_phrase=true 、parser=unicode,表大小變為了8.0G。

可見短語支持讓表空間幾乎大了一倍。根據我們生產環境同樣數據與ES的橫向對比得出一個結論:要Doris實現與ES同樣的中文搜索效果,可能在存儲空間大小上Doris并無優勢。

接下來我們針對上面的第二個原因進行探究,也就是查詢需要使用短語查詢。

查詢的時候有四種查法。

1. LIKE:跟MySQL差不多,如果使用LIKE "%keyword%"進行匹配,大部分時候是用不到索引的,會進行全表掃描,查詢效率極低,所以不推薦。

2.MATCH_ANY:"keyword1 keyword2",多個搜索關鍵字時,只要包含其中任意一個就會命中。值得注意的是如果keyword是多個中文短語,那么會被拆成詞語后進行匹配。比如說“預定信息? 錯誤異常”,會把只包含“預定”的記錄也會匹配出來。也就是這里并沒有用上短語匹配。

3.MATCH_ALL:"keyword1 keyword2",多個搜索關鍵字時,包含全部關鍵字才會命中。同樣值得注意的是是如果keyword是多個中文短語,那么會被拆成詞語后進行匹配。比如說“預定信息? 錯誤異常”,它會把同時包含“預定” “信息” “錯誤” “異常”的匹配出來,是拆分后進行匹配的。同樣也沒有用上短語匹配。

4.MATCH_PHRASE:這個才是我們需要用到的短語匹配的能力。當我們需要MATCH_PHRASE "預定訂單錯誤"時,他會把"預定訂單錯誤"當成一個短語整體進行匹配,而不是拆分成單個詞進行匹配。但是這里又有一個新的問題需要注意,就是多個關鍵詞匹配的問題,如果我們需要搜索同時包含“預定信息? 錯誤異常”的日志,那么使用MATCH_PHRASE "預定信息? 錯誤異常"將無法得到我們想要的結果,因為它會把"預定信息? 錯誤異常"當成一個整體,而不是以空格為切分。那多個關鍵字如何匹配呢,其中一個簡單的辦法就是使用多個MATCH_PHRASE進行匹配,比如說:MATCH_PHRASE "預定信息" AND?MATCH_PHRASE "錯誤異常",這樣就能達到預期的效果。

三、結論

好了,以上就是整個調優和分析的過程,總結一下如何解決Doris的中文檢索效果,有如下幾個關鍵點:

1.打開support_phrase=true,使其索引支持短語檢索。但是要注意這里將會帶來額外的存儲開銷。

2.parser設置為chinese或者unicode,使其支持中文分詞。

3.使用MATCH_PHRASE進行短語匹配。

希望上面的內容對你有所幫助,如果你還遇到其他問題,歡飲留言區討論。

參考材料:為什么 Apache Doris 是比 Elasticsearch 更好的實時分析替代方案?-騰訊云開發者社區-騰訊云

Doris如何做到將查詢性能提升100倍 - 墨天輪

Doris 超全索引實戰教程 - 墨天輪

深入剖析 Doris 倒排索引(上):原理與應用全解析?_doris 分詞器-CSDN博客

倒排索引 - Apache Doris

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91165.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91165.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CDN怎么加速跟防御網站攻擊呢?

**CDN(內容分發網絡)**通過分布式架構和智能路由技術,不僅可以加速網站內容訪問,還能有效防御多種網絡攻擊(如DDoS、SQL注入等)。以下是 CDN 如何實現加速和防御的詳細解析:1. CDN 如何加速網站…

【Linux】批量處理多個用戶的 sudo 權限問題

要批量處理多個用戶的 sudo 權限問題,有以下幾種高效方法: 方法一:通過用戶組批量授權(推薦) 這是最安全便捷的方式,只需將用戶加入已有 sudo 權限組(如 wheel 或 sudo):…

云原生MySQL Operator開發實戰(五):擴展與生態系統集成

引言 在前四篇文章中,我們構建了一個功能完備的MySQL Operator,涵蓋了從基礎架構到生產部署的全過程。本文將作為本系列的收官之作,重點探討Operator的擴展能力和與云原生生態系統的深度集成,包括自定義插件系統、與CI/CD流水線的集成、服務網格支持以及與云服務的無縫對接…

【MySQL】數據庫的簡單介紹

1.數據庫是什么簡單來說,數據庫是用于存儲數據和管理數據的軟件。數據庫可以提供遠程服務,通過遠程連接來使用數據庫,因此數據庫也被稱為數據庫服務器!2.為什么要使用數據庫存儲數據用文件就可以了,為什么還要弄一個數…

uniapp,uview icon加載太慢了,老是顯示叉叉,將遠程加載改到本地加載。

處理方式:將遠程字體文件下載到本地進行加載。app.vue。font-face {font-family: uicon-iconfont;src: url(./static/fonts/font_2225171_8kdcwk4po24.ttf) format(truetype);font-weight: normal;font-style: normal;}下載文件:從node_modules找文件u-i…

Python爬蟲01_Requests第一血獲取響應數據

引入requests包,發起請求并獲取響應數據。 import requestsif __name__ "__main__":#step 1:指定urlurl http://www.7k7k.com/#step 2:發起請求,get方法會返回一個響應對象response requests.get(url)#step 3&#x…

Linux定時器和時間管理源碼相關總結

基礎可參考: Linux內核定時器相關內容總結-CSDN博客 定時器來源 定時器也是來源于芯片的硬件定時器,屬于內部外設,有些可能也會用外部定時器,不管咋樣,都屬于芯片外設,既然是外設,那么我們也要編…

JDK17 新特性跟學梳理

JDK17 新特性跟學梳理JDK17 背景介紹一、JDK 17對Switch語句的增強二、字符串拼接三、強制轉換四、密封類Sealed Classes五、Record類六、優化空指針異常信息七、ZGC垃圾收集器八、JVM常量API九、重寫Socket底層API十、JDK飛行記錄事件流十一、EdDSA簽名算法十二、隱藏類十三、…

ESP8266 AT 固件

ESP-12E 是一種常見的 ESP8266 模塊,通常帶有 4MB(32Mbit)閃存,非常適合刷寫 最新版 AT 固件。 ? 適用于 ESP?12E 的 AT 固件推薦 固件來源固件版本特點Espressif 官方v2.2.1.0 (ESP8266 IDF AT)官方最新版,基于 RT…

Node.js(三)之Express

Express 目錄 Express 九、初識Express 9.1 Express簡介 1. 什么是 Express 2. 進一步理解Express 3. Express能做什么 9.2 Express的基本使用 1. 安裝 2. 創建基本的Web服務器 3. 監聽GET請求 4. 監聽POST請求 5. 把內容響應給客戶端 6. 獲取URL中攜帶的查詢參數…

IKAnalyzer分詞插件使用方法

前言 隨著越來越多的大數據網站崛起,特別是一些私人網站都提供了站內搜索,有些人會用elastsearch來實現站內搜索的目的,但是一些小站并沒有那么大的數據提供搜索,在安裝一個 elastsearch 服務未免有點浪費? 因此&#…

ESB 在零售,物流,制造,保險,醫療行業的應用方式

企業服務總線(Enterprise Service Bus, ESB)是一種基于中間件的集成模式,用于實現不同系統之間的集成與通信。ESB通過標準化接口、消息路由、協議轉換和數據轉換等功能,幫助企業實現系統間的無縫對接,提高業務敏捷性。…

vcsa6.7-重置root密碼

客戶反饋vc無法登錄了,登錄環境一看,報錯如下首先想到是證書到期了,瀏覽器確認,確實是證書到期了準備ssh登錄才發現root密碼忘記了,那就先重置root密碼,1、登錄esxi主機找到vcsa6.7機器關機做快照2、開機到…

C++ 賦值與交換法則

在C中,賦值與交換法則(Assignment and Swap Idiom)通常指的是在實現類的賦值操作符(operator)時,結合拷貝構造和交換操作來確保強異常安全保證(Strong Exception Safety Guarantee)的…

Ambari中文漢化

Ambari-ZH 當前Ambari的漢化版本為2.7.4,漢化采用對該版本的ambari源碼直接修改的方式進行,如有翻譯不當之處,請批評指正 一、使用方法如下: 方式一:直接下載 下載地址:https://github.com/ukayunnuo/Ambari-2.7.x-zh/releases/download/…

表格之固定列和表頭

說明 利用粘性定位實現 列固定 td.fixed {position: sticky;left: 0;z-index: 5;/* 最好指定背景&#xff0c;否則滑動時會顯示下面的列 */background-color: #f8f9fa; }表頭固定 <head><style>.table-container {position: relative;display: flex;overflow: hidd…

React 圖標庫發布到 npm 倉庫

將搭建的 React 圖標庫發布到 npm 倉庫需要經過一系列步驟&#xff0c;包括配置 package.json、構建代碼、注冊 npm 賬號、測試和發布。以下是詳細流程&#xff1a; 1. 準備工作 (1) 確保項目結構完整 圖標庫的典型結構&#xff08;以 Rollup 構建為例&#xff09;&#xff1…

Java學習第八十四部分——HttpClient

目錄 一、前言介紹 二、主要特點 三、功能用法 四、應用場景 五、最佳實踐 六、總結歸納 一、前言介紹 HttpClient 是一個用于發送 HTTP 請求和接收 HTTP 響應的客戶端庫&#xff0c;廣泛應用于 Web 開發、API 調用、微服務通信等場景。 二、主要特點 支持多種HTTP方…

學習筆記-中華心法問答系統的性能提升

1.簡介本周主要任務是自行查找文獻&#xff0c;針對源代碼進行性能提升&#xff0c;主要包括三個方面&#xff1a;預處理&#xff1a;分詞、關鍵詞提取、詞向量生成&#xff1b;文本分析&#xff1a;從多個關鍵詞的詞向量&#xff0c;如何到一句話的語義理解&#xff1b;問題分…

Python爬蟲03_Requests破解百度翻譯

爬取百度翻譯頁面信息 以POST方法發送JSON數據&#xff0c;爬取響應信息&#xff0c;并且需要對響應信息對象類型進行區分。 import requests import json#1.指定url post_url https://fanyi.baidu.com/sug#2.進行UA封裝 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; …