Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

作者: 日落

(AI 奈米量子科技之 LLM 什麼的) Meilisearch 簡介

Posted on 2024 年 10 月 24 日 By 日落 在〈(AI 奈米量子科技之 LLM 什麼的) Meilisearch 簡介〉中尚無留言

標題不知道寫什麼好,反正外掛說 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 檔下載。

meilisearch binary after downloaded

剛下載的 binary 沒有執行權限,使用 chmod 給他執行全賢執行權限:

chmod +x meilisearch-linux-amd64

安裝到這裡,就算是結束了。

啟動 Meilisearch

預設的啟動方式,就是直接行 Meilisearch:

Meilisearch 啟動畫面

啟動後除了可以看到他們 logo 以外,往下一些還可以看到他建立了一個目錄 ./data.ms 作為資料除存使用,這邊主要儲存索引黨。

Meilisearch 使用 RESTful API,所以參考官方文件,透過 curl 便可確定是否已經能正常運作:

使用 curl 出較 Meilisearch API

這邊使用 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 的說明新增資料:

新增 documents 以後的 result

這邊 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 分享時使用的簡報,歡迎大家參考:

    Tags:Meilisearch, 分享, 資訊學習

    在 mysqldump 指定要匯出的條件

    Posted on 2024 年 9 月 22 日2024 年 9 月 22 日 By 日落 在〈在 mysqldump 指定要匯出的條件〉中尚無留言

    一般來說,mysqldump 會出 dbname.mytable 的語法大致如下:

    mysqldump dbname mytable -u root -p

    如果 table 中的資料太多,只想匯出較新的項目,如 id 大於特定數值,則可使用 --where:

    mysqldump dbname mytable \
        --where 'id > 10000' \
        -u root -p

    --where 使用時要注意引號,如果有字串時記得要 escape 掉

    Tags:MariaDB, MySQL

    Reaspberry Pi Pico W 無線網路連線寫法

    Posted on 2024 年 6 月 26 日2024 年 6 月 26 日 By 日落 在〈Reaspberry Pi Pico W 無線網路連線寫法〉中尚無留言

    Raspberry Pi Pico W Getting Start 的範例程式其實蠻簡單的:

    import network
    from time import sleep
    
    wlan = network.WLAN(network.STA_IF)
    
    wlan.active(True)
    wlan.connect("Zeroplex", "wifi-password")
    
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    
    print(wlan.ifconfig())

    但事實上這段 Pico W 的行為會和程式碼有一段差距。

    先來看一下 active() 這段:

    wlan.active(True)
    wlan.connect("Zeroplex", "wifi-password")

    在啟用 wifi 以後,必須先掃描所有 wifi SSID。掃描會花上一段時間,因此若不先等待掃描完畢,而直接 connect() 可能會出現錯誤,像是「SSID 不存在」之類的。

    較好的寫法會是:

    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    # wait for SSID scan and discover
    sleep(5)
    
    # connect
    wlan.connect("Zeroplex", "wifi-password")
    
    # check connection
    if False == wlan.isconnected():
        print('failed to connect')
    else:
        print('connected')
    Tags:Python, Raspberry Pi

    更改 Kali Linux 的使用者界面語言

    Posted on 2024 年 6 月 8 日2024 年 6 月 8 日 By 日落 在〈更改 Kali Linux 的使用者界面語言〉中尚無留言

    幾年前,在安裝時 Kali Linux 就會自動設定桌面環境的語言,安裝完成後就有中文界面可以使用。

    新版的 Kali Linux 安裝完成後,預設還是使用英文。若要調整桌面環境的預設語言,必須透過 dpkg-reconfigure 修改:

    sudo dpkg-reconfigure locales

    選擇要安裝的 locales 以及預設的 locale,個人除了安裝 zh_TW 以外,還會使用 en_US,畢竟英文的錯誤訊息在網路上比較容易查資料:

    選擇欲安裝的語言
    選擇預設語言

    設定完畢,重新開機即可看到中文環境。

    ps. 若要使用中文輸入法,仍需要自行安裝

    Tags:Kali, Linux

    Proxmox 處理器類型

    Posted on 2024 年 5 月 4 日 By 日落 在〈Proxmox 處理器類型〉中尚無留言

    在 VM 中 docker build and docker run 後出現錯誤訊息:

    Attaching to my-service-1
    my-service-1  | Illegal instruction (core dumped)
    my-service-1 exited with code 0

    其他專案都沒事,這個用到 tensorflow 的卻故障,猜測就是這邊的問題了。

    透過上面的錯誤訊息,查到的多是與處理器架構有關的資料,所以猜測與 Proxmox 中的處理器類型有關。

    處理器類型的選項如下:

    在 Proxmox 的處理器類型中,據網友說預設處理器類型是 x86-64-v2-AES,應該不會遇到問題 (八成我不小心動到了)。若不確定要選擇哪一類型處理器,可以選擇 host 使用實體處理器。

    Tags:Proxmox

    文章分頁

    上一頁 1 2 3 ... 317 下一頁

    其他

    關於我  (About me)

    小額贊助

      文章 RSS Feed

      留言 RSS Feed

    Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


    創用 CC 授權條款
    本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.