DeepSkyFire Develop Note - Mroonga
type: channel
link: https://deepskyfire.com/tag/Mroonga/
items: 使用Mroonga全文搜尋引擎替代MySQL的LIKE模糊查詢

使用Mroonga全文搜尋引擎替代MySQL的LIKE模糊查詢
type: item
date: 2020-07-02T00:00:00+08:00
description: 在上一篇文章《關係型SQL的全文搜尋 FullText 方案先行探究分析》中我簡單的介紹了一下現行常見的几種全文搜尋的方案。在其中我提到過這個由日本人開發的Mroonga全文搜尋引擎，由於此引擎在網路中鮮有資料能詢，索性我自己來寫一篇關於此引擎的用法，同時也會向大家説明此引擎在使用過程中如何避免踩坑。Mroonga的原理Mroonga實際上是一個MySQL系的關係型SQL中的外挂，但又與一般的Plugin有所區別。Mroonga實際上在MySQL中會被當作一個存儲引擎所被SQL辨識。然而實際上Mroonga其實只是一個中間件，他的核心帶了一個完整的Groonga。與SphinxSearch的MySQL外挂SphinxSE作爲一個中間件的原理類似，但又與SphinxSE不同的是Mroonga中已經自帶了Groonga，所以並不需要像使用了SphinxSE后還需安裝一個SphinxSearch本體程式。不管是SphinxSE還是Mroonga，兩者實現原理基本是一致的。雖説Mroonga也算是SphinxSearch師門中的一個弟子，但在實際使用過程中就能發現，Mroonga算是洗心革面重新做了人，與祖師SphinxSearch徹底不同的是，使用的作業指令與MySQL保持了最大的相容，基本可以説是MySQL的FullText全文搜尋指令如何寫，Mroonga就如何寫，格式可以説是一模一樣。反觀SphinxSearch，正宗俄國血統，作業指令基本就突出了一個暴力美學，與正常的SQL指令相差非常大。Mroonga的使用限制Mroonga的使用限制其實是源自Groonga的内部限制。表（table）的限制：單個Key（PRIMARY KEY或UNIQUE KEY）的大小最大為4KiB，也就是4KB。單個索引中所有Key（PRIMARY KEY或UNIQUE KEY）的大小最大為4GiB，也就是4GB。單表最大的記錄數（Maximum Records）：無主鍵的表（Not have PRIMARY KEY）最大記錄條數為1073741815條。差不多10億。有主鍵（PRIMARY KEY）或者使用了B樹（B-TREE）的主鍵（PRIMARY KEY USING BTREE）的最大記錄條數為1073741823條。差不多也是10億。使用了雜湊表（HASH）的主鍵（PRIMARY KEY USING HASH）的最大記錄條數為536870912條。差不多是5億。另外，如果表中的主鍵的值（Value of PRIMARY KEY）為非數字的情況下，例如是中文，那表將會無法變更為Mroonga。表中的列（Column）的限制：單個列（Column）的數據存儲大小最大為256GiB，也就是256GB。全文索引（FULLTEXT INDEX）的限制：單個全文索引中不重複條目的情況下最大可索引268435455條記錄，約2.68億。單個全文索引的大小最大為256GiB，也就是256GB。列（Column）中的值（Value）的限制：列（Column）中的值（Value）不能為NULL。如果你設置了NULL將會根據類型被自動轉換爲相應的值。擧個例子就是，比如你的值是DATE或者DATETIME，NULL將會被轉換成0或者1970-01-01 00:00:00。字符串類型（String）的值將會被轉換成空字符（empty）。其實與NULL沒區別但就是不能是NULL的意思。此限制根據官方的説明說的是只會影響存儲模式（Storage Mode），但實際上也同樣會影響中間件模式（Wrapper Mode）的索引内容。這限制直接導致了以下類似的SQL指令無法使用：... VALUES (NULL)... WHERE xx = NULL無法使用的SQL指令：CREATE TABLE (...) CHARSET not_listed_charset_aboveINSERT INTO (geometry_column_name) VALUES (GeomFromText('LineString(...)'))INSERT INTO (...) VALUES (NULL)START TRANSACTION僅支援以下類型的字符集（Character）：ASCIIBINARYCP932EUCJPMSKOI8RLATIN1SJISUJISUTF8UTF8MB4字符集（Character）的使用是可以支援該字符集的排序規則（Collations）的。例如utf8_general_ci等。Mroonga的工作模式選擇Mroonga有兩種工作模式，一種是存儲模式（Storage Mode），另一種是中間件模式（或者稱為包裝器模式，Wrapper Mode）。這兩種模式的作業原理不一樣…