You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类维基页面Python搜索函数子字符串匹配结果异常问题排查

维基页面搜索功能匹配逻辑修复

问题描述

当前用于类维基页面的搜索函数,意图实现MD文件标题的子字符串部分匹配搜索,但存在匹配逻辑错误:输入无意义字符串(如bnfuiewbfuibewfuiw)时,仍会返回不符合预期的匹配结果(如['Django', 'Python', 'Git']),预期应为空列表。

原错误代码

def search_page(request):
    if request.method == "POST":
        searchQuery = request.POST.get('q')
        fetchEntry = util.get_entry(searchQuery)
        if fetchEntry == None:
            entries = util.list_entries()
            print(entries)
            print(searchQuery)
            queryMatches = []
            for i in searchQuery:
                for j in entries:
                    if(j.find(i) != -1 and j not in queryMatches):
                        queryMatches.append(j)
            print(queryMatches)          
            if len(queryMatches) >= 1:
                return render(request, "encyclopedia/search-page.html", {
                    "entries": queryMatches
                    })
            else:
                return render(request, "encyclopedia/404PageNotFound.html")
        else:
            return HttpResponseRedirect(f"/{searchQuery}")

问题根源

原逻辑错误地遍历了搜索词的每个单个字符,只要条目标题包含该字符,就将条目加入结果列表。例如搜索词bnfuiewbfuibewfuiw中包含'n'、'i'等字符,而这些字符分别存在于Django、Python、Git的标题中,导致这些条目被误判为匹配项。

修复方案

修改匹配逻辑,改为检查整个搜索词是否是条目标题的子字符串(若需要不区分大小写匹配,可统一转为小写后再判断):

def search_page(request):
    if request.method == "POST":
        searchQuery = request.POST.get('q')
        fetchEntry = util.get_entry(searchQuery)
        if fetchEntry is None:
            entries = util.list_entries()
            queryMatches = []
            # 遍历所有条目,检查搜索词是否是条目的子字符串(支持不区分大小写)
            for entry in entries:
                # 若需要精确大小写匹配,去掉.lower()即可
                if searchQuery.lower() in entry.lower():
                    queryMatches.append(entry)
            
            if queryMatches:
                return render(request, "encyclopedia/search-page.html", {
                    "entries": queryMatches
                })
            else:
                return render(request, "encyclopedia/404PageNotFound.html")
        else:
            return HttpResponseRedirect(f"/{searchQuery}")

说明

  • 修复后的逻辑会判断完整的搜索词是否出现在条目标题中,避免了单个字符匹配导致的误判
  • 加入了不区分大小写的匹配处理(可根据需求移除.lower()改为精确大小写匹配)
  • 简化了代码结构,去掉了冗余的循环和判断

内容的提问来源于stack exchange,提问作者ryokans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:30:54