在Django项目开发中,中文搜索是一个常见需求,默认的搜索逻辑大多是基于关键词的精确匹配,无法理解中文的语义拆分,比如用户输入“机器学习教程”,默认的搜索可能无法匹配到包含“机器”“学习”“教程”分散出现的内容。Jieba作为成熟的中文分词工具,能够很好地解决这个问题,将用户输入的搜索词拆分成有意义的词汇,再结合Django的查询逻辑实现更精准的分词搜索。

环境准备与依赖安装
首先需要确保Django项目已经正常运行,之后安装Jieba库,执行以下命令:
pip install jieba
安装完成后可以在Django项目的虚拟环境中测试Jieba是否可用,比如在Python交互式终端中执行分词测试:
import jieba text = "Django Jieba分词搜索实现" result = jieba.lcut(text) print(result) # 输出: ['Django', ' ', 'Jieba', '分词', '搜索', '实现']
自定义Jieba分词工具类
为了方便在Django项目中反复调用分词逻辑,我们可以封装一个专门的分词工具类,放在项目的utils目录下:
import jieba
from django.conf import settings
class JiebaTokenizer:
def __init__(self):
# 可以加载自定义词典,比如项目相关的专业术语
# jieba.load_userdict(settings.BASE_DIR / "user_dict.txt")
pass
def cut_words(self, text):
"""对输入文本进行分词,返回分词后的列表"""
if not text:
return []
# 使用精确模式分词
words = jieba.lcut(text)
# 过滤掉长度小于2的无意义词汇和空字符串
filtered_words = [word.strip() for word in words if len(word.strip()) >= 2]
return filtered_words配置搜索视图逻辑
假设我们的项目有一个Article模型,包含title和content字段,需要实现针对这两个字段的分词搜索。首先在views.py中编写搜索视图:
from django.shortcuts import render
from django.db.models import Q
from .models import Article
from .utils.jieba_tokenizer import JiebaTokenizer
def article_search(request):
query = request.GET.get("q", "").strip()
results = []
if query:
# 初始化分词器
tokenizer = JiebaTokenizer()
# 对搜索词分词
keywords = tokenizer.cut_words(query)
if keywords:
# 构建查询条件,每个分词都作为查询条件,使用OR逻辑匹配
query_filter = Q()
for keyword in keywords:
query_filter |= Q(title__icontains=keyword) | Q(content__icontains=keyword)
results = Article.objects.filter(query_filter).distinct()
return render(request, "search_result.html", {"query": query, "results": results})这里的逻辑是先将用户输入的搜索词用Jieba拆分成多个关键词,然后每个关键词都去匹配文章的标题和内容,只要任意一个关键词匹配成功就返回该文章,同时使用distinct()方法避免重复结果。
配置URL路由
在项目的urls.py或者应用的urls.py中添加搜索路由:
from django.urls import path
from . import views
urlpatterns = [
path("search/", views.article_search, name="article_search"),
]前端搜索页面实现
首先在模板目录中创建search_result.html,实现搜索表单和结果展示:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>文章搜索</title>
</head>
<body>
<div class="search-container">
<form method="get" action="{% url 'article_search' %}">
<input type="text" name="q" placeholder="请输入搜索内容" value="{{ query }}">
<button type="submit">搜索</button>
</form>
</div>
<div class="result-container">
{% if query %}
<h3>搜索结果:{{ query }}</h3>
{% if results %}
<ul>
{% for article in results %}
<li>
<h4>{{ article.title }}</h4>
<p>{{ article.content|truncatechars:200 }}</p>
</li>
{% endfor %}
</ul>
{% else %}
<p>未找到相关内容</p>
{% endif %}
{% else %}
<p>请输入搜索关键词</p>
{% endif %}
</div>
</body>
</html>优化与扩展
以上实现的是基础的分词搜索功能,还可以根据需求做进一步优化:
- 可以引入自定义词典,把项目相关的专业术语加入Jieba的分词词库,提升分词准确性
- 如果数据量较大,可以结合Django的数据库索引或者Elasticsearch等搜索引擎提升查询效率
- 可以实现搜索结果按匹配度排序,比如同时匹配多个关键词的文章排在更前面
- 可以对搜索词做去重、停用词过滤,比如过滤掉“的”“了”等无意义词汇,减少无效查询
如果是简单的中小型项目,上述基础实现已经可以满足大部分中文分词搜索的需求,无需引入过于复杂的组件。