這個 side project 是約 3 年前開始的,其中一個目的是想要了解搜尋過去重大新聞的可能性,一個就是對 Meilisearch 做壓力測試。
主要有幾點:
- 系統使用量非常彈性的工具
- Disk I/O 極大
- 一些好功能在商用授權,不確定什麼時候會 open source
簡報不含講稿,請閱讀空氣、通靈、留言討論。KaLUG 的分享會有額外的內容。
ps. LibreOffice 好難用 (/‵Д′)/~ ╧╧
軟體開發和生活瑣事
這個 side project 是約 3 年前開始的,其中一個目的是想要了解搜尋過去重大新聞的可能性,一個就是對 Meilisearch 做壓力測試。
主要有幾點:
簡報不含講稿,請閱讀空氣、通靈、留言討論。KaLUG 的分享會有額外的內容。
ps. LibreOffice 好難用 (/‵Д′)/~ ╧╧
標題不知道寫什麼好,反正外掛說 SEO 100 分 …..
在開始聊 Meilisearch 之前,我想先來聊一下全文檢索。
MySQL 搜尋功能都是精確搜尋,也就是搜尋的關鍵字一定會出現。例如:
SELECT title FROM news WHERE news_content like '%逢甲夜市%'
以上的語法,搜尋結果中一定會包含「逢甲夜市」四個字。
但若我需要模糊搜尋,搜尋「逢甲」或是「夜市」,該怎麼辦?
這個時候要改用 MySQL 的全文檢索功能。
需要被全文檢索的欄位,必須先建立 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
很明顯可以分成四個詞:
中文就沒有這麼方便了,以「這是夜市」來說,這句話中一個空白都沒有,只能依照字詞長度做分割:
將所有排列組合全部列出以後,再用其他文章出現的字詞,將常用詞會出現的機率 (詞頻) 將機率大的列出。
這裡介紹中研院花了數年開發出來的中文斷詞系統 (CKIP),他不但能將詞彙列出,甚至還可以便辭性與外來語:

要成精準的分中文字詞,需要先有一個語料庫,才能較準確的搜尋與分析。而這次要介紹的 Meilisearch,就有支援不同語言的分析,所以在全文件檢索上的精確度高上許多。
Meilisearch 是一個使用 Rust 開發的全文檢索引擎,有以下特點:
先開啟 Meilisearch Github 官方網站中的 release 頁面,先抓穩定板 (這裡以 v1.10.3 為主),在下方「assets」選擇適合你的 binary 檔下載。

剛下載的 binary 沒有執行權限,使用 chmod 給他執行全賢執行權限:
chmod +x meilisearch-linux-amd64
安裝到這裡,就算是結束了。
預設的啟動方式,就是直接行 Meilisearch:

啟動後除了可以看到他們 logo 以外,往下一些還可以看到他建立了一個目錄 ./data.ms 作為資料除存使用,這邊主要儲存索引黨。
Meilisearch 使用 RESTful API,所以參考官方文件,透過 curl 便可確定是否已經能正常運作:

這邊使用 GET /indexes 來要求 Meilisearch 列出所有的 indexes,剛安裝好的當然沒什麼東西,所以 results 是空的沒錯。
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 全文檢索功能在中文處理上效果不錯
上述新聞搜尋工具,目前為以下項目做全文檢索:
搜尋會回傳的內容有:
目前使用狀況大致如下:
document 數量約 140 萬筆目前使用的狀況:
以下是我在 KaLUG 分享時使用的簡報,歡迎大家參考: