使用者輸入「關鍵字1 關鍵字2 關鍵字3」 (空格分隔),需在多個欄位 (標題、內容、作者、標籤...) 中**同時包含所有關鍵字** (AND 邏輯),每個關鍵字在任一欄位出現即符合 (OR 邏輯)。
<%
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 分鐘 | 高併發、熱門關鍵字集中 |
<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>