」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 模糊匹配與三元組搜尋:在 Node.js 和 MySQL 中建立智慧搜尋

模糊匹配與三元組搜尋:在 Node.js 和 MySQL 中建立智慧搜尋

發佈於2024-11-09
瀏覽:404

Fuzzy Matching with Trigram Search: Building Intelligent Search in Node.js and MySQL

介紹
在現代應用程式中,高效的文字搜尋至關重要,尤其是在處理大型資料庫時。雖然 MySQL 提供了基本的全文搜尋功能,但在模糊匹配或處理拼字錯誤方面卻存在不足。這就是基於三元組的搜尋發揮作用的地方。在這篇部落格中,我們將探討什麼是三元組、它如何提高搜尋效能以及如何在 MySQL 中實現三元組搜尋。

什麼是卦象?
三元組是給定字串中三個連續字元的序列。例如,單字「search」可以分解為以下三元組:

  • 耳朵
  • rch 透過將單字分解為三元組,我們可以執行更靈活、更有效率的文字匹配,特別是在嘗試匹配不完整或輕微拼寫錯誤的術語時。

透過建立臨時表在MySQL中實現三元組搜尋

1.在MySQL資料庫中建立Trigram函數。三卦函數程式碼:

CREATE FUNCTION TRIGRAM_SEARCH(search_string VARCHAR(255), target_string VARCHAR(255)) 
RETURNS FLOAT
DETERMINISTIC
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE total_trigrams INT DEFAULT 0;
    DECLARE matched_trigrams INT DEFAULT 0;
    DECLARE search_length INT;
    DECLARE target_length INT;

    SET search_length = CHAR_LENGTH(search_string);
    SET target_length = CHAR_LENGTH(target_string);

    -- Handle edge cases where strings are too short
    IF search_length  0 THEN
        RETURN matched_trigrams / total_trigrams;
    ELSE
        RETURN 0;
    END IF;
END;

2.現在將所需列索引為全文

@Entity()
@Index(['title'], { fulltext: true })
export class Ebook extends BaseEntity {
  @PrimaryGeneratedColumn()
  ebookId: number;

  @Column({ nullable: true })
  title: string;
}

3.八字搜尋功能測試

select *
FROM ebook e 
WHERE TRIGRAM_SEARCH('physis onlu', e.title) > 0.4
ORDER BY TRIGRAM_SEARCH('physis onlu', e.title) desc;

4.在程式碼中實現三元組搜尋

 async find(title?: string) {
        const eBooks = await this.dataSource
      .getRepository(Ebook)
      .createQueryBuilder('eBook');
    if (title) {
      eBooks.where(`TRIGRAM_SEARCH(:title, eBook.title) > 0.4`, { title });
    }
    const result = await eBooks.getMany();
    return result;
  }

結論
Trigram 搜尋提供了一種在 MySQL 資料庫中實現模糊匹配的強大方法。透過將文字分解為三元組,我們可以執行更靈活和更寬容的搜索,從而極大地增強文字搜尋至關重要的應用程式中的使用者體驗。
雖然這種方法有其優點,但重要的是要根據您的特定用例和效能要求考慮 Levenshtein 距離或 soundex 演算法等替代方案。
透過實作三元組搜索,您可以顯著提高 Node.js 和 MySQL 應用程式的搜尋能力,為使用者提供更聰明、更寬容的搜尋結果。

版本聲明 本文轉載於:https://dev.to/mukesh_rajbanshi/fuzzy-matching-with-trigram-search-building-intelligent-search-in-nodejs-and-mysql-2839?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 以下是一些標題選項,請記住問題格式:

簡單直接:

* 如何用JavaScript動態調整輸入欄位寬度?
* 建立響應式輸入欄位:JavaScript So
    以下是一些標題選項,請記住問題格式: 簡單直接: * 如何用JavaScript動態調整輸入欄位寬度? * 建立響應式輸入欄位:JavaScript So
    動態調整輸入字段的寬度以適應其輸入動態調整輸入字段的寬度以匹配其內容長度可以增強用戶體驗防止佈局混亂。雖然設定固定寬度可能會導致多餘的空間或截斷文本,但動態方法可確保輸入欄位具有視覺吸引力和功能性。 不幸的是,使用 CSS 的 min-width 屬性來設定最小寬度不適用於輸入欄位。然而,現代瀏覽器...
    程式設計 發佈於2024-11-09
  • 如何使用 JavaScript 從 iFrame 重新導向父視窗?
    如何使用 JavaScript 從 iFrame 重新導向父視窗?
    從iFrame 重定向父視窗如果父視窗中嵌入了iFrame,則可能需要重定向父視窗視窗的位置更改為新的URL。為了實現這一點,JavaScript 提供了一個簡單的解決方案。 使用JavaScript 重新導向父視窗在iFrame 的JavaScript 程式碼中,您可以使用以下方法: 重定向最頂層...
    程式設計 發佈於2024-11-09
  • 如何使用 Curl 模擬 Web 瀏覽器的 GET 請求?
    如何使用 Curl 模擬 Web 瀏覽器的 GET 請求?
    使用Curl 模擬Web 瀏覽器的GET 請求嘗試使用curl 檢索網頁時,您可能會遇到似乎源於以下原因的錯誤無法辨識或未實現的請求標頭。這是因為curl本身並不會模擬網頁瀏覽器的GET請求標頭。 要正確模擬網頁瀏覽器,請依照下列步驟操作:設定使用者代理程式:使用CURLOPT_USERAGENT為...
    程式設計 發佈於2024-11-09
  • 透過「從參數中提取資訊」專案釋放您的 Python 能力
    透過「從參數中提取資訊」專案釋放您的 Python 能力
    您準備好將您的 Python 技能提升到新的水平了嗎? LabEx 提供的「從參數中提取資訊」專案就是您的最佳選擇。這個引人入勝的項目將引導您完成從給定文本中提取數字、計算平均值並將結果格式化為小數點後兩位的過程。潛入並釋放你作為 Python 程式設計師的真正潛力! 踏上令人興奮...
    程式設計 發佈於2024-11-09
  • HTML 表單中的預設提交按鈕行為是什麼?
    HTML 表單中的預設提交按鈕行為是什麼?
    確定HTML 表單中的預設提交按鈕在未按一下特定提交按鈕的情況下提交HTML 表單時,例如按輸入或在JavaScript 中使用HTMLFormElement.submit(),瀏覽器需要確定多個提交按鈕(如果有)中的哪一個應被視為按下的按鈕。此確定對於觸發 onclick 事件處理程序和傳送到 W...
    程式設計 發佈於2024-11-09
  • 如何在Python中實現非同步Shell指令執行:探索最佳實踐
    如何在Python中實現非同步Shell指令執行:探索最佳實踐
    Python 中的非同步Shell 指令執行:探索替代方法從Python 腳本非同步執行外部指令是一項有價值的技術,允許持續執行腳本當外部命令執行其任務時。本文探討了實現這種異步行為的適當方法,重點關注os.system() 和subprocess.Popen.os.system() 和& 符號 的...
    程式設計 發佈於2024-11-09
  • 狀態測試案例中的 ReactDOM.unstable_batchedUpdates。
    狀態測試案例中的 ReactDOM.unstable_batchedUpdates。
    在本文中,我們將研究 ReactDOM.unstable_batchedUpdates 在測試案例中的使用,特別是在 Zustand(React 的流行狀態管理庫)中。我們還將分解測試並解釋批次更新如何透過最小化不必要的重新渲染來增強 React 的效能。 理解測試案例 這是我們將...
    程式設計 發佈於2024-11-09
  • 如何使用 jQuery 和 CSS 建立響應式水平頁面滑動系統?
    如何使用 jQuery 和 CSS 建立響應式水平頁面滑動系統?
    響應式水平頁面滑動問題設計響應式水平導航系統面臨幾個挑戰:維護頁視窗內的可見性防止之間的間隙或重疊頁允許頁超出100%高度,並具有捲軸可見性確保與Internet Explorer 9 或更高版本的兼容性解決方案該解決方案採用jQuery 並包含以下主要功能:響應式調整大小:腳本根據頁數計算包裝器的...
    程式設計 發佈於2024-11-09
  • 為什麼編譯器中的「static_assert」與非型別模板參數的行為不同?
    為什麼編譯器中的「static_assert」與非型別模板參數的行為不同?
    編譯器中非型別模板參數的 static_assert 行為不一致 在 C 中,static_assert 在編譯時可驗證條件。然而,最近的觀察發現,當 static_assert 與不同編譯器中的非類型模板參數結合使用時,其行為存在差異。 具體來說,以下程式碼片段:template <int ...
    程式設計 發佈於2024-11-09
  • 何時以及如何在 JavaScript 的 parseInt() 函數中使用 Radix?
    何時以及如何在 JavaScript 的 parseInt() 函數中使用 Radix?
    了解 parseInt 中對基數的需求JavaScript 中的 parseInt() 函數可讓您將表示數字的字串轉換為整數。但是,您可能不會總是希望將整數解析為以 10 為基數的數字。這就是基數參數發揮作用的地方。 什麼是基數? 基數是指在數字系統中單一數字可以表示的值的數量。例如,我們常用的十進...
    程式設計 發佈於2024-11-09
  • 嘗試重載佇列構造函數
    嘗試重載佇列構造函數
    此專案旨在透過新增兩個新的建構子來改進 Queue 類別。 第一個建構子將從另一個現有佇列建立一個新佇列。 第二個建構子將允許您建立具有初始值的佇列。 這些建構子顯著提高了 Queue 類別的可用性。 1 建立一個名為 QDemo2.java 的文件,並將更新後的 Queue 類別從 Tr...
    程式設計 發佈於2024-11-09
  • 實施訂單處理系統:零件監控與警報
    實施訂單處理系統:零件監控與警報
    1. Introduction and Goals Welcome to the fourth installment of our series on implementing a sophisticated order processing system! In our pre...
    程式設計 發佈於2024-11-09
  • 以客戶端為中心的錯誤處理
    以客戶端為中心的錯誤處理
    了解和处理错误 为了有效地处理错误,必须了解可能发生的错误类型。让我们首先对您可能遇到的错误进行分类。 Web 客户端环境中的错误类型 网络错误 连接问题:与服务器建立连接时出现问题。 超时:请求花费太长时间才能收到响应。 DNS 错误:域名解析问题...
    程式設計 發佈於2024-11-09
  • 如何在Python中高效率計算目錄大小?
    如何在Python中高效率計算目錄大小?
    使用 Python 進行目錄大小計算為了測量目錄的空間佔用情況,Python 提供了幾種方法。以下我們深入探討一個高效率、全面的解決方案:import os def directory_size(start_path): total_size = 0 for root, direct...
    程式設計 發佈於2024-11-09
  • 如何修復Go模組導入過時的套件版本?
    如何修復Go模組導入過時的套件版本?
    Go 模組匯入過時的套件版本嘗試使用Go 模組將新套件合併到專案時,您可能會遇到以下問題:儘管該套件被標記為“最新”,但模組系統會檢索該套件的過時版本。這個過時的版本可能缺少程式碼所需的功能,從而導致編譯或執行時錯誤。 解決方案:在 go.mod 檔案中指定版本Go 模組系統可讓您指定要匯入的套件的...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3