类维基页面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
相关产品推荐
相关产品推荐

