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

ASP 多關鍵字搜尋實作:動態陣列建構 WHERE 條件與參數化查詢

     編輯:ASP 相關知識

需求分析

使用者輸入「關鍵字1 關鍵字2 關鍵字3」 (空格分隔),需在多個欄位 (標題、內容、作者、標籤...) 中**同時包含所有關鍵字** (AND 邏輯),每個關鍵字在任一欄位出現即符合 (OR 邏輯)。

核心演算法

  1. 分割關鍵字字串 → 陣列。
  2. 過濾空白項目。
  3. 對每個關鍵字產生 `(col1 LIKE ? OR col2 LIKE ? OR ...)` 片段。
  4. 以 `AND` 串接所有片段。
  5. 收集參數值陣列,交給參數化查詢執行。

完整實作 (含參數化防注入)

<%
Function BuildMultiKeywordSQL(baseSQL, keywordStr, fieldList, ByRef params)
    ' baseSQL: "SELECT * FROM Articles WHERE Status = 1"
    ' keywordStr: "asp 教學 入門"
    ' fieldList: Array("Title", "Content", "Author", "Tags")
    ' params: 輸出參數值陣列,供 Command.Parameters 使用
    
    Dim kwArr, kw, f, whereParts, paramList, i, j
    kwArr = Split(Trim(keywordStr))
    ReDim whereParts(-1)
    ReDim paramList(-1)
    
    For i = 0 To UBound(kwArr)
        kw = Trim(kwArr(i))
        If kw <> "" Then
            ReDim Preserve whereParts(UBound(whereParts) + 1)
            ReDim Preserve paramList(UBound(paramList) + 1)
            
            Dim orParts
            ReDim orParts(UBound(fieldList))
            For j = 0 To UBound(fieldList)
                orParts(j) = fieldList(j) & " LIKE ?"
                paramList(UBound(paramList)) = "%" & kw & "%"  ' 同一關鍵字所有欄位用同一參數值
            Next
            whereParts(UBound(whereParts)) = "(" & Join(orParts, " OR ") & ")"
        End If
    Next
    
    If UBound(whereParts) >= 0 Then
        baseSQL = baseSQL & " AND " & Join(whereParts, " AND ")
    End If
    
    params = paramList
    BuildMultiKeywordSQL = baseSQL
End Function

' --- 使用範例 ---
Dim sql, params, cmd, rs
sql = "SELECT ArticleID, Title, Author, CreateDate FROM Articles WHERE Status = 1"
sql = BuildMultiKeywordSQL(sql, Request.QueryString("kw"), Array("Title", "Content", "Author"), params)

Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = GetConn()
cmd.CommandText = sql
cmd.CommandType = 1

Dim pVal
For Each pVal In params
    cmd.Parameters.Append cmd.CreateParameter("@kw", 200, 1, 8000, pVal)
Next

Set rs = cmd.Execute
' 輸出結果...
%>

進階:支援精確匹配、排除、欄位指定

擴充關鍵字語法:

  • +asp:必須包含 (預設 AND 邏輯已滿足)。
  • -php:排除包含「php」的文章 → `AND Content NOT LIKE '%php%'`。
  • title:asp:僅搜尋標題欄位。
Function ParseAdvancedKeywords(kwStr, ByRef includeArr, ByRef excludeArr, ByRef fieldMap)
    ' 解析 + - field: 語法,回傳結構化陣列供 SQL 建構使用
    ' 實作略...
End Function

效能優化建議

策略說明適用場景
全文檢索引擎SQL Server Full-Text Search、Elasticsearch、Lucene.NET資料量 > 10 萬筆、需相關性排序、模糊匹配
觸發器維護關鍵字表Insert/Update 時拆解關鍵字存入 Keywords 表,查詢改 JOIN中型資料量、固定欄位、即時性要求高
LIKE 索引優化避免前置萬用字元 `%kw%`,改用 `kw%` (需業務配合)資料量 < 5 萬、單欄位搜尋
快取熱門搜尋結果Application/Cache 物件快取前 100 熱門關鍵字結果 5 分鐘高併發、熱門關鍵字集中

前端整合:AJAX 即時建議

<input type="text" id="kw" placeholder="輸入關鍵字,空格分隔">
<script>
$("#kw").on("input", function() {
    var val = $(this).val();
    if (val.length >= 2) {
        $.getJSON("/ajax/suggest.asp", {q: val}, function(data) {
            // 顯示下拉建議...
        });
    }
});
</script>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved