首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

基於 MySQL 全文索引構建搜尋引擎實戰:C 語言介面 + WCF 服務 + jQuery 前端完整架構

     編輯:MySQL 綜合教學

基於 MySQL 全文索引構建搜尋引擎實戰

本文記錄一個完整的輕量級全文搜尋引擎構建過程:後端採用 MySQL 5.6+ InnoDB 原生 Fulltext 索引 + C 語言 DLL 高效查詢,中間層以 C# WCF 服務暴露 JSON API,前端用 jQuery UI Autocomplete 實現即時搜尋建議與結果展示。

架構總覽

[瀏覽器 jQuery UI] 
      ↓ AJAX/JSON
[C# WCF Service (VisionWeb)] 
      ↓ P/Invoke
[C DLL (VisionDAL) + libmysql.dll] 
      ↓ MySQL Protocol
[MySQL 5.6 InnoDB Fulltext]

核心資料庫設計

CREATE TABLE `document` (
  `DocumentID` INT NOT NULL AUTO_INCREMENT,
  `Title` VARCHAR(255),
  `Text` TEXT,
  PRIMARY KEY (`DocumentID`),
  FULLTEXT KEY `ft` (`Title`, `Text`),      -- 全文搜尋索引
  FULLTEXT KEY `ftTitle` (`Title`)          -- 自動完成專用索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

關鍵點: InnoDB Fulltext 支援中文分詞 (需配置 ngram 解析器或 5.7+ 內建);建立兩個索引分離「全文檢索」與「標題補全」場景。

C 語言核心查詢邏輯 (VisionDAL.c)

1. 連接資料庫

MYSQL *Connect() {
  MYSQL *conn = mysql_init(NULL);
  if (!mysql_real_connect(conn, host, user, pass, db, port, NULL, 0)) return NULL;
  mysql_query(conn, "SET NAMES 'utf8'");
  return conn;
}

2. 動態構建 Boolean Mode 查詢


// 自動完成:僅搜 Title,回傳 Title + 分數
wsprintf(query, L"SELECT Title, MATCH(Title) AGAINST('%ls' IN BOOLEAN MODE) AS Score 
  FROM Document WHERE MATCH(Title) AGAINST('%ls' IN BOOLEAN MODE) > 0.001 
  ORDER BY Score DESC LIMIT 20", search, search);

// 全文搜尋:搜 Title+Text,回傳完整文檔
wsprintf(query, L"SELECT DocumentID, Title, Text, 
  MATCH(Title, Text) AGAINST('%ls' IN BOOLEAN MODE) AS Score 
  FROM Document WHERE MATCH(Title, Text) AGAINST('%ls' IN BOOLEAN MODE) > 0.001 
  ORDER BY Score DESC", search, search);

Boolean Mode 技巧: 支援 * 通配符 (如 as* 匹配 asp)、+ 必含、- 排除、"" 精確短語。

3. 結果集轉 JSON/文字輸出

使用 mysql_store_result + mysql_fetch_row 迭代,MultiByteToWideChar 處理 UTF-8 ↔ UTF-16 轉換,手動拼接 JSON 字串 (避免引入第三方庫)。

C# WCF 服務層 (VisionService.svc)

[ServiceContract]
public interface IVisionService {
  [OperationContract]
  [WebInvoke(Method="POST", BodyStyle=WebMessageBodyStyle.WrappedRequest, 
    RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)]
  string GetDocuments(string search, int format, int forAutocomplete);
}

public class VisionService : IVisionService {
  [DllImport("VisionDAL.dll", CharSet=CharSet.Unicode)]
  public static extern string GetDocuments(string search, int format, int forAutocomplete);
  // 直接透傳
}

Web.config 關鍵: webHttpBinding + webHttpEndpoint 啟用 REST/JSON;crossDomainScriptAccessEnabled 支援跨域。

前端頁面 (Default.html + jQuery)

自動完成初始化

$("#search").autocomplete({
  source: function(request, callback) {
    // 同步 AJAX 取建議詞
    $.ajax({ url: svcUrl, data: {search: term, format:1, forAutocomplete:1}, 
      async: false, success: function(json) { callback(JSON.parse(json)); } });
  }
});

搜尋按鈕點擊

$.ajax({ 
  type: 'POST', url: svcUrl, dataType: 'json',
  data: JSON.stringify({search: term + '*', format: 1, forAutocomplete: 0}),
  success: function(json) { renderTable(JSON.parse(json)); }
});

部署關鍵步驟 (Windows + IIS)

  1. 編譯 VisionDAL (x64, Release) → 產生 VisionDAL.dll。
  2. 將 VisionDAL.dll、libmysql.dll 目錄加入系統 PATH。
  3. IIS 建立應用程式池 (.NET 4.0, 64位)、網站指向 VisionWeb 目錄、綁定端口 8001。
  4. 確保 MySQL secure_file_priv、防火牆、local_infile 不干擾。

效能與擴展建議

  • 大數據量建議遷移至 Elasticsearch/Solr,MySQL Fulltext 適合中小型、結構化資料為主的場景。
  • 啟用 innodb_ft_min_token_size、ngram_token_size 優化中文分詞粒度。
  • 查詢緩存 (Redis) 前置熱門關鍵詞,減輕 DB 壓力。

專案結構參考: VisionDAL (C DLL) → VisionWeb (WCF) → Default.html (jQuery UI) → MySQL (InnoDB Fulltext)。完整代碼可作為企業內部知識庫、工單系統搜尋模組的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved