首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 利用拼音首字母實現中文模糊搜尋:資料庫函數與 LINQ 整合實戰

     編輯:ASP.NET 基礎

前言:中文搜尋的挑戰與三種常見策略

在資料庫中實作中文模糊搜尋時,直接使用 LIKE '%關鍵字%' 無法針對拼音首字母進行查詢。常見解決方案有三種:

  1. 全撈後在記憶體轉換:效能極差,不建議採用。
  2. 新增拼音欄位:查詢快但增加儲存空間,維護成本高。
  3. 建立資料庫函數即時轉換:無需額外欄位,靈活且效能可接受(測試約為一般查詢 3 倍耗時),適合中小型專案。

核心方案:建立 T-SQL 拼音首字母轉換函數

利用 Unicode 範圍(19968~40869)判斷漢字,並對照內建對應表取得首字母:

CREATE FUNCTION dbo.fn_GetFirstLetterPy
(
    @str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
    DECLARE @word NCHAR(1), @py NVARCHAR(4000) = '';
    WHILE LEN(@str) > 0
    BEGIN
        SET @word = LEFT(@str, 1);
        SET @py = @py + 
            (CASE 
                WHEN UNICODE(@word) BETWEEN 19968 AND 40869
                THEN (SELECT TOP 1 PY FROM (
                    SELECT 'A' AS PY, N'驁' AS word UNION ALL SELECT 'B', N'簿' UNION ALL SELECT 'C', N'錯'
                    UNION ALL SELECT 'D', N'鵽' UNION ALL SELECT 'E', N'樲' UNION ALL SELECT 'F', N'鰒'
                    UNION ALL SELECT 'G', N'腂' UNION ALL SELECT 'H', N'夻' UNION ALL SELECT 'J', N'攈'
                    UNION ALL SELECT 'K', N'穒' UNION ALL SELECT 'L', N'鱳' UNION ALL SELECT 'M', N'旀'
                    UNION ALL SELECT 'N', N'桛' UNION ALL SELECT 'O', N'漚' UNION ALL SELECT 'P', N'曝'
                    UNION ALL SELECT 'Q', N'囕' UNION ALL SELECT 'R', N'鶸' UNION ALL SELECT 'S', N'蜶'
                    UNION ALL SELECT 'T', N'籜' UNION ALL SELECT 'W', N'鶩' UNION ALL SELECT 'X', N'鑂'
                    UNION ALL SELECT 'Y', N'韻' UNION ALL SELECT 'Z', N'咗'
                ) T WHERE word >= @word COLLATE Chinese_PRC_CS_AS_KS_WS ORDER BY PY ASC)
                ELSE @word
            END);
        SET @str = RIGHT(@str, LEN(@str) - 1);
    END
    RETURN @py;
END

資料庫層面的查詢應用

-- 搜尋標題拼音首字母包含 "zgr" 的文章
SELECT * FROM Articles WHERE dbo.fn_GetFirstLetterPy(Title) LIKE N'%zgr%';

LINQ to SQL 整合實作

  1. 在 .dbml 設計介面中,將資料表拖至左側,將此函數拖至右側(方法窗格)。
  2. DataContext 即會自動產生對應方法,可直接在 LINQ 查詢中呼叫:
using (var db = new DataClasses1DataContext())
{
    var q = from d in db.Documents
            where d.Title.Contains("zgr") || db.fn_GetFirstLetterPy(d.Title).Contains("zgr")
            select d;
    // 執行查詢...
}

效能考量與適用場景

  • 優點:零結構變更、維護簡單、支援即時拼音轉換。
  • 缺點:無法使用索引,全表掃描,大數據量(>10萬筆)會明顯拖慢查詢。
  • 建議:中小型專案、後台管理介面、內部系統可直接採用;大型高併發系統建議採用全文檢索引擎(如 Elasticsearch、SQL Server Full-Text Search)或預先計算拼音欄位並建立索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved