OceanBase V4.3.5 上線全文索引功能,讓數據檢索更高效

近日,OceanBase 4.3.5 BP1 版本正式推出了企業級全文索引功能。該版本在中文分詞、查詢效率及混合檢索能力上進行了全面提升。經過自然語言模式和布爾模式在不同場景下的對比測試,OceanBase 的全文索引性能明顯優于 MySQL。?

點擊下載? OceanBase 社區版 4.3.5 BP1 >>?

全文索引(Full-Text Index),是一種專為加速數據庫中文本數據檢索而設計的特殊索引類型,尤其擅長處理包含大量文本字段(例如文章內容、評論、博客等)的查詢請求。它能夠支持高效的關鍵詞匹配查詢,允許在文本中搜索一個或多個詞語,并迅速返回相關結果。全文索引廣泛應用于搜索引擎和文本分析系統中,助力企業和用于迅速查找關鍵信息,顯著提升搜索效率。

在企業的實際生產中,全文索引功能可以應用于系統日志分析、用戶分析等眾多場景,全文索引能夠對數據做到高效率過濾篩選、或是高質量相關性評估。在 AI 領域,OceanBase 基于稀疏稠密向量與全文索引相結合的多路召回架構,能在具有特殊知識領域的?RAG?系統中實現更高效、更精準的召回效果。本文將深入解析其背后的技術原理,并展示其在實踐中的表現。

一、全文索引企業級功能四大核心價值

最新版本的全文索引,在以下方面幫助用戶解決更多搜索使用上的痛點:

🚩 支持分區表,索引數據和分區數據就近存儲,提高性能。

🚩 支持主表上建立多種混合索引(普通二級、全文、多值、向量等),一套數據應對不同查詢目標和加速場景。

🚩 支持 IK 中文分詞器和詞典修改,在一些需要中文專業術語的業務里,字典維護和匹配更加易用和精準。

🚩 支持常用的自然語言和布爾模式,性能優于 MySQL,功能與性能兩方面支撐業務做平替。

二、核心技術解析:BM25算法與查詢優化

數據庫中全文索引要解決的基本問題是如何通過查詢里的關鍵詞快速有效地找到對應的文檔。在 OceanBase ?存儲引擎內部,用戶的文檔(doc)會被分詞器(parser)拆分成若干關鍵詞(word/token)。這些關鍵詞連同文檔的統計信息特征被存儲在內部的輔助表(tablet)上,用于信息檢索階段的相關性評估算法(ranking)。OceanBase 采用能夠更好評估信息關聯性的 BM25 算法,對用戶查詢語句中的關鍵詞和存儲的文檔計算相關性分數,并最終輸出有關聯的文檔和其評分。

結合 OceanBase 已有的高性能查詢引擎能力,在全文索引查詢流程內,我們針對性地做了 TAAT/DAAT 流程優化、對標 Oracle 的 functional lookup 功能以及多索引間的 index merge 等,讓全文能結合更多復雜的查詢特性,完成用戶想要的數據檢索。

圖片

三、實戰測評:以中文體育新聞搜索為例

接下來,我們以中文體育新聞搜索為例,動手體驗 OceanBase 的全文索引,同時展示常用的視圖和查詢技巧。

集群部署與數據導入

首先用最新版 OceanBase 4.3.5 BP1 搭建兩副本,一個 2C4G 的 MySQL 模式租戶。

OceanBase 內置支持中文語言的 IK 分詞器,以及比傳統自然語言模式更好用的布爾模式。所以實驗的數據集使用中文足球體育新聞(https://github.com/ej0cl6/SportsSum)。在 OceanBase 內創建一張無主鍵分區表,包含三列變長字符串(event,date,news)。對 news 字段使用了 IK 中文分詞器,并指定 max_word 模式。IK 分詞器的另一種 smart 模式,和 max_word 的區別是,其在匹配到最長詞語后就停止匹配更短的詞語。

OceanBase 內置分詞器還包括適合英語的 space 和 beng。以及按照字符長度分割的 ngram。

-- 建表語句CREATE?TABLE?sport_data_whole(? event?varchar(64),??date?varchar(16),? news?varchar(65535),? fulltext INDEX (news)?WITH?parser ik PARSER_PROPERTIES?=(ik_mode?=?"max_word"));

通過客戶端本地文件的方式,將新聞數據集導入到表格內,時間大概在十五秒左右。

-- 導入語句load data?/*+ parallel(8) */??local?infile "/home/jiahua.cjh/sports_data_whole.csv"??into?table?sport_data_whole? fields terminated?by?','?lines terminated?by?'\n';

導入后共 5268 條新聞,平均文檔長度在 2700 個中文字。原始數據是 57MB 左右。實際存儲的總空間大小,在經過存儲引擎的壓縮后,連同索引不到 30MB。可以看到其中比較大的是全文索引中倒排和正排輔助表,內部存儲了比較多的分詞記錄。

-- 體育新聞數據集select? avg(length(news)),? count(*)from? sport_data_whole;+-------------------+----------+| avg(length(news)) | count(*) |+-------------------+----------+| ? ? ? ? 2781.6900 | ? ? 5268 |+-------------------+----------+1 row in set (0.03 sec)select? *from? oceanbase.DBA_OB_TABLE_SPACE_USAGE\G*************************** 1. row ***************************? ? ?TABLE_ID: 500007DATABASE_NAME: test? ?TABLE_NAME: sport_data_whole? OCCUPY_SIZE: 8349796REQUIRED_SIZE: 10489856*************************** 2. row ***************************? ? ?TABLE_ID: 500008DATABASE_NAME: test? ?TABLE_NAME:?__idx_500007_news? OCCUPY_SIZE: 30247553REQUIRED_SIZE: 31461376*************************** 3. row ***************************? ? ?TABLE_ID: 500009DATABASE_NAME: test? ?TABLE_NAME: __idx_500007_fts_rowkey_doc? OCCUPY_SIZE: 70125REQUIRED_SIZE: 77824*************************** 4. row ***************************? ? ?TABLE_ID: 500010DATABASE_NAME: test? ?TABLE_NAME: __idx_500007_fts_doc_rowkey? OCCUPY_SIZE: 73171REQUIRED_SIZE: 77824*************************** 5. row ***************************? ? ?TABLE_ID: 500011DATABASE_NAME: test? ?TABLE_NAME:?__idx_500007_news_fts_doc_word? OCCUPY_SIZE: 28302737REQUIRED_SIZE: 29364224

利用全文索引查詢

利用存儲進數據庫中的新聞數據集和索引,可以做多條件自由組合,達到高過濾性信息檢索的目的。例如作為球迷,想搜索包含有 “拜仁” 和 “烏龍球” 的新聞,推薦使用布爾模式。相較于沒有索引的字符串 like 匹配,布爾模式語法上更簡潔易懂,查詢速度也會更快。

-- 布爾模式select??count(*)from? sport_data_wholewhere??match?(news) against ('+烏龍球 +拜仁'?in?boolean?mode);+----------+|?count(*)?|+----------+|? ? ? ??2?|+----------+1?row?in?set?(0.03?sec)select??count(*)from? sport_data_wholewhere? news?like?'%烏龍球%'??and?news?like?'%拜仁%';+----------+|?count(*)?|+----------+|? ? ? ??2?|+----------+1?row?in?set?(0.08?sec)

對于返回的多條新聞,在輸出結果中增加分值,能用來幫助判斷哪條新聞更有關聯。OceanBase 的全文支持經過 BM25 算法計算得到的相關性分數。下面可以看到 date 是 0278 的新聞,和我們查詢的目的更具關聯性。

-- rankingselect? event,??date,??match?(news) against ('烏龍球 拜仁')?as?scorefrom? sport_data_wholewhere??match?(news) against ('+烏龍球 +拜仁'?in?boolean?mode);+-------+------+---------------------+|?event?|?date?|?score ? ? ? ? ? ? ??|+-------+------+---------------------+|?ucl ??|?0278?|??0.4657063867776557?||?ucl ??|?0201?|?0.41760566608994765?|+-------+------+---------------------+2?rows?in?set?(0.04?sec)

布爾模式相較于自然語言,還能反向剔除一些關鍵詞。例如每場足球比賽中幾乎都有犯規行為,如果想知道哪些比賽很激烈,但是沒有紅黃牌甚至沒有犯規,則可以用到布爾模式里的 “-” 運算符。

-- 布爾模式運算select??count(*)from? sport_data_wholewhere??match?(news) against ('+激烈 -黃牌 -紅牌 -犯規'?in?boolean?mode);+----------+|?count(*)?|+----------+|? ? ? ?31?|+----------+1?row?in?set?(0.04?sec)

一個調試的小技巧,當發現全文索引的查詢結果不符合預期時,通常是因為分詞結果不理想。OceanBase 提供了一個快速的 TOKENIZE 函數來輔助測試分詞結果。函數支持所有分詞器和對應屬性。例如下面手動的分詞結果,反映了詞典中對于國外體育明星人名的支持還不是很好(博阿滕、格策),因此用這些人名去檢索新聞的效果可能達不到預期。

-- tokenize 函數select? tokenize(? ??'博阿滕右路反擊人球分過傳中,格策后點停球轉身閃開角度,在門前8米處低射從皮亞托夫襠下鉆進門內',? ??'ik',? ??'[{"additional_args": [{"ik_mode": "smart"}]}]'? );+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?tokenize('博阿滕右路反擊人球分過傳中,格策后點停球轉身閃開角度,在門前8米處低射從皮亞托夫襠下鉆進門內',?'ik',?'[{"additional_args": [{"ik_mode": "smart"}]}]') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?["亞", "格", "夫", "阿", "門內", "從", "下鉆", "后點", "右路", "分過", "傳中", "低", "轉身", "球", "射", "閃開", "博", "進", "反擊", "門前", "停", "人", "皮", "襠", "策", "滕", "8米處", "托", "在", "角度"] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??|+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1?row?in?set?(0.03?sec)select??count(*)from? sport_data_wholewhere??match?(news) against ('+格策 +博阿滕'?in?boolean?mode);+----------+|?count(*)?|+----------+|? ? ? ??0?|+----------+1?row?in?set?(0.04?sec)

如果想提升分詞器的精準性,OceanBase 支持修改系統詞典表。當我們將上述中文人名插入到系統詞典表后,重新分詞的效果立竿見影。

🧡 注意:詞典修改后,原索引分詞效果不變,需要重建索引生效。

-- 中文人名分詞效果select? tokenize(? ??'博阿滕右路反擊人球分過傳中,格策后點停球轉身閃開角度,在門前8米處低射從皮亞托夫襠下鉆進門內',? ??'ik',? ??'[{"additional_args": [{"ik_mode": "smart"}]}]'? );+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?tokenize('博阿滕右路反擊人球分過傳中,格策后點停球轉身閃開角度,在門前8米處低射從皮亞托夫襠下鉆進門內',?'ik',?'[{"additional_args": [{"ik_mode": "smart"}]}]') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?["門內", "從", "下鉆", "后點", "右路", "分過", "傳中", "低", "轉身", "球", "皮亞托夫", "射", "閃開", "進", "反擊", "門前", "停", "人", "襠", "8米處", "在", "角度", "格策", "博阿滕"] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??|+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1?row?in?set?(0.04?sec)select??count(*)from? sport_data_wholewhere??match?(news) against ('+格策 +博阿滕'?in?boolean?mode);+----------+|?count(*)?|+----------+|? ? ? ?79?|+----------+1?row?in?set?(0.05?sec)

實驗最后,對全文索引與普通索引混合查詢下 union merge 帶來的性能提升做一個對比。對 sport_data_whole 表的 date 列再建立一個普通局部索引。可以通過 show index 觀察索引生效情況。

-- 構建普通索引alter table sport_data_whole add index (date);show index from sport_data_whole\G*************************** 1. row ***************************? ? ? ? Table: sport_data_whole? ?Non_unique: 1? ? ?Key_name: news?Seq_in_index: 1? Column_name: news? ? Collation: A? Cardinality: NULL? ? ?Sub_part: NULL? ? ? ?Packed: NULL? ? ? ? ?Null: YES? ?Index_type: FULLTEXT? ? ? Comment: availableIndex_comment:? ? ? Visible: YES? ?Expression: NULL*************************** 2. row ***************************? ? ? ? Table: sport_data_whole? ?Non_unique: 1? ? ?Key_name: date?Seq_in_index: 1? Column_name: date? ? Collation: A? Cardinality: NULL? ? ?Sub_part: NULL? ? ? ?Packed: NULL? ? ? ? ?Null: YES? ?Index_type: BTREE? ? ? Comment: availableIndex_comment:? ? ? Visible: YES? ?Expression: NULL2 rows in set (0.00 sec)

當兩個索引條件使用 OR 連接時,過濾性好的情況下,union merge 帶來的收益會比掃描普通索引后再過濾(計劃中有 has_functional_lookup=true)更快。從兩種計劃最后預估的時間上可以看到有數量級的提升。

-- union merge 計劃對比explainselect??/*+UNION_MERGE(sport_data_whole date news)*/??*from? sport_data_wholewhere??date?=?'0322'??or?(match?(news) against ('+烏龍球'?in?boolean?mode));+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?Query Plan ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?===================================================================================? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?|ID|OPERATOR ? ? ? ? ? ? ? ? ? ?|NAME ? ? ? ? ? ? ? ? ? ? ??|EST.ROWS|EST.TIME(us)|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?----------------------------------------------------------------------------------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ||?|0?|DISTRIBUTED INDEX?MERGE?SCAN|sport_data_whole(date,news)|45? ? ??|9102? ? ? ??|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?===================================================================================? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?Outputs?&?filters: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?------------------------------------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ||? ?0?-?output([sport_data_whole.event], [sport_data_whole.date], [sport_data_whole.news]),?filter([sport_data_whole.date?=?'0322'?OR?MATCH(sport_data_whole.news) ?||? ? ? ?AGAINST('+烏龍球'?IN?BOOLEAN?MODE)]), rowset=256? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??||? ? ? ?access([sport_data_whole.__pk_increment], [sport_data_whole.date], [sport_data_whole.news], [sport_data_whole.event]), partitions(p0) ? ? ? ? ? ? ? ? ? ? ??||? ? ? ?is_index_back=true, is_global_index=false, keep_ordering=true, use_index_merge=true, filter_before_indexback[false], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||? ? ? ?index_name:?date, range_cond([sport_data_whole.date?=?'0322']),?filter(nil) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??||? ? ? ?index_name: news, range_cond(nil),?filter(nil) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||? ? ? ?lookup_filter([sport_data_whole.date?=?'0322'?OR?MATCH(sport_data_whole.news) AGAINST('+烏龍球'?IN?BOOLEAN?MODE)]) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+14?rows?in?set?(0.03?sec)explainselect??*from? sport_data_wholewhere??date?=?'0322'??or?(match?(news) against ('+烏龍球'?in?boolean?mode));+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?Query Plan ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+|?===========================================================? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?|ID|OPERATOR ? ? ??|NAME ? ? ? ? ? ?|EST.ROWS|EST.TIME(us)|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?----------------------------------------------------------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ||?|0?|TABLE?FULL?SCAN|sport_data_whole|79? ? ??|526939? ? ??|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?===========================================================? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?Outputs?&?filters: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||?------------------------------------- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ||? ?0?-?output([sport_data_whole.event], [sport_data_whole.date], [sport_data_whole.news]),?filter([sport_data_whole.date?=?'0322'?OR?MATCH(sport_data_whole.news) ?||? ? ? ?AGAINST('+烏龍球'?IN?BOOLEAN?MODE)]), rowset=256? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??||? ? ? ?access([sport_data_whole.__pk_increment], [sport_data_whole.date], [sport_data_whole.news], [sport_data_whole.event]), partitions(p0) ? ? ? ? ? ? ? ? ? ? ??||? ? ? ?is_index_back=false, is_global_index=false, filter_before_indexback[false], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??||? ? ? ?range_key([sport_data_whole.__pk_increment]),?range(MIN ; MAX)always?true, has_functional_lookup=true? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+12?rows?in?set?(0.04?sec)

四、性能對比:OceanBase 遠超 MySQL

OceanBase 的全文索引性能橫向比較如何?我們以 MySQL 的全文索引為例。MySQL 的中文分詞能力不是很好,因此對比數據集選定在英文數據集 wikir1k(369721行,平均每行100詞)上。以下分別是自然語言模式,以及布爾模式下多種場景的對比結果。

結果上:

💡 OceanBase 在需要大量分詞或是返回結果的場景中,都遠優于 MySQL。

💡 小結果集上,因為計算量占比不高,查詢引擎的優勢不明顯,兩者十分接近。

測試環境如下:

  • OceanBase 租戶規格 8c 16g

  • MySQL Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL)

自然語言模式???????

# Query# q1select?*?from?wikir1k?where?match?(document)?against?('and');# q2select?*?from?wikir1k?where?match?(document)?against?('and') limit 10;# q3select?*?from?wikir1k?where?match?(document)?against?('librettists');# q4select?*?from?wikir1k?where?match?(document)?against?('librettists') limit 10;# q5select?*?from?wikir1k?where?match?(document)?against?('alleviating librettists');# q6select?*?from?wikir1k?where?match?(document)?against?('black spotted white yellow');# q7select?*?from?wikir1k?where?match?(document)?against?('black spotted white yellow') limit 10;# q8select?*?from?wikir1k?where?match?(document)?against?('between up and down');# q9select?*?from?wikir1k?where?match?(document)?against?('between up and down') limit 10;# q10select?*?from?wikir1k?where?match?(document)?against?('alleviating librettists modifications retelling intangible hydrographic administratively berwickshire strathaven dumfriesshire lesmahagow transhumanist musselburgh prestwick cardiganshire montgomeryshire');# q11select?*?from?wikir1k?where?match?(document)?against?('alleviating librettists modifications retelling intangible hydrographic administratively berwickshire strathaven dumfriesshire lesmahagow transhumanist musselburgh prestwick cardiganshire montgomeryshire and');# q12select?*?from?wikir1k?where?match?(document)?against?('alleviating librettists modifications retelling intangible hydrographic administratively berwickshire strathaven dumfriesshire lesmahagow transhumanist musselburgh prestwick cardiganshire montgomeryshire and') limit 10;

圖片

布爾模式

# Query# q1: +高頻詞 -中頻詞select?*?from?wikir1k?where?match?(document)?against?('+and -which -his'?IN BOOLEAN MODE);?# q2: +高頻詞 -低頻詞select?*?from?wikir1k?where?match?(document)?against?('+which ?(+and -his)'?IN BOOLEAN MODE);?# q3: +中頻詞 (+高頻詞 -中頻詞)select?*?from?wikir1k?where?match?(document)?against?('+and -carabantes -bufera'?IN BOOLEAN MODE);# q4: +高頻詞 +低頻詞?select?*?from?wikir1k?where?match?(document)?against?('+and +librettists'? IN BOOLEAN MODE);

圖片

五、未來路線:OceanBase 全文索引將持續演進

OceanBase 全文索引的能力還遠不止于此,結合新的技術趨勢和新的數據檢索場景,在后續版本,我們還會推出更多易用性功能。例如:

🔎 能支持交集能力的全面的 index merge;

🔎 以插件方式支持更豐富流行的多語言分詞器;

🔎 更靈活的用戶自定義詞典和停詞;

🔎 更常用的 term query、phrase query,compound query 功能;

🔎 在檢索方面,結合 OceanBase 的多模稀疏向量,進一步增強文檔的語義理解力;

🔎 使用多路召回、動態剪裁以及底層例如 WAND 的加速算法,在質量和速度兩個方面提升檢索體驗等等。

全文索引不僅是數據庫能力的延伸,更是企業實現數據智能化的關鍵基礎設施。經過全面升級的 OceanBase 全文索引,在中文處理能力、混合查詢性能、生產可用性等方面已建立顯著優勢。

無論是在傳統日志分析場景,還是結合 AI 的智能檢索需求,OceanBase 的全文索引都能提供企業級解決方案。未來,OceanBase 將持續深化"數據庫+搜索+AI"的技術融合,助力企業構建新一代智能數據平臺。

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

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

相關文章

海康攝像頭AI報警、移動偵測報警等通過Ehome/ISUP協議上報到LiveNVR流媒體平臺時如何進行報警配置

海康攝像頭AI報警、移動偵測報警等通過Ehome/ISUP協議上報到LiveNVR流媒體平臺時如何進行報警配置 1、LiveNVR介紹2、如何配置海康攝像頭、錄像機通過Ehome/ISUP注冊到LiveNVR設備 EHOME 接入配置示例設備 ISUP 接入配置示例直播流接入類型 海康ISUP海康 ISUP 設備ID啟用保存 3…

golang gmp模型分析

思維導圖: 1. 發展過程 思維導圖: 在單機時代是沒有多線程、多進程、協程這些概念的。早期的操作系統都是順序執行 單進程的缺點有: 單一執行流程、計算機只能一個任務一個任務進行處理進程阻塞所帶來的CPU時間的浪費 處于對CPU資源的利用&…

Redis基礎指令(Windows)

1.cmd命令行啟動redis 直接cmd打開整個文件 1.1.啟動server 輸入指令: redis-server.exe redis.windows.conf 會進入serve端 1.2.啟動客戶端 !!重新打開一個cmd,方法和上面一樣!! 之后輸入 redis-…

vue:前端預覽 / chrome瀏覽器設置 / <iframe> 方法預覽 doc、pdf / vue-pdf 預覽pdf

一、本文目標 <iframe> 方法預覽 pdf 、word vue-pdf 預覽pdf 二、<iframe> 方法 2.1、iframe 方法預覽需要 瀏覽器 設置為&#xff1a; chrome&#xff1a;設置-隱私設置和安全性-網站設置-更多內容設置-PDF文檔 瀏覽器訪問&#xff1a; chrome://settings/co…

【C++游戲引擎開發】第11篇:GLFW、GLAD環境搭建與第一個三角形渲染

一、GLFW、GLAD安裝 1.1 vcpkg安裝相關庫 跨平臺C++包管理利器vcpkg完全指南 # 安裝GLFW vcpkg install glfw3# 安裝GLAD vcpkg install glad1.2 初始測試代碼 #include <glad/glad.h> #include <GLFW/glfw3.h> int main() {glfwInit();GLFWwindow* window = g…

西門子S7-1500與S7-200SMART通訊全攻略:從基礎配置到遠程IO集成

以下是一篇關于西門子S7-1500與S7-200SMART通訊的詳細教程&#xff0c;包含遠程IO模塊的配置方法&#xff0c;適用于工業自動化場景的博客發布&#xff1a; 西門子S7-1500與S7-200SMART通訊全攻略&#xff1a;從基礎配置到遠程IO集成 一、硬件與軟件準備 硬件設備 主站&#x…

前端性能優化的全方位方案【待進一步結合項目】

以下是前端性能優化的全方位方案,結合代碼配置和最佳實踐,涵蓋從代碼編寫到部署的全流程優化: 一、代碼層面優化 1. HTML結構優化 <!-- 語義化標簽減少嵌套 --> <header><nav>...</nav> </header> <main><article>...</arti…

前端快速入門——JavaScript變量、控制語句

1.JavaScript 定義 JavaScript 簡稱 JS. JavaScript 是一種輕量級、解釋型、面向對象的腳本語言。它主要被設計用于在網頁上實現動態效果&#xff0c;增加用戶與網頁的交互性。 作為一種客戶端腳本語言&#xff0c;JavaScript 可以直接嵌入 HTML&#xff0c;并在瀏覽器中執行。…

GitHub 趨勢日報 (2025年04月01日)

GitHub 趨勢日報 (2025年04月01日) 本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星語言1punkpeye/awesome-mcp-serversA collection of MCP servers.? 3280未指定2th-ch/youtube-musicYouTu…

windows手動添加鼠標右鍵彈窗快捷方式

此處以添加Git Bash Here為例 一.操作步驟 按 Win R 鍵打開 運行 對話框&#xff0c;輸入 regedit&#xff0c;并按下回車&#xff0c;打開注冊表編輯器。 導航到 HKEY_CLASSES_ROOT\Directory\Background\shell。 右鍵單擊 shell&#xff0c;選擇 新建 → 項&#xff0c;并…

2025.04.09【Sankey】| 生信數據流可視化精講

文章目錄 引言Sankey圖簡介R語言中的Sankey圖實現安裝和加載networkD3包創建Sankey圖的數據結構創建Sankey圖繪制Sankey圖 結論 引言 在生物信息學領域&#xff0c;數據可視化是理解和分析復雜數據集的關鍵工具之一。今天&#xff0c;我們將深入探討一種特別適用于展示數據流動…

GD32H759IMT6 Cortex-M7 OpenHarmony輕量系統移植——4.1版本升級到5.0.3

筆者在去年利用國慶時間&#xff0c;將Cortex-M7 的國產廠商兆易創新GD32H459移植OpenHarmony輕量系統&#xff0c;但是適配不太完善——只能選擇liteos-m接管中斷。這樣導致使用中斷非常麻煩。于是筆者最近將接管中斷模式修改為不接管&#xff0c;這樣可以方便的使用gd32提供的…

【算法競賽】樹上最長公共路徑前綴(藍橋杯2024真題·團建·超詳細解析)

目錄 一、題目 二、思路 1. 問題轉化&#xff1a;同步DFS走樹 2. 優化&#xff1a;同步DFS匹配 3. 狀態設計&#xff1a;dfs參數含義 4. 匹配過程&#xff1a;用 map 建立權值索引 5. 終止條件&#xff1a;無法匹配則更新答案 6. 總結 三、完整代碼 四、知識點總…

開源免費虛擬化平臺PVE軟件定義網絡

一、PVE SDN&#xff08;Software Defined Networking&#xff09;原理與使用邏輯 SDN&#xff08;軟件定義網絡&#xff09; 是一種將網絡控制邏輯從傳統交換機、路由器中分離出來的技術&#xff0c;使得網絡可以通過軟件集中管理和自動化配置。 Proxmox VE&#xff08;PVE&…

mysql 8.0.41下載安裝教程(附安裝包)mysql 8.0.41圖文詳細安裝教程

文章目錄 前言一、mysql 8.0.41 簡介二、安裝前準備三、MySQL 8.0 安裝流程解析1.解壓安裝包2.啟動安裝程序3.選擇安裝類型4.選擇安裝組件5.開始安裝6.配置設置&#xff08;部分步驟&#xff09;7.設置數據庫密碼8.完成安裝配置9.配置環境變量&#xff1a;10.驗證安裝&#xff…

JAVA基礎八股復習

1.局部變量一般存放在棧中&#xff0c;成員變量一般存放在堆中 2.什么是多態&#xff1f;談談對多態的理解&#xff1f; 在面向對象語言中&#xff0c;接口的多種不同的實現方式即為多態。用白話來說&#xff0c;就是多個對象調用同一個方法&#xff0c;得到不同的結果。 多態中…

10:00開始面試,10:08就出來了,問的問題有點變態。。。

從小廠出來&#xff0c;沒想到在另一家公司又寄了。 到這家公司開始上班&#xff0c;加班是每天必不可少的&#xff0c;看在錢給的比較多的份上&#xff0c;就不太計較了。沒想到8月一紙通知&#xff0c;所有人不準加班&#xff0c;加班費不僅沒有了&#xff0c;薪資還要降40%…

k8s核心資源對象一(入門到精通)

本文將深入探討Kubernetes中的核心資源對象&#xff0c;包括Pod、Deployment、Service、Ingress、ConfigMap和Secret&#xff0c;詳細解析其概念、功能以及實際應用場景&#xff0c;幫助讀者全面掌握這些關鍵組件的使用方法。 一、pod 1 pod概念 k8s最小調度單元&#xff0c;…

《Sqoop 快速上手:安裝 + 測試實戰》

推薦原文 見&#xff1a;http://docs.xupengboo.top/bigdata/di/sqoop.html Sqoop&#xff08;SQL-to-Hadoop&#xff09; 是 Apache 開源的工具&#xff0c;專門用于在 Hadoop 生態系統&#xff08;如 HDFS、Hive、HBase&#xff09; 和 關系型數據庫&#xff08;如 MySQL、O…

數據結構刷題之貪心算法

貪心算法&#xff08;Greedy Algorithm&#xff09; 是一種在每個步驟中都選擇當前最優解的算法設計策略。它通常用于解決優化問題&#xff0c;例如最小化成本或最大化收益。貪心算法的核心思想是&#xff1a;在每一步選擇中&#xff0c;都做出局部最優的選擇&#xff0c;希望…