欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索

程序员文章站 2022-06-27 21:54:00
先上效果图 附上个人网站: "https://liyuankun.cn" 安装依赖库 注意:这里我们不安装django haystack,因为要添加中文分词的功能很麻烦,所以我直接集成了一个中文的django haystack包 下载地址: "https://github.com/PythonerK ......

先上效果图

Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索
附上个人网站:

安装依赖库

注意:这里我们不安装django-haystack,因为要添加中文分词的功能很麻烦,所以我直接集成了一个中文的django-haystack包

下载地址:https://github.com/pythonerkk/django-haystack-chinese/

pip安装whoosh和jieba:

pip install whoosh jieba

项目配置

新建一个名为extra_apps的目录,把django-haystack包复制进去:
Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索

把extra_apps目录设置为项目搜索根目录,修改settings.py文件

import sys

base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(base_dir, 'extra_apps'))

添加到install_app中,修改settings.py文件

installed_apps = [
    ...
    'haystack',
]

继续修改settings.py,添加haystack配置项

haystack_connections = {
    'default': {
        'engine': 'haystack.backends.whoosh_cn_backend.whooshengine',
        'path': os.path.join(base_dir, 'whoosh_index'),
    }
} # 每页显示搜索结果数目为10
haystack_search_results_per_page = 10
# 自动生成索引
haystack_signal_processor = 'haystack.signals.realtimesignalprocessor'

然后在项目的urls.py中加入:

urlpatterns = [
    ...
    path('search/', include('haystack.urls'))
]

集成到自己的app中

在自己的app中添加search_indexes.py文件
Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索

search_indexes.py文件内容

from haystack import indexes
from .models import post


class ideaindex(indexes.searchindex, indexes.indexable):
    text = indexes.charfield(document=true, use_template=true)

    def get_model(self):
        # 这里修改成你自己的数据库模型
        return post

    def index_queryset(self, using=none):
        return self.get_model().objects.all()

在templates文件下新增一个目录search/indexes/(你的app名)/(你的app名)_text.txt:
Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索

xxx_text.txt这里填写要搜索的字段名称

{{ object.title }}
{{ object.content }}

添加后修改search.html

<!doctype html>
<html>
<head>
    <title></title>
</head>
<body>
{% if query %}
    <h3>搜索结果如下:</h3>
    {% for result in page.object_list %}
        <a href="/jiablog/article/{{ result.object.id }}/">{{ result.object.title }}</a><br/>
    {% empty %}
        <p>啥也没找到</p>
    {% endfor %}
 
    {% if page.has_previous or page.has_next %}
        <div>
            {% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; 上一页{% if page.has_previous %}</a>{% endif %}
        |
            {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}下一页 &raquo;{% if page.has_next %}</a>{% endif %}
        </div>
    {% endif %}
{% endif %}
</body>
</html>

关键字高亮

这个非常简单,直接在模板中引入如下字段即可
search.html

{% load highlight %}
<style>
    span.highlighted {
        color: red;
    }
</style>

...
{% highlight query with xxx.object.title %}

如上所示,query就是代表搜索关键字,只需要一句代码就可以完成高亮

重建索引

按照上述步骤,应该就能成功了,接下来我们来重建索引

python manage.py rebuild_index

运行后选择y,然后就会提示建立索引成功
Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索

注意事项

Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索

这里必须严格按照这个结构创建,需要注意.txt文件名要全部小写!!

效果图

Django全文搜索django-haystack+whoosh+jieba实现中文全文搜索