標題不知道寫什麼好,反正外掛說 SEO 100 分 …..
在開始聊 Meilisearch 之前,我想先來聊一下全文檢索。
MySQL 的搜尋
MySQL 搜尋功能都是精確搜尋,也就是搜尋的關鍵字一定會出現。例如:
SELECT title FROM news WHERE news_content like '%逢甲夜市%'
以上的語法,搜尋結果中一定會包含「逢甲夜市」四個字。
但若我需要模糊搜尋,搜尋「逢甲」或是「夜市」,該怎麼辦?
這個時候要改用 MySQL 的全文檢索功能。
MySQL 全文檢索 (Full Text Indexing)
需要被全文檢索的欄位,必須先建立 fulltext 的索引:
create index full_text_idx_news on news (news_content) using full_text
搜尋時就可以使用全文檢索語法:
SELECT title FROM meilisearch_index_urls WHERE match(news_content) AGAINST ("逢甲夜市")
這時「逢甲夜市」、「逢甲」、「夜市」應該都有機會被列出來,但是準確度並不高。
中文斷詞
以英語系的語言,要將詞彙區分出來較為容易,因為每個詞中間都有空白:
This is night market
很明顯可以分成四個詞:
- this
- is
- night
- market
中文就沒有這麼方便了,以「這是夜市」來說,這句話中一個空白都沒有,只能依照字詞長度做分割:
- 這是夜市 (4-grams)
- 這是夜 (3-grams)
- 是夜市 (3-grams)
- ….
將所有排列組合全部列出以後,再用其他文章出現的字詞,將常用詞會出現的機率 (詞頻) 將機率大的列出。
這裡介紹中研院花了數年開發出來的中文斷詞系統 (CKIP),他不但能將詞彙列出,甚至還可以便辭性與外來語:
要成精準的分中文字詞,需要先有一個語料庫,才能較準確的搜尋與分析。而這次要介紹的 Meilisearch,就有支援不同語言的分析,所以在全文件檢索上的精確度高上許多。
Meilisearch
Meilisearch 是一個使用 Rust 開發的全文檢索引擎,有以下特點:
- 搜尋速度快
- 隨打即找
- 支援多國語言 (你不需要另外裝套件啦)
- RESTfulf API,不管什麼語言、工具都很容易串接
- 由於是 Rust 開發,只要複製 binary 下來即可執行,不需要額外的安裝步驟
安裝
先開啟 Meilisearch Github 官方網站中的 release 頁面,先抓穩定板 (這裡以 v1.10.3 為主),在下方「assets」選擇適合你的 binary 檔下載。
剛下載的 binary 沒有執行權限,使用 chmod 給他執行全賢執行權限:
chmod +x meilisearch-linux-amd64
安裝到這裡,就算是結束了。
啟動 Meilisearch
預設的啟動方式,就是直接行 Meilisearch:
啟動後除了可以看到他們 logo 以外,往下一些還可以看到他建立了一個目錄 ./data.ms
作為資料除存使用,這邊主要儲存索引黨。
Meilisearch 使用 RESTful API,所以參考官方文件,透過 curl 便可確定是否已經能正常運作:
這邊使用 GET /indexes
來要求 Meilisearch 列出所有的 indexes,剛安裝好的當然沒什麼東西,所以 results
是空的沒錯。
新增 documents
Meilisearch 的資料為 document
,不是資料表,所以資料只要標明欄位名稱、內容,級可以被建立索引,且前後的 document 其使欄位不同也可以被接受。
這裡準備一個範例 document:
[ { "id": 1, "name": "日升", "phone": "0987654321", "tag": ["programming", "photograing", "readding"] }, { "id": 2, "name": "日落", "tag": ["programming", "PHP", "back-end", "docker"] } ]
然後按照 Meilisearch add documents 的說明新增資料:
這邊 Meilisearch 並不會告訴你是否成功,因為所有的動作都會先進度工作佇列,再慢慢處理。
執行後拿到的 tasekUid
是「0」,我們可以再使用這個 ID 去查詢執行狀態:
curl -X GET 'http:///localhost:7700/tasks/0'
task 這邊回有很詳細的狀態,像是成功或失敗,開始時間、結束時間等等。
操作沒有很複雜,看一下 Meiliserch 官方文件差不多都可以解決。
我這邊建立索引的新聞內容,目前放在自家網站 Zeroplex
的新聞搜尋工具,大家可以拿一些奇怪的中文字去搜尋看,Meilisearch 全文檢索功能在中文處理上效果不錯
上述新聞搜尋工具,目前為以下項目做全文檢索:
- 新聞標題
- 新聞內容
搜尋會回傳的內容有:
- 新聞標題
- 日期
- URL
目前使用狀況大致如下:
document
數量約 140 萬筆- 索引大小約 28 GB
目前使用的狀況:
- 查詢的速度很快,只要搜尋的文字很短速度就很快;但若關鍵字較長也會讓搜尋時間變長
- 中文的支援很棒,不會出現很奇怪的斷字詞
- 建立索引的速度慢
- 在 v1.4.x 時,為一個 document 建立索引可以會花上 1 分鐘以上,且這一分鐘會附加滿滿的 disk I/O
- 升級到 v1.9.x 以後,建立索引的速度快很多,disk I/O 的量沒有像以前那麼誇張
- 如果第一次使用,建議直接從最新版開始使用
以下是我在 KaLUG 分享時使用的簡報,歡迎大家參考: